1. 程式人生 > 其它 >感知器演算法

感知器演算法

技術標籤:模式識別機器學習演算法

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的條件超過一個,或全部

的di(X)<0 ,分類失效。相當於不確定區(indefiniteregion ,IR)。
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。

(2) 用全部訓練樣本進行一輪迭代,計算WT(k)Xi 的值,並修正權向量分兩種情況,更新權向量的值:
在這裡插入圖片描述
分類器對第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