支持向量机(SVM)算法的matlab的实现
支持向量机(SVM)的matlab的实现
支持向量机是一种分类算法之中的一个,matlab中也有对应的函数来对其进行求解;以下贴一个小例子。这个例子来源于我们实际的项目。
clc;
clear;
N=10;
%以下的数据是我们实际项目中的训练例子(例子中有8个属性)
correctData=[0,0.2,0.8,0,0,0,2,2];
errorData_ReversePharse=[1,0.8,0.2,1,0,0,2,2];
errorData_CountLoss=[0.2,0.4,0.6,0.2,0,0,1,1];
errorData_X=[0.5,0.5,0.5,1,1,0,0,0];
errorData_Lower=[0.2,0,1,0.2,0,0,0,0];
errorData_Local_X=[0.2,0.2,0.8,0.4,0.4,0,0,0];
errorData_Z=[0.53,0.55,0.45,1,0,1,0,0];
errorData_High=[0.8,1,0,0.8,0,0,0,0];
errorData_CountBefore=[0.4,0.2,0.8,0.4,0,0,2,2];
errorData_Local_X1=[0.3,0.3,0.7,0.4,0.2,0,1,0];
sampleData=[correctData;errorData_ReversePharse;errorData_CountLoss;errorData_X;errorData_Lower;errorData_Local_X;errorData_Z;errorData_High;errorData_CountBefore;errorData_Local_X1];%训练例子
type1=1;%正确的波形的类别,即我们的第一组波形是正确的波形,类别号用 1 表示
type2=-ones(1,N-2);%不对的波形的类别,即第2~10组波形都是有故障的波形。类别号用-1表示
groups=[type1 ,type2]';%训练所需的类别号
j=1;
%由于没有測试数据,因此我将错误的波形数据轮流从训练例子中取出作为測试例子
for i=2:10
tempData=sampleData;
tempData(i,:)=[];
svmStruct = svmtrain(tempData,groups);
species(j) = svmclassify(svmStruct,sampleData(i,:));
j=j+1;
end
species
输出结果例如以下:
-1 -1 -1 -1 -1 -1 -1 1 -1
从结果能够看出:仅仅有第九个被误判。其他的都是正确的。
上面仅仅是用于说明matlab中支持向量机中函数的使用方法,由于在训练集中我仅仅用了一个正确的波形和九组有故障的波形作为训练集,因此这样的超平面的选取可能不好。可是,在我们的实际的项目中,我们是用到了很多的训练集的。
上面是调用matlab中的函数实现多维属性中的支持向量机对其进行分类。
以下是自己实现此功能,不调用matlab中的支持向量机的函数。代码例如以下:
%主函数
clear all;
clc;
C = 10;
kertype = 'linear';
%训练样本
n = 50;
randn('state',6);%能够保证每次每次产生的随机数一样
x1 = randn(2,n); %2行N列矩阵
y1 = ones(1,n); %1*N个1
x2 = 5+randn(2,n); %2*N矩阵
y2 = -ones(1,n); %1*N个-1
figure;
plot(x1(1,:),x1(2,:),'bx',x2(1,:),x2(2,:),'k.');
axis([-3 8 -3 8]);
xlabel('x轴');
ylabel('y轴');
hold on;
X = [x1,x2]; %训练样本d*n矩阵。n为样本个数,d为特征向量个数。在这里。X为一个2*100的数组
Y = [y1,y2]; %训练目标1*n矩阵,n为样本个数,值为+1或-1。在这里,Y为一个1*100的数组
svm = svmTrain(X,Y,kertype,C);
plot(svm.Xsv(1,:),svm.Xsv(2,:),'ro');
%測试
[x1,x2] = meshgrid(-2:0.05:7,-2:0.05:7); %x1和x2都是181*181的矩阵
[rows,cols] = size(x1);
nt = rows*cols;
Xt = [reshape(x1,1,nt);reshape(x2,1,nt)];
Yt = ones(1,nt);
result = svmTest(svm, Xt, Yt, kertype);
Yd = reshape(result.Y,rows,cols);
contour(x1,x2,Yd,'m');
训练集函数例如以下:
function svm = svmTrain(X,Y,kertype,C)
options = optimset; % Options是用来控制算法的选项參数的向量
options.LargeScale = 'off';%LargeScale指大规模搜索。off表示在规模搜索模式关闭
options.Display = 'off';%这样设置意味着没有输出
n = length(Y);%数组Y的长度
H = (Y'*Y).*kernel(X,X,kertype);%调用kernel函数。
f = -ones(n,1); %f为1*n个-1,f相当于Quadprog函数中的c
A = [];
b = [];
Aeq = Y; %相当于Quadprog函数中的A1,b1
beq = 0;
lb = zeros(n,1); %相当于Quadprog函数中的LB,UB
ub = C*ones(n,1);
a0 = zeros(n,1); % a0是解的初始近似值
[a,fval,eXitflag,output,lambda] = quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);
epsilon = 1e-8;
sv_label = find(abs(a)>epsilon); %0<a<a(max)则觉得x为支持向量
svm.a = a(sv_label);
svm.Xsv = X(:,sv_label);
svm.Ysv = Y(sv_label);
svm.svnum = length(sv_label);
%svm.label = sv_label;
核函数例如以下:
function K = kernel(X,Y,type)
%X 维数*个数
switch type
case 'linear'
K = X'*Y;
case 'rbf'
delta = 5;
delta = delta*delta;
XX = sum(X'.*X',2);%sum(a,2)代码中參数2的意思是将a矩阵a中的按“行”为单位进行求和
YY = sum(Y'.*Y',2);
XY = X'*Y;
K = abs(repmat(XX,[1 size(YY,1)]) + repmat(YY',[size(XX,1) 1]) - 2*XY);
K = exp(-K./delta);
end
測试函数例如以下
function result = svmTest(svm, Xt, Yt, kertype)
temp = (svm.a'.*svm.Ysv)*kernel(svm.Xsv,svm.Xsv,kertype);
total_b = svm.Ysv-temp;
b = mean(total_b);
w = (svm.a'.*svm.Ysv)*kernel(svm.Xsv,Xt,kertype);
result.score = w + b;
Y = sign(w+b);
result.Y = Y;
result.accuracy = size(find(Y==Yt))/size(Yt);
要说明的是。上面的代码是实现的关于我们样本仅仅有2个属性的情况。当我们的样本用多个属性时,我们须要改动部分代码就可以。
支持向量机(SVM)算法的matlab的实现的更多相关文章
- 一步步教你轻松学支持向量机SVM算法之案例篇2
一步步教你轻松学支持向量机SVM算法之案例篇2 (白宁超 2018年10月22日10:09:07) 摘要:支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于 ...
- 一步步教你轻松学支持向量机SVM算法之理论篇1
一步步教你轻松学支持向量机SVM算法之理论篇1 (白宁超 2018年10月22日10:03:35) 摘要:支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于 ...
- 4、2支持向量机SVM算法实践
支持向量机SVM算法实践 利用Python构建一个完整的SVM分类器,包含SVM分类器的训练和利用SVM分类器对未知数据的分类, 一.训练SVM模型 首先构建SVM模型相关的类 class SVM: ...
- 机器学习:Python中如何使用支持向量机(SVM)算法
(简单介绍一下支持向量机,详细介绍尤其是算法过程可以查阅其他资) 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类(异 ...
- 支持向量机(SVM)算法
- 机器学习算法 - 支持向量机SVM
在上两节中,我们讲解了机器学习的决策树和k-近邻算法,本节我们讲解另外一种分类算法:支持向量机SVM. SVM是迄今为止最好使用的分类器之一,它可以不加修改即可直接使用,从而得到低错误率的结果. [案 ...
- 机器学习集成算法--- 朴素贝叶斯,k-近邻算法,决策树,支持向量机(SVM),Logistic回归
朴素贝叶斯: 是使用概率论来分类的算法.其中朴素:各特征条件独立:贝叶斯:根据贝叶斯定理.这里,只要分别估计出,特征 Χi 在每一类的条件概率就可以了.类别 y 的先验概率可以通过训练集算出 k-近邻 ...
- 转:机器学习中的算法(2)-支持向量机(SVM)基础
机器学习中的算法(2)-支持向量机(SVM)基础 转:http://www.cnblogs.com/LeftNotEasy/archive/2011/05/02/basic-of-svm.html 版 ...
- SVM算法实现(一)
关键字(keywords):SVM 支持向量机 SMO算法 实现 机器学习 假设对SVM原理不是非常懂的,能够先看一下入门的视频,对帮助理解非常实用的,然后再深入一点能够看看这几篇入门文章,作者写得挺 ...
随机推荐
- 函数buf_LRU_get_free_block
/******************************************************************//** Returns a free block from th ...
- 根据block取出页号buf_block_get_page_no
/*********************************************************************//** Gets the page number of a ...
- javascript 一些需要知道的东西
这里我直接贴出代码,注释已经补全,欢迎指正: <script type="text/javascript"> /** 1,js中一切皆是对象,函数也是, 2,当定义变量 ...
- SQL SERVER 2000 & SQL SERVER 2005 数据缓存依赖
一.SQL SERVER 7.0/2000和SQL SERVER 2005的简介及比较 1.1 SQL SERVER 7.0/2000 SQL SERVER 7.0/2000没有提供内置的支持 ...
- Hibernate解决高并发问题之:悲观锁 VS 乐观锁
高并发问题是程序设计所必须要解决的问题,解决此类问题最主要的途径就是对对程序进行加锁控制.hibernate对加锁机制同样做出了实现,常用加锁方式为悲观锁和乐观锁.悲观锁指的是对数据被外界(包括本系统 ...
- MVC的EF编辑,不用查询直接修改
EF中会为每个 管理的 实体对象 创建一个代理包装类对象,其中会跟踪 实体对象 的状态和每个属性的状态: 一.通常使用EF更新的方式,先查询出要修改的数据,然后再修改新的值:实体对象被修改的属性 在 ...
- HDU 5317 RGCDQ
题意:f(i)表示i的质因子个数,给l和r,问在这一区间内f(i)之间任意两个数最大的最大公倍数是多少. 解法:先用筛法筛素数,在这个过程中计算f(i),因为f(i)不会超过7,所以用一个二维数组统计 ...
- [Tommas] 测试场景 VS 测试用例 哪个更好?(转)
分享一篇网上别人的感悟: 6年前,我在一家中型跨国公司工作的时候,我建议与其浪费时间在准备充分的测试用例,还不如编写描述测试场景的文档.所有的人都对我的建议.投以烦恼的目光.他们的脸上清晰地 ...
- 《Oracle Database 12c DBA指南》第一章 - 基本技能简介
当前关于12c的中文资料比较少,本人将关于DBA的一部分官方文档翻译为中文,很多地方为了帮助中国网友看懂文章,没有按照原文句式翻译,翻译不足之处难免,望多多指正. 1 基本技能简介 作为一个数据库管理 ...
- js基础第二天
函数:是由事件驱动的或者当它被调用时执行的可以重复使用的代码块. 函数声明: 1. 自定义函数(常用) var num=10; function fun() { alert("我是自定义函数 ...