1. 程式人生 > >統計學習方法(2)——感知機原始形式、對偶形式及Python實現

統計學習方法(2)——感知機原始形式、對偶形式及Python實現

感知機作為一種最簡單的線性二分類模型,可以在輸入空間(特徵空間)將例項劃分為正負兩類。本文主要介紹感知機兩種形式對應的學習演算法及Python實現。

 感知機學習演算法的原始形式

對於輸入空間,感知機通過以下函式將其對映至{+1,-1}的輸出空間

f(x)=sign(wx+b)(1)
對於所有的錯分類點iM,都有yi(wxi+b)>0,因此我們可以定義如下的損失函式作為優化準則:
L(w,b)=xiMyi(wxi+b)(2)
通過求解損失函式(2)的梯度(3),
wL(w,b)=xiMyixibL(w,b)=xiMyi(3)
我們很容易就可以得到感知機學習演算法的原始形式.
w
w+ηyixi
bb+ηyi
(4)
整個演算法流程如下:
  1. 選取初值w0,b0
  2. 在訓練集中任意選取點(xi,yi)
  3. 如果yi(wxi+b)>0則按照(4)式更新w,b
  4. 重複2直到沒有被誤分的點

以上即為感知機演算法的原始形式,理解起來比較簡單,也較容易實現。下面給出其的Python實現

from __future__ import division
import random
import numpy as np
import matplotlib.pyplot as plt  


def sign(v):
    if v>=0:
        return 1
    else
: return -1 def train(train_num,train_datas,lr): w=[0,0] b=0 for i in range(train_num): x=random.choice(train_datas) x1,x2,y=x if(y*sign((w[0]*x1+w[1]*x2+b))<=0): w[0]+=lr*y*x1 w[1]+=lr*y*x2 b+=lr*y return w,b def plot_points
(train_datas,w,b):
plt.figure() x1 = np.linspace(0, 8, 100) x2 = (-b-w[0]*x1)/w[1] plt.plot(x1, x2, color='r', label='y1 data') datas_len=len(train_datas) for i in range(datas_len): if(train_datas[i][-1]==1): plt.scatter(train_datas[i][0],train_datas[i][1],s=50) else: plt.scatter(train_datas[i][0],train_datas[i][1],marker='x',s=50) plt.show() if __name__=='__main__': train_data1 = [[1, 3, 1], [2, 2, 1], [3, 8, 1], [2, 6, 1]] # 正樣本 train_data2 = [[2, 1, -1], [4, 1, -1], [6, 2, -1], [7, 3, -1]] # 負樣本 train_datas = train_data1 + train_data2 # 樣本集 w,b=train(train_num=50,train_datas=train_datas,lr=0.01) plot_points(train_datas,w,b)

原始形式

可以看出正負樣本被紅線分到了兩個區域。

感知機學習演算法的對偶形式

相比於原始形式,其對偶形式在理解上沒有前者那麼直觀,網上關於其實現程式碼的例子也比較少。
在《統計學習方法》一書中,關於對偶形式有如下的描述:

對偶形式的基本想法是,將w和b表示為例項xi 和標記 yi 的線性組合的形式,通過求解其係數而求得w和b.

假設w0=0,b=0,那麼從(4)式可以看出,當所有的點均不發生誤判時,最後的w,b一定有如下的形式:

w=i=1Nniηyixi=i=1Nαiyixib=i=1Nniηyi=i=1Nαiyi
(5)
其中αi=niηni代表對第i個樣本的學習次數,感知機對偶形式的完整形式即為(6)式:
f(x)=sign(j=1Nαjyjxjx+b)(6)
  1. 初始化α=0,b=0.
  2. 任意選取(xi,yi)
  3. 如果yi(j=1Nαjyjxjxi+b)0,即發生誤判,則對αi,b進行更新: