1. 程式人生 > >機器學習:利用核函式進行非線性分類

機器學習:利用核函式進行非線性分類


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