感知機演算法及實現
感知機演算法
定義1:假設輸入空間是,輸出空間為={+1,-1}.輸入x表示例項的特徵向量,對應於輸入空間的點;輸出表示例項的類別。由輸入空間到輸出空間的如下函式稱為感知機。其中是向量乘積形式。我們只需要求得兩個引數和b,就可以獲得感知機模型。
感知機有如下幾何解釋:線性方程對應於特徵空間的一個超平面S,其中是超平面的法向量,b是超平面的截距。位於兩部分的點分別被分為正負兩類,因此,超平面S稱為分離超平面。
根據經驗,需要定義損失函式並令損失函式最小化。對於感知機模型,損失函式選擇誤分類點到超平面的總距離。假設是誤分類點,那麼誤分類點到超平面的距離為假設超平面S的誤分類點的集合為M。那麼誤分類點到超平面S的總距離為。不考慮,我們就可以得到感知機的損失函式
感知機演算法的原始形式
#感知機
training_set=[[(1,2),1],[(2,3),1],[(3,1),-1],[(4,2),-1]]
#引數初始化
w=[0,0]
b=0
history=[]#用來記錄每次更新的引數
#引數更新
def update(item):
#item是誤分類的點
global w,b,history
w[0]=w[0]+item[1]*item[0][0]
w[1]=w[1]+item[1]*item[0][1]
b=b+item[1]
print('w的值為:',w,'b的值為:',b)#輸出每次更新過後的引數值
history.append([w,b])
#用於計算item到分類平面的距離
def cal(item):
res=0
for i in range(len(item[0])):
res=res+w[i]*item[0][i]
res+=b
res=res*item[1]
return res
def check():
flag=False
for item in training_set:
if cal(item)<=0:
flag=True
update(item)
if not flag:
print('結果 w:'+str(w)+' b:'+str(b))
return flag
if __name__=="__main__":
for i in range(1000):
if not check():break
##感知機演算法的對偶形式##
對偶形式的基本想法是:將w和b表示為例項和標記的線性組合的形式。通過求解係數從而求得w和b。在演算法1中初始化w和b為0,對於誤分類點通過
KaTeX parse error: No such environment: align* at position 8:
\begin{̲a̲l̲i̲g̲n̲*̲}̲
&\mathbf{w} \g…
逐步修改w和b,假設修改了n次,那麼w,b關於的增量分別為,這裡。於是,我們最後學習到的w,b可以表示為
KaTeX parse error: No such environment: align* at position 8:
\begin{̲a̲l̲i̲g̲n̲*̲}̲
&\mathbf{w}=\s…
這裡,$\alpha_{i}\ge\cdots\eta=1$時,表示第i個例項點由於誤分而進行更新的次數。例項點更新的次數越多,意味著他距離分類超平面越近,也就越難正確分類。這樣的例項對學習結果影響最大。
演算法2: