二、感知機與多層網絡
1、感知機
感知機由兩層神經元組成,輸入層接收外界的輸入信號后傳遞給輸出層,輸出層是M-P神經元,亦稱“閾值邏輯單元”。結構如下圖:
感知機能容易地實現邏輯與、或、非操作。
神經網絡的基本單元為神經元,神經元接受來自其他神經元的信號,經過一個線性變換,與閾值比較,通過非線性變換即激活函數處理作為神經元的輸出。感知機包括兩層神經元。感知機是線性模型,能夠實現線性分類任務。
數學推理過程:
對樣本進行規范化處理,即負類樣本全部乘以(-1),則有:
感知機算法通過對已知類別的訓練樣本集的學習,尋找一個滿足上式的權向量。
當對樣本進行規范化處理后,即負類樣本全部乘以(-1),要使所有樣本分類,爭取wT與所有樣本的乘積均大於0。感知機算法通過對已知類別的訓練樣本集的學習,尋找一個權值向量w,其轉置與所有樣本的乘積的結果均大於0.
2、感知機算法步驟
(1)將訓練樣本集{ x1, …, xN}化為增廣向量形式,並進行規范化處理。初始化權值向量ŵ(1),開始迭代。迭代次數k=1 。
(2)用全部訓練樣本進行一輪迭代,計算ŵT(k)xi 的值,並修正權向量。分兩種情況,更新權向量的值:
統一寫作:
分析分類結果:只要有一個錯誤分類,回到(2),直至對所有樣本正確分類。
感知機算法是一種賞罰過程:
分類正確時,對權向量“賞”——這里用“不罰”,即權向量不變;
分類錯誤時,對權向量“罰”——對其修改,向正確的方向轉換。
代碼實現:
#感知機算法 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]]) plt.grid() plt.scatter(X0[:,0],X0[:,1],c = 'r',marker='o',s=500) plt.scatter(X1[:,0],X1[:,1],c = 'g',marker='*',s=500) plt.show() #將樣本數據化為增廣向量矩陣 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)) p1=[-2.0,2.0] p2=[(W[0]+2*W[1])/W[2],(W[0]-2*W[1])/W[2]] plt.plot(p1,p2) 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 p2=[(W[0]+2*W[1])/W[2],(W[0]-2*W[1])/W[2]] print(W) plt.plot(p1,p2) flag = True plt.show()
舉例演示:
已知兩類訓練樣本:
用感知器算法求出將樣本分為兩類的權向量解。
解:
所有樣本寫成增廣向量形式,進行規范化處理,負類樣本乘以(-1):
任取w(1)=0,取c=1,迭代過程為:
第一輪:
有兩個wT(k)xi ≤0的情況(錯判),進行第二輪迭代。
第二輪:
第三輪:
第四輪:
該輪迭代的分類結果全部正確,故解向量:
分類決策邊界:
當c、ŵ(1)取其他值時,結果可能不一樣,所以感知器算法的解不是單值的。