感知器演算法
1.判別函式
統計模式識別分為聚類分析法和判決函式法,其中判決函式法又包括幾何分類法(確定性時間分類,線性,非線性)以及概率分類法(隨機事件分類)。
判別函式即用來對模式進行分類的準則函式。
2.線性判別函式
n維線性判別函式的一般形式為:
其中X,W不包含最後一項常數項
:權向量,解向量,即引數向量
增廣向量就把最後一項加進去,
W加一個Wn+1,X加一個1
這裡有一個多類情況:
1)
:
用線性判別函式將屬於ωi類的模式與其餘不屬於ωi類的模式分開。將某個待分類模式 X 分別代入 M 個類的d (X)中,若只有di(X)>0,其他d(X)均<0,則判為ωi類。對某一模式區,di(X)>0的條件超過一個,或全部
2)
:
在 M 類模式中,與i 有關的M-1個判決函式全為正時,X∈ωi。其中若有一個為負,則為IR區。
3.廣義線性判別函式
通過某對映,把模式空間X變成X*,以便將X空間中非線性可分的模式集,變成在X*空間中線性可分的模式集。
4.線性判別函式的幾何性質
模式空間:以n維模式向量X的n個分量為座標變數的歐氏空間。
模式向量的表示:點、有向線段。
線性分類:用d(X)進行分類,相當於用超平面d(X)=0把模式空間分成不同的決策區域。
5.感知器演算法
只要求出權向量,分類器的設計即告完成。利用已知類別的模式樣本訓練出權向量W。
感知器:對一種分類學習機模型的稱呼,屬於有關機器學習的仿生學領域中的問題,由於無法實現非線性分類而下馬。但“賞罰概念( reward-punishment concept)” 得到廣泛應用。
對樣本進行規範化處理,即ω2類樣本全部乘以(-1),則有:
感知器演算法通過對已知類別的訓練樣本集的學習,尋找一個滿足上式的權向量。
感知器演算法步驟:
(1) 選擇N個分屬於ω1和 ω2類的模式樣本構成訓練樣本集{ X1, …, XN }構成增廣向量形式,並進行規範化處理,一類每個向量變成增廣加1,二類每個乘以-1再加-1。任取權向量初始值W(1)(eg=(0,0,0)),c=1開始迭代。迭代次數k=1。
分類器對第i個模式做了錯誤分類,權向量校正為
,其中c:正的校正增量,取1。
分類正確,權向量不變
統一為:
(3) 分析分類結果:只要有一個錯誤分類,回到(2),直至對所有樣本正確分類
感知器演算法是一種賞罰過程:
分類正確時,對權向量“賞”——這裡用“不罰”,即權向量不變;
分類錯誤時,對權向量“罰”——對其修改,向正確的方向轉換。
收斂性:經過演算法的有限次迭代運算後,求出了一個使所有樣本都能正確分類的W,則稱演算法是收斂的。
當c、W(1)取其他值時,結果可能不一樣,所以感知器演算法的解不是單值的。
多類:
訓練樣本為增廣向量形式,但不需要規範化處理。
第k次迭代時,一個屬於ωi類的模式樣本 X 被送入分類器,計算所有判別函式
分二種情況修改權向量:
1)
則權向量不變;
2)若第l個權向量使
,則相應的權向量作調整,即:
編寫感知器演算法程式,求下列模式分類的解向量:
ω1: {(0 0 0) t,(1 0 0) t,(1 0 1 ) t,(1 1 0) t}
ω2: {(0 0 1) t, (0 1 1) t,(0 1 0) t, (1 1 1) t}
設w(1)=(-1 -2 -2 0) t.
先做規範化處理,然後把兩組向量合併到一個列表中,然後每輪進行8次矩陣乘法運算,得到8個d值,每次根據d值正負對w作不同獎罰處理,每輪結束後若d值大於0的次數不等於8則進行下一輪。最終等於8時跳出並打印出此時的w。
Python程式碼計算過程:
1. import pandas as pd
2. from numpy import *
3. l1=[[0,0,0],[1,0,0],[1,0,1],[1,1,0]] #len=4
4. l2=[[0,0,1],[0,1,1],[0,1,0],[1,1,1]]
5. w=[[-1,-2,-2,0]]
6. w=mat(w)
7. #規範化處理
8. gl1=l1
9. gl2=l2
10. for i in range(len(l1)):
11. gl1[i].append(1)
12. #print(gl1)
13.
14. for i in range(len(l2)):
15. gl2[i].append(1)
16. gl2[i]=[j*(-1) for j in gl2[i]]
17. #print(gl2)
18.
19. gl=gl1+gl2
20. #print(gl)
21. f=0
22. t=0
23. while t!=8:
24. f=0
25. t=0
26. for i in range(len(gl)):
27. d=w*mat(gl[i]).T
28. d=d.tolist()
29. d=d[0][0]
30. print(d)
31. if d>0:
32. w=w
33. t=t+1
34. else:
35. w=w+mat(gl[i])
36. f=f+1
37.
38. print(w)
輸出結果:
驗算:
輸出w之前的8個d值均為正數,正確。
所以解向量為W=[3,-2,-3,1]T