%Preceptron4.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)相关联!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%非线性空间分类
%利用核函数完成分类算法 2013.1.17 by lijilin
function Preceptron4()
%struTemp=struct('Element',[-1,1,1]','Sample',1);
%Msample=[struTemp,struTemp]';
Msample=[3,3;-3,3;-3,-3;3,-3;3,0]';%原空间点,通常称为属性
Nsample=[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)]);%样本圆半径平方 ???原属性空间的R^2、b直接用到特征空间??? 2013.1.17 by lijilin
RN2=max([max(Nsample'*Nsample)]);%样本圆半径平方 ???原属性空间的R^2、b直接用到特征空间??? 2013.1.17 by lijilin
R2=324;%max(RM2,RN2);
lenM=length(Msample(1,:));
lenN=length(Nsample(1,:));
aMi=zeros(lenM,1);
aNi=zeros(lenN,1);
%WM=Msample*aMi; 2013.1.17 by lijilin
%WN=Nsample*aNi; 2013.1.17 by lijilin
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)非最远,则分类错误!
KMfun=dot(Msample,repmat(Msample(:,i),1,size(Msample,2)));%核函数size(Msample,2)=lenM 2013.1.17 by lijilin
KMfun=KMfun.^2;%当(x1,x2)'->(x1^2,x2^2,sqrt(2)*x1*x2)映射到线性特征空间时,特征空间的向量内积=原属性空间向量内积的平方
%故用核函数可以直接在原属性空间求解决策函数,而不需考虑映射!!! 2013.1.17 by lijilin
KNfun=dot(Nsample,repmat(Msample(:,i),1,size(Nsample,2)));
KNfun=KNfun.^2;
if(KMfun*aMi+bM)-(KNfun*aNi+bN)<=0 %!!!!!!2013.1.17 by lijilin
aMi(i)=aMi(i)+1;%当分错,对应的ai+1
bM=bM+R2;
k=k+1;
%WM=Msample*aMi; 2013.1.17 by jilin
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的超平面
KMfun=dot(Msample,repmat(Nsample(:,i),1,size(Msample,2)));
KMfun=KMfun.^2;
KNfun=dot(Nsample,repmat(Nsample(:,i),1,size(Nsample,2)));
KNfun=KNfun.^2;
if(KNfun*aNi+bN)-(KMfun*aMi+bM)<=0 %!!!!!!2013.1.17 by lijilin
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
%W=WM-WN;%Msample与NSample分界面
%b=bM-bN;
%M_NPBfun=(KMfun*aMi+bM)-(KNfun*aNi+bN)=0为分类超平面,由于采用隐式映射,无法直接反求属性空间分类面!!; 2012.1.17 by lijilin
t=-1.5:0.1:1.5;
x21=t;
x22=t;
syms x2
for i=1:length(t)
x1=t(i);
KMfun=dot(Msample,repmat([x1;x2],1,size(Msample,2)));
KMfun=KMfun.^2;
KNfun=dot(Nsample,repmat([x1;x2],1,size(Nsample,2)));
KNfun=KNfun.^2;
sfun=(KMfun*aMi+bM)-(KNfun*aNi+bN);
s=solve_sym(sfun);
x21(i)=eval(s(1));
x22(i)=eval(s(2));
end
%plot([x1',x1',x11',x12'],[x21',x22',x2',x2']);
figure
plot([t',t'],[x21',x22']);
hold on
plot(Msample(1,:)',Msample(2,:)','X',Nsample(1,:)',Nsample(2,:)','o');