%Preceptron3.m
%感知机算法(对偶形式)
%f(X)=W'*X+b
%f([X;1])=[W;b]'*[X;1] 增加维数,简化计算
%设W初始为0时,权重W是训练点的线性组合:W=Σaj*yj*Xj
%类别yi决定了Xi的系数,ai>=0,正比于被误分后权重更新的次数,可看作Xi信息量的指示
%误分判据 yi*((W'*Xi)+b)<=0变为:yi*(Σaj*yj*(Xj'*Xi)+b)<=0,ai=ai+1,b=b+yi*R^2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%可推广到多类判据:每类找(Wi,bi),决策函数c(X)=arg max(<Wi.X>+bi),值最大的即是类(Wi,bi)
%从几何角度,意味着距超平面(Wi,bi)最远的点的类与(Wi,bi)相关联!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%非线性空间分类
function Preceptron3()
%struTemp=struct('Element',[-1,1,1]','Sample',1);
%Msample=[struTemp,struTemp]';
M=[3,3;-3,3;-3,-3;3,-3;3,0]';%原空间点,通常称为属性
N=[1,1;-1,1;-1,-1;1,-1;1,0]';
Msample=[M.^2;sqrt(2)*M(1,:).*M(2,:)];%由(x1,x2)'->(x1^2,x2^2,x1*x2)映射到线性空间(寻找特征);特征正数据点
%yM=1;%类别
Nsample=[N.^2;sqrt(2)*N(1,:).*N(2,:)];%特征负数据点
%yN=2;
RM2=max([max(Msample'*Msample)]);%样本圆半径平方
RN2=max([max(Nsample'*Nsample)]);%样本圆半径平方
R2=18;%60;%max(RM2,RN2);
lenM=length(Msample(1,:));
lenN=length(Nsample(1,:));
aMi=zeros(lenM,1);
aNi=zeros(lenN,1);
WM=Msample*aMi;
WN=Nsample*aNi;
bM=0;
bN=0;
%W=[Msample,Nsample]*ai;%初始化Super Plane方向、节距=权重w、阀值b(神经元),圆点距超平面b/||w||
k=1;%试错次数&
num=0;%循环次数
while k~=0 && num<10
k=0;
num=num+1;
for i=1:lenM
if (WM'*Msample(:,i)+bM)-(WN'*Msample(:,i)+bN)<=0 %找Msample的超平面(WM,bM),若Msample距(WM,bM)非最远,则分类错误!
aMi(i)=aMi(i)+1;%当分错,对应的ai+1
bM=bM+R2;
k=k+1;
WM=Msample*aMi;
end
end
if num>=10
msgbox('Msample没找到超平面!');
end
%end %%%%%%%%%%%%%%%%%%%%%%%%2013.1.17 by lijilin
%k=1;
%num=0;
%while k~=0 && num<10%%%%%%%%%%%%%2013.1.17 by lijilin
%k=0;
%num=num+1;
for i=1:lenN
if (WN'*Nsample(:,i)+bN)-(WM'*Nsample(:,i)+bM)<=0 %找Nsample的超平面
aNi(i)=aNi(i)+1;%当分错,对应的ai+1
bN=bN+R2;
k=k+1;
WN=Nsample*aNi;
end
end
if num>=10
msgbox('Nsample没找到超平面!');
end
end
plot3(Msample(1,:)',Msample(2,:)',Msample(3,:)','X',Nsample(1,:)',Nsample(2,:)',Nsample(3,:)','o');
grid on;
hold on;
W=WM-WN;%Msample与NSample分界面
b=bM-bN;
%plot3([0,W(1)],[0,W(2)],[0,W(3)]);%绘制超平面向量
vec_d=abs(b)/(W'*W)*W;
plot3([0,vec_d(1)],[0,vec_d(2)],[0,vec_d(3)],'r');%绘制原点到超平面距离向量<x.d>=<d.d>=dd
%d1*x1^2+d2*x2^2+d3*x1x2-dd=0 原二维空间的点(x1,x2)带入特征三维空间的超平面方程(X-d)'*d=0中
%显然三维空间的面对应于原二维空间的椭圆线!!!
d=vec_d;
dd=d'*d;
x1=-2:0.1:2;
A=d(2);
B=d(3)*x1;
C=d(1)*x1.^2-dd;
x21=(-B+sqrt(B.^2-4*A.*C))/(2*A);
x22=(-B-sqrt(B.^2-4*A.*C))/(2*A);
%%%%%%%%%%%%%%%%%%%%%
x2=-2:0.1:2;
A=d(1);
B=d(3)*x2;
C=d(2)*x2.^2-dd;
x11=(-B+sqrt(B.^2-4*A.*C))/(2*A);
x12=(-B-sqrt(B.^2-4*A.*C))/(2*A);
figure;
plot([x1',x1',x11',x12'],[x21',x22',x2',x2']);
hold on
plot(M(1,:)',M(2,:)','X',N(1,:)',N(2,:)','o');