支持向量机(SVM)算法的matlab的实现

⽀持向量机(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
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    -11    -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([-38 -38]);
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个属性的情况;当我们的样本⽤多个属性时,我们需要修改部分代码即可。

本文发布于:2024-09-22 03:31:30,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/569913.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:训练   函数   波形   样本   样例   个数   实现   属性
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议