1.感知器算法原理
兩類線性可分的模式類:,設判別函數為:
。
對樣本進行規范化處理,即類樣本全部乘以(-1),則有:
感知器算法通過對已知類別的訓練樣本集的學習,尋找一個滿足上式的權向量。
2.算法步驟
(1)選擇N個分屬於和類的模式樣本構成訓練樣本集{ X1, …, XN }構成增廣向量形式,並進行規范化處理。任取權向量初始值W(1),開始迭代。迭代次數k=1。
(2)用全部訓練樣本進行一輪迭代,計算WT(k)Xi 的值,並修正權向量。分兩種情況,更新權向量的值:
若 ,分類器對第 i 個模式做了錯誤分類,權向量校正為:
,c為整的校正增量。
若 ,分類正確,權向量不變,
。
統一寫成:
(3)分析分類結果:只要有一個錯誤分類,回到(2),直至對所有樣本正確分類。
感知器算法是一種賞罰過程:
分類正確時,對權向量“賞”——這里用“不罰”,即權向量不變;
分類錯誤時,對權向量“罰”——對其修改,向正確的方向轉換。
3.代碼示例
#感知機算法 import numpy as np import matplotlib.pyplot as plt X0 = np.array([[1,0], [0,1], [2,0], [2,2]]) X1 = np.array([[-1,-1], [-1,0], [-2,-1], [0,-2]]) #將樣本數據化為增廣向量矩陣 ones = -np.ones((X0.shape[0],1)) X0 = np.hstack((ones,X0)) ones = -np.ones((X1.shape[0],1)) X1 = np.hstack((ones,X1)) #對樣本進行規范化處理 X = np.vstack((-X0,X1)) plt.grid() plt.scatter(X0[:,1],X0[:,2],c = 'r',marker='o',s=500) plt.scatter(X1[:,1],X1[:,2],c = 'g',marker='*',s=500) W = np.ones((X.shape[1],1)) flag = True while(flag): flag = False for i in range(len(X)): x = X[i,:].reshape(-1,1) if np.dot(W.T,x)<=0: W = W + x flag = True p1=[-2.0,2.0] p2=[(W[0]+2*W[1])/W[2],(W[0]-2*W[1])/W[2]] plt.plot(p1,p2) plt.show()
輸出結果: