其原理和原始形式的感知器的原理一樣,對偶就是是:實質是一樣,只是換了一種實現方式。
我們用梯度下降法來更新權值時的公式為:
由於太懶,這裡用手寫給出解答
為了方便計算xi*xj,這裡先引入gram矩陣,有g = [xi * xj], 其中g為n*n矩陣,n為資料的個數,**實現如下:
先給出偽**:
產生資料集的**如下:其中我們把b從x中分開,方便計算:
#x為資料集,y為標籤,alpha為要迭代計算的值,b為偏置量
defcratedata
(): x = array([[3,3],[4,3],[1,1]]);
y = array([1,1,-1]);
alpha = array([0,0,0]);
b = 0;
return x,y,alpha,b;
最後,我們給出訓練alpha和偏置引數b的**
def
trainperceptron
(xvec, yvec, alpha,b):
#定義迴圈結束標誌
flag = true;
#得到gram矩陣
gramm = array(grammaxtrix(x));
while flag:
#求的樣本資料行總數
length = len(xvec);
flag = false;
for i in range(length):
ans = 0;
#計算alpha(j) * y(j) * x(i) * x(j)的和
for j in range(length):
ans += gramm[i][j] * y[j]* alpha[j];
ans += b;
#判斷是否誤分類
if y[i] * (ans) <= 0:
flag = true;
#迭代更新alpha
alpha[i] += 1;
#迭代更新偏置量b
b += y[i];
print(alpha);
print(i);
input();
return alpha,b;
來看看執行結果
>>> x,y,alhpha,b = cratedata()
>>> trainperceptron(x,y,alhpha,b)[10
0]0[10
1]2[10
2]2[10
3]2[20
3]0[20
4]2[20
5]2(array([2, 0, 5]), -3)
最後我們可以有w和alpha的關係,來求得w,最後得出分離超平面。
這裡alpha還有乙個很有趣的性質,alpha的值越大,則說明其更新的次數越多,那麼就意味著它距離分離超平面越近,也就越難正確分類。換句話說,這樣的例項對於學習結果的影響最大!
畢竟為了這乙個資料點,分離超平面移動自己移動了那麼多次呢!!
統計學習方法(二) 感知機學習方法的對偶形式
我們知道,在感知機的原始形式中,w 和 b 通過以下形式更新 w leftarrow w eta y x b leftarrow b eta y i 假設點 x i,y i 在學習過程中被使用了 n i 次 也即被分類錯誤了 i 次 那麼最後學習到的 w,b 可以表示為 w sum n i eta ...
統計學習方法(二)感知器C語音實現
感知器 perception 是二分類線性分類模型,其輸入為例項的特徵向量,輸出為例項的類別,取 1和 1的二值,感知機對應於輸入空間 特徵空間 中將例項劃分為正負兩類的分離超平面,屬於判別模型,感知機學習旨在求出將訓練資料進行線性劃分的分離超平面,為此匯入基於誤分類的損失函式,利用梯度下降法對於損...
統計學習方法(二)感知器C語音實現
感知器 perception 是二分類線性分類模型,其輸入為例項的特徵向量,輸出為例項的類別,取 1和 1的二值,感知機對應於輸入空間 特徵空間 中將例項劃分為正負兩類的分離超平面,屬於判別模型,感知機學習旨在求出將訓練資料進行線性劃分的分離超平面,為此匯入基於誤分類的損失函式,利用梯度下降法對於損...