感知機學習及實踐
感知機是二分類的線性分類模型,其輸入為實例的特征向量,輸出為實例的類別,取+1和-1二值。感知機對應於輸入空間中將實例划分為正負兩類的分離超平面,屬於判別模型,感知機學習旨在求出將訓練數據進行線性划分的分離超平面。為此,導入基於誤分類的損失函數,利用梯度下降法對損失函數進行極小化,求的感知機模型。感知機算法具有簡單而易於實現的優點,分為原始形式和對偶形式。感知機預測是用機器學習得到的感知機模型對新輸入的實例進行分類。本篇博客依次從感知機模型、感知機的學習策略(損失函數)、感知機學習算法三方面進行介紹。
感知機模型
定義:假設輸入空間(特征向量)是X,輸出空間是Y={-1,+1},輸入表示實例的特征向量,對應於輸入空間的點,輸出y∈Y表示實例的類別,由輸入空間到輸出空間的函數如下:
f(x)=sign(w·x+b)
稱為感知機。其中,w和b為感知機模型參數,w∈R叫做權值或權值向量,b 叫做偏置。w·x表示w和x的內積。sign是符號函數,即:
![]()
感知機模型的假設空間是定義在特征空間中的所有線性分類模型或線性分類器,即函數集合{f|f(x)=w·x+b}。線性方程w·x+b=0對應於特征空間中的一個超平面S,其中w是超平面的法向量,b是超平面的截距。這個超平面將特征空間划分為兩個部分。位於兩部分的點(特征向量)分別被划分為正負兩類。因此超平面S稱為分離超平面。
感知機學習策略
對於給定的數據集T={(x1,y1),(x2,y2),···,(xn,yn)},如果存在超平面S,能夠將數據集的正實例點和負實例點完全正確地划分到超平面的兩側,即對所有yi=+1的實例,都有w·xi+b>0,對於所有的yi=-1的實例,都有w·xi+b<0,則稱數據集T為線性可分數據集,否則T為線性不可分數據集。
假設數據集T是線性可分的,感知機的學習目標是求得一個能將T完全正確分離的超平面S,即確定參數w和b。因此需要確定一個學習策略,即定義經驗損失函數並將損失函數最小化。提到損失函數,大家會想到的是誤分類點的個數。但是誤分類點的個數不是參數w,b的連續可導函數,不易優化。損失函數的另一個選擇是誤分類點到超平面的距離,輸入空間R中任意一點x到超平面S的距離公式如下:
![]()
這里,||w||是w的范數。其次對於誤分類的數據(xi,yi)來說,有-yi(w·xi+b)>0成立。因為當w·xi+b>0時,yi<0,反之當時w·xi+b<0,yi>0。因此誤分類點到超平面S的距離為:
![]()
這樣超平面S的誤分類點的集合為M,那么所有誤分類點到超平面S的總距離為:
![]()
不考慮
,得到感知機的損失函數,也就是感知機學習的經驗風險函數:
![]()
顯然,損失函數L(w,b)是非負的。如果沒有誤分類點,損失函數為0,而且誤分類點越少,誤分類點離超平面越近,損失函數值就越小。一個特定樣本點的損失函數:在誤分類時是參數w,b的線性函數,在正確分類時是0。因此,給定訓練數據集T,損失函數L(w,b)是w,b的連續可導函數。感知機學習策略是在假設空間中選取損失函數(經驗風險函數)最小的模型參數w,b。
感知機學習算法
感知機學習策略已經將問題轉化為求解損失函數式的最優化問題,最優化的方法是隨機梯度下降法。本節敘述感知機學習的具體算法,包括原始形式和對偶形式,並證明在訓練集線性可分的條件下,感知機學習算法的收斂性。
- 感知機學習算法的原始形式
感知機學習算法是誤分類驅動的,具體采用梯度下降法。首先,任意選取一個超平面w0、b0,然后用梯度下降法不斷的極小化目標函數。極小化過程中不是一次使誤分類集合M中所有點的梯度下降,而是一次隨機選取一個誤分類點使其梯度下降。
假設誤分類點集合M是固定的,那么損失函數L(w,b)的梯度由:

隨機選取一個點(xi、yi),對w,b進行更新:

