作者:桂。
時間:2017-04-16 11:53:22
鏈接:http://www.cnblogs.com/xingshansi/p/6718503.html

前言
今天開始學習李航的《統計學習方法》,考慮到之前看《自適應濾波》,寫的過於瑣碎,拓展也略顯啰嗦,這次的學習筆記只記錄書籍有關的內容。前段時間朋友送了一本《機器學習實戰》,想着借此增加點文中算法的代碼實現,以加深對內容的理解。本文梳理書本第二章:感知機(Perceptron)。
1)原理介紹
2)代碼實現
內容為自己學習記錄,如果不對的地方,麻煩各位提醒一下。
一、原理介紹
A-感知機模型
感知機的結構為:

可以看出它是神經網絡的理論基礎。感知機的前提是假設數據線性可分,輸入空間為:
,輸出空間:
,根據上面的結構圖,可以寫出映射關系:
![]()
其中
是模型參數,w叫做權值/權重(weight)。b叫做偏置(bias).感知器的理論解釋如下圖:

求解的超平面將數據分為正/負兩部分。
B-准則函數
對於線性可分的數據集
,其中
如果存在超平面
能夠將數據分為正負兩側,則數據集是線性可分數據集,否則是線性不可分數據集。感知器的前提認為數據集線性可分。
感知器的學習角度是:考慮所有點到分離面的總距離。
空間一點$x_0$到分離面的距離可以寫為:
,從而所有點到超平面的距離為:

因為是考慮分離面,而
不影響最終求解,從而對其忽略,得到感知器准則函數:

C-算法求解
對於任意一個樣本點,求梯度:

這是批量梯度下降法.文中沒有利用這種優化方法,而是每次隨機取一個點,即采用隨機梯度下降法。最簡單的是利用固定步長,迭代優化:

給出完整的算法流程:
收斂性證明用了Novikoff定理,這里不再列出了,對應原文證明點擊這里。
D-對偶形式
再次給出原始問題的迭代:

且
其中$n_i$為誤分的樣本數,假設正確分類,可以認為$\alpha_i=0$,上式可以重新寫成:

可以看出,當遇見誤分的樣本時,$n_i$數量增加1,即
![]()
b的更新迭代形式不變。從而得到對偶形式的算法流程:
由於對偶問題中,數據僅僅以內積形式出現,因此可以提前計算出來,迭代優化時直接調用,內積構成的矩陣,就是Gram矩陣:

E-對偶形式的核函數轉化
對偶形式中
,$x_ix_j$成對出現,可以利用核函數(${\phi \left( {{x_i}} \right)}$為核函數)的變換:

這就是核感知器(Kernel percettron)。
二、代碼實現
A-算法2.1(原始形式)
上面分析提到,其實優化的時候,理論上利用批量梯度下降法,隨機梯度下降法都應該是可行的。給出隨機梯度下降法代碼:
%%隨機梯度下降
clc;clear all;close all;
%percertron
N = 100;
X = [randn(N,2)+2*ones(N,2);...
randn(N,2)-2*ones(N,2)];
figure;
subplot 121
label = [ones(N,1);-ones(N,1)];
plot(X(label==1,1),X(label==1,2),'b.');hold on;
plot(X(label==-1,1),X(label==-1,2),'r.');hold on;
%初始化
W=rand(1,size(X,2));
b=rand(1);
T=100;%迭代次數
eta = 1;
for epochs=1:T
epochs
tag = 0;
for j=1:size(X,1)
if (label(j)*(W*X(j,:)'+b))<=0
W=W+eta*label(j)*X(j,:);
b=b+eta*label(j);
if min (label'.*(W*X'+b))>0
tag = 1;
break;
end
end
end
if tag ==1
break;
end
end
subplot 122
plot(X(label==1,1),X(label==1,2),'b.');hold on;
plot(X(label==-1,1),X(label==-1,2),'r.');hold on;
x = -5:.1:5;
y = -W(1)/W(2)*x-b/W(2);
plot(x,y,'k','linewidth',2);
結果圖:

如果想采用批量梯度下降法,將迭代部分的代碼修改為:
for j=1:size(X,1)
if min(label(j)*(W*X'+b))<=0
W=W+eta*label'*X;
b=b+eta*ones(1,2*N)*label;
if min (label'.*(W*X'+b))>0
tag = 1;
break;
end
end
end
這樣就完成了批量梯度下降算法的求解。
B-算法2.2(對偶形式)
給出代碼:
%%對偶方法求解
clc;clear all;close all;
%percertron
N = 100;
X = [randn(N,2)+2*ones(N,2);...
randn(N,2)-2*ones(N,2)];
Gram = X*X';
figure;
subplot 121
label = [ones(N,1);-ones(N,1)];
plot(X(label==1,1),X(label==1,2),'b.');hold on;
plot(X(label==-1,1),X(label==-1,2),'r.');hold on;
title('原數據')
%初始化
alpha=rand(1,size(X,1));
b=rand(1);
T=1000;%迭代次數
eta = 0.5;
for epochs=1:T
epochs
tag = 0;
for j=1:size(X,1)
if (label(j)*((alpha'.*label)'*Gram(:,j)+b))<=0
alpha=alpha+eta;
b=b+eta*label(j);
end
end
end
predict = sign((alpha.*label')*Gram'+b)';
subplot 122
plot(X(predict==1,1),X(predict==1,2),'b.');hold on;
plot(X(predict==-1,1),X(predict==-1,2),'r.');hold on;
title('分類數據')
對應結果圖:

可以看出線性可分時,分里面決定的數據與原始數據一致,而當線性不可分的時候,就出現了錯誤,線性不可分怎么處理呢?這就是核函數的作用了。
C-對偶形式的核函數
為了直觀,給出四個點的數據:

可以看出這樣的四個數據點是線性不可分的,常用核函數有:
1)高斯核函數K(x,xi) =exp(-||x-xi||2/2σ2;
2)多項式核函數K(x,xi)=(x·xi+1)^d, d=1,2,…,N;
3)感知器核函數K(x,xi) =tanh(βxi+b);
4)樣條核函數K(x,xi) = B2n+1(x-xi)。
這里以高斯核為例,給出代碼:
%%kernel
clc;clear all;close all;
%percertron
gamma = 1;
X = [0 1 1 0;0 1 0 1]';
Gram = exp(-dist(X,X').^2*gamma);
% Gram = X*X';
figure;
subplot 121
label = [ones(2,1);-ones(2,1)];
plot(X(label==1,1),X(label==1,2),'bo');hold on;
plot(X(label==-1,1),X(label==-1,2),'ro');hold on;
title('原數據');
axis([-2 2 -2 2]);
%初始化
alpha=rand(1,size(X,1));
b=rand(1);
T=1000;%迭代次數
eta = 1;
for epochs=1:T
epochs
for j=1:size(X,1)
if (label(j)*((alpha'.*label)'*Gram(:,j)+b))<=0
alpha=alpha+eta;
b=b+eta*label(j);
end
end
end
predict = sign((alpha.*label')*Gram'+b)';
subplot 122
plot(X(predict==1,1),X(predict==1,2),'bo');hold on;
plot(X(predict==-1,1),X(predict==-1,2),'ro');hold on;
axis([-2 2 -2 2]);
title('分類數據')
從結果可以看出,核函數可以解決非線性的困難。

參考:
李航《統計學習方法》.



