机器学习:利用核函数进行非线性分类


%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');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值