式中
(0<
≤1)是步長,在統計學習中又稱為學習率。這樣,通過迭代可以期待損失函數不斷減小,直到0。綜上得到如下算法:
| 輸入:訓練數據集T={(x0,y0),...,(xi,yi),...,(xN,yN)},其中xi∈X=R,yi∈Y={+1,-1},學習率 輸出:w,b;感知機模型f(x)=sign(w·x+b) (1)選取初始值w0、b0 (2)在訓練數據集T中選擇點(xi,yi) (3)如果yi(w·xi+b)≤0
(4)轉至(2),直至訓練集中沒有誤分類點。 |
這種學習算法直觀上有如下解釋:當一個實例被誤分類時,調整w和b的值,使分離超平面向該誤分類點的一測移動,以減少該誤分類點與超平面間的距離,直至超平面越過該點使其正確分類。這種方法就被稱為感知機的原始形式。
說了這么多理論,來個感知機學習原始形式的例子加深一下對理論的理解吧,首先給定了訓練數據集,正實例點是[10,8],[6,9],[6,8],[7,6],[7,8],[9,6],[11,3],[10,6],[12,5];負實例點是[1,2],[2,2],[3,1],[1,1],[3,6],[4,4],[3,2],[2,6],[6,2]。試用感知機原始形式求感知機模型f(x)=sign(w·x+b)。首先是構建最優化問題:
![]()
按照如上算法求解w,b。η=1。初始值w=0,b=0。算法如下:
import sys import numpy as np #加載訓練集數據路徑 sys.path.append('/home/work/study/machineLearning/data/') import recommendations class Perceptron: def __init__(self): #加載訓練集數據 self.data = np.array(recommendations.trainingData) self.result = np.array(recommendations.resultData) #初始化w和b self.length = len(self.data[0]) self.w = np.zeros((1,self.length)) self.b = 0 def calculate(self): i = 0 while i < len(self.data): if self.result[i] * (np.dot(self.w, self.data[i]) + self.b) <= 0 : self.w += self.result[i] * self.data[i] self.b += self.result[i] i = 0 else : i += 1 print self.w print self.b perceptron = Perceptron() perceptron.calculate()
trainingData=[[1,2],[2,2],[3,1],[10,8],[6,9],[1,1],[3,6],[4,4],[6,8],[7,6],[3,2],[7,8],[6,2],[9,6],[11,3],[10,6],[12,5],[2,6]]
resultData=[-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1]
通過算法最終計算w=[7,2]T,b=-48,從而超平面為7x1+2x2-48=0。
感知機學習算法的對偶形式
對偶形式的基本想法是,將w和b表示為實例xi和標記yi的線性組合的形式,通過求解其系數而得到w和b。在如上算法中我們假設w0和b0的初始值均為0。對誤分類點(xi,yi)通過:

逐步修改w和b,假設修改n次,則w,b關於(xi,yi)的增量分別為αiyixi和αiyi,這里αi=niη。這樣不難看出,最后學習到的w和b可以分別表示為:

這里,當αi≥0,當η=1時,表示第i個實例點由於誤分而進行更新的次數。實例點更新的次數越多,意味着它離分離超平面的距離越近,也就越難正確分類。換句話說,這類實例對學習的結果影響最大。
綜上感知機學習算法對偶形式的算法如下:
| 輸入:訓練數據集T={(x0,y0),...,(xi,yi),...,(xN,yN)},其中xi∈X=R,yi∈Y={+1,-1},學習率 輸出:α,b;感知機模型 (1)選取初始值α0=0、b0=0 (2)在訓練數據集T中選擇點(xi,yi) (3)如果yi
(4)轉至(2),直至訓練集中沒有誤分類點。 |
關於為什么第三步αj=αj+η和b=b+ηyi鏈接如下:https://www.zhihu.com/question/26526858。
最后同樣用感知機的對偶形式求解一下上個例子的解:
# -*- coding: UTF-8 -*- import sys import numpy as np #加載訓練集數據路徑 sys.path.append('/home/work/study/machineLearning/data/') import recommendations class Perceptron: def __init__(self): #加載訓練集數據 self.data = np.array(recommendations.trainingData) self.result = np.array(recommendations.resultData) self.length = len(self.data[0]) def calculateDual(self): #首先計算gram矩陣 gram = np.matmul(self.data[:,0:self.length],self.data[:,0:self.length].T) #初始化參數a、w和b a = np.zeros((len(self.data),1)) w = np.zeros((1,self.length)) b = 0 i = 0 while i < len(self.data) : temp = 0 for j in range(len(self.data)) : temp += a[j] * self.result[j] * gram[j][i] if self.result[i] * (temp + b) <= 0 : a[i] += 1 b += self.result[i] i = 0 else : i += 1 for j in xrange(len(self.data)): w += a[j] * self.result[j] * self.data[j] print w print b perceptron = Perceptron() perceptron.calculateDual()
求出來解也是7x1+2x2-48=0。
總結
- 感知機是根據輸入實例的特征向量x對其進行二類分類的線性分類模型:f(x)=sign(w·x+b).感知機模型對應於輸入空間中的分離超平面w·x+b=0
- 感知機學習的策略是極小化損失函數,該函數對應於誤分類點到分離超平面的總距離:
![]()
- 感知機學習算法是基於隨機梯度下降法來對損失函數進行最優化的算法,有原始形式和對偶形式。原始形式中,首先任意選取一個超平面,然后用梯度下降法不斷極小化目標函數,這個過程中一次隨機選取一個誤分類點使其梯度下降。
- 當訓練數據集線性可分時,感知機學習算法是收斂的,而且感知機學習算法存在無窮多個解,其解由於不同的初值或不同的迭代順序而可能有所不同。

