通俗的解釋就是,期望在給定的資料集中,找到乙個超平面,這個平面可以正確的分割開所有的資料類別。這裡有乙個假設,就是這個超平面是一定存在的,就是一定是有解可以把這些資料集完好的分開。
這裡先不列舉數學公式,講一講通俗理解:
就是先初始化乙個超平面,我認為這個超平面是分開了資料集,然後在利用資料集進行驗算,如果發現資料集有錯誤分類的,那麼就利用梯度下降演算法來糾正這個超平面,使它可以更好的劃分。不斷重複這個過程,直到沒有任何乙個點被誤判,這時候我們就找到了我們需要的平面了。
首先我們來求得定義的損失函式和相應的梯度,**如下:
from numpy import *;
#q主要是求得損失函式j和梯度grad
defgetcost
(xvec, yvec, wvec):
#利用了矩陣的乘法,來用向量加速求和計算
j_tmp = dot(xvec,wvec.t);
#同理,這裡y = 1 或 y = -1
j = -sum(dot(yvec,j_tmp.t));
#利用公式來求得梯度
grad = -(yvec * xvec);
return j,grad;
接下來我們可以來建立資料集來驗證一下我們的求損失函式和梯度的函式是不是是正確的。
def
cratedata
(): x = array([[1,3,3],[1,4,3],[1,1,1]]);
y = array([1,1,-1]);
wvec = array([0,0,0]);
return x,y,wvec;
執行後,可以發現結果為
>>> getcost(x
[0],y
[0],w)
(0, array([-1, -3, -3]))
注意這裡是僅僅對一行資料進行計算,而不是對整乙個矩陣進行計算
接下來就是我們**的核心,通過迭代來訓練感知器,其實質是不斷的移動超平面,使其能正確的分類
具體**和注釋如下
def
trainperceptron
(xvec, yvec, wvec):
#定義迴圈結束標誌
flag = true;
while flag:
#求的樣本資料行總數
length = len(xvec);
#當所有的點都沒有誤分類時,則跳出函式
flag = false;
for i in range(length):
j,grad = getcost(xvec[i], yvec[i], wvec);
#當第i個樣本被誤分類了,則利用梯度法來更改特徵向量
if y[i] * (dot(xvec[i],wvec.t)) <= 0:
wvec = wvec + yvec[i] * x[i];
flag = true;
#列印出來相應引數便與除錯
print(wvec);
print(grad);
print(i);
input();
return wvec;
下面來看看執行結果,可以看出來最終是找到了乙個超平面,可以完全的分開所有資料類
>>> trainperceptron(x,y,w)
[1 3 3]
[-1 -3 -3]
0[0 2 2]
[1 1 1]
2[-1 1 1]
[1 1 1]
2[-2 0 0]
[1 1 1]
2[-1 3 3]
[-1 -3 -3]
0[-2 2 2]
[1 1 1]
2[-3 1 1]
[1 1 1]
2array([-3, 1, 1])
統計學習方法(二)感知器C語音實現
感知器 perception 是二分類線性分類模型,其輸入為例項的特徵向量,輸出為例項的類別,取 1和 1的二值,感知機對應於輸入空間 特徵空間 中將例項劃分為正負兩類的分離超平面,屬於判別模型,感知機學習旨在求出將訓練資料進行線性劃分的分離超平面,為此匯入基於誤分類的損失函式,利用梯度下降法對於損...
統計學習方法(二)感知器C語音實現
感知器 perception 是二分類線性分類模型,其輸入為例項的特徵向量,輸出為例項的類別,取 1和 1的二值,感知機對應於輸入空間 特徵空間 中將例項劃分為正負兩類的分離超平面,屬於判別模型,感知機學習旨在求出將訓練資料進行線性劃分的分離超平面,為此匯入基於誤分類的損失函式,利用梯度下降法對於損...
《統計學習方法》 對偶感知器的python實現
其原理和原始形式的感知器的原理一樣,對偶就是是 實質是一樣,只是換了一種實現方式。我們用梯度下降法來更新權值時的公式為 由於太懶,這裡用手寫給出解答 為了方便計算xi xj,這裡先引入gram矩陣,有g xi xj 其中g為n n矩陣,n為資料的個數,實現如下 先給出偽 產生資料集的 如下 其中我們...