function [ classification ] = SVM_L( train,test )
% 进行SVM线性可分的二分类处理
% 1、首先需要一组训练数据train,并且已知训练数据的类别属性,在这里,属性只有两类,并用1,2来表示。
% 2、通过svmtrain(只能处理2分类问题)函数,来进行分类器的训练
% 3、通过svmclassify函数,根据训练后获得的模型svm_struct,来对测试数据test进行分类
%%
N1=20;
train = zeros(40,2);
test = zeros(6,2);
for i=1:N1
x1(1,i)=-1.7+1.1*randn(1); % 1类440个训练样本,2维正态分布
x1(2,i)= 1.6+0.9*randn(1);
%x1(3,i)= 1;
end;
x5=x1';
N2=20;
for i=1:N2
x2(1,i)= 1.3+1.0*randn(1); % 2类400个训练样本,2维正态分布
x2(2,i)=-1.5+0.8*randn(1);
%x2(3,i)= -1;
end;
x6=x2';
for i=1:1:20
train(i,:)=x5(i,:);
end
for i=1:1:20
train(i+20,:)=x6(i,:);
end
for i=1:1:3
test(i,:)=x5(i,:);
end
for i=1:1:3
test(i+3,:)=x6(i,:);
end
group=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]'; %训练数据已知分类情况
%train=[0 0;2 4;3 3;3 4;4 2;4 4;4 3;5 3;6 2;7 1;2 9;3 8;4 6;4 7;5 6;5 8;6 6;7 4;8 4;10 10]; %训练数据点
%group=[1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]'; %训练数据已知分类情况 %与train顺序对应
%test=[3 2;4 8;6 5;7 6;2 5;5 2]; %测试数据
%训练分类模型
svmModel = svmtrain(train,group,'kernel_function','linear','showplot',true);
%分类测试
classification=svmclassify(svmModel,test,'Showplot',true);
N1=10;
for i=1:N1
x1(1,i)=-1.7+1.1*randn(1); % 1类440个训练样本,2维正态分布
x1(2,i)= 1.6+0.9*randn(1);
%x1(3,i)= 1;
end;
N2=8;
for i=1:N2
x2(1,i)= 1.3+1.0*randn(1); % 2类400个训练样本,2维正态分布
x2(2,i)=-1.5+0.8*randn(1);
%x2(3,i)= 1;
end;
%%
w(1)=rand(1); % 1*1,给权向量赋一个随机值 % 感知机算法
w(2)=rand(1); % 2*2矩阵
w(3)=rand(1); % 3*3矩阵
p=0.001; %这个会影响 w的修正速率,即 学习速率
for j=1:20 %<<<
k=0;
n(j)=j;
for i = 1:N1
xe=x1(:,i); % xe=x1(:,i)的作用就是把矩阵x1的第i列取出来赋值到xe里面,得到的xe就是一个 列向量
if(w*xe<0) % w*xe<0,是错误判断的条件,即本来应该是 w*xe>0
w=w+p*xe';% y=x'表示将x的转置赋值给y;错误分类后要 修正 权向量w ,这里是增大w的值,直到w*xe>0
k=k+1; % 错误分类的个数
end;
end;
for i=1:N2
xe=x2(:,i);
if(w*xe>0)
w=w-p*xe';
k=k+1;
end;
end;
en(j)=k;
end;
subplot(2,2,1); %图1
plot(classification);
%plot(n,en);
t1=-5:1:5;
t2=(-w(1)*t1-w(3))/w(2);%?????
%title(' p=0.001');
subplot(2,2,2); %图2
plot(x1(1,:),x1(2,:),'*',x2(1,:),x2(2,:),'o',t1,t2,'r');
axis([-5 5 -5 5]);
title('感知机');
%%
for i=1:N1 % 最小二乘法
x(1,i)=x1(1,i);
x(2,i)=x1(2,i);
x(3,i)=x1(3,i);
y(i)=1;
end;
for i=(N1+1):(N1+N2)
x(1,i)=x2(1,(i-N1));
x(2,i)=x2(2,(i-N1));
x(3,i)=x2(3,(i-N1));
y(i)=-1;
end;
w=inv(x*x')*x*y'; % inv是矩阵求逆,x*x'求出自相关矩阵,x*y'求出期望输出和输入特征向量的互相关,w是权向量估计值
s1=-5:1:5;
s2=(-w(1)*t1-w(3))/w(2);
for i=1:N1
y(i)=N2/(N1+N2);
end;
for i=(N1+1):(N1+N2)
y(i)=-N1/(N1+N2);
end;
w=inv(x*x')*x*y';
s3=-5:1:5;
s4=(-w(1)*t1-w(3))/w(2);
%%
subplot(2,2,3); %图3
plot(x1(1,:),x1(2,:),'*',x2(1,:),x2(2,:),'o',s1,s2,'g',s3,s4,'b');
axis([-5 5 -5 5]);
title(' 最小二乘法');
subplot(2,2,4); %图4 感知机最小二乘法比较
plot(x1(1,:),x1(2,:),'*',x2(1,:),x2(2,:),'o',t1,t2,'r',s1,s2,'g',s3,s4,'b');
axis([-5 5 -5 5]);
title('感知机最小二乘法比较');
end
评论0