感知機
感知機在1957年被提出,算是最古老的分類方法之一。
雖然感知機泛化能力不及其他的分類模型,但是如果能夠對感知機的原理有一定的認識,在之后學習支持向量機、神經網絡等機器學習算法的時候會輕松很多。
感知機學習目標
- 感知機模型
- 感知機的損失函數和目標函數
- 感知機原始形式和對偶形式
- 感知機流程
- 感知機優缺點
感知機引入
線性可分和線性不可分
每逢下午有體育課,總會有男孩和女孩在學校的操場上玩耍。
假設由於傳統思想的影響,男孩總會和男孩一起打打籃球,女孩總會和女孩一起踢毽子、跳跳繩,如下圖所示。
# 感知機引入圖例
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
np.random.seed(1)
x1 = np.random.random(20)+1.5
y1 = np.random.random(20)+0.5
x2 = np.random.random(20)+3
y2 = np.random.random(20)+0.5
# 一行二列第一個
plt.subplot(121)
plt.scatter(x1, y1, s=50, color='b', label='男孩(+1)')
plt.scatter(x2, y2, s=50, color='r', label='女孩(-1)')
plt.vlines(2.8, 0, 2, colors="r", linestyles="-", label='$wx+b=0$')
plt.title('線性可分', fontproperties=font, fontsize=20)
plt.xlabel('x')
plt.legend(prop=font)
# 一行二列第二個
plt.subplot(122)
plt.scatter(x1, y1, s=50, color='b', label='男孩(+1)')
plt.scatter(x2, y2, s=50, color='r', label='女孩(-1)')
plt.scatter(3.5, 1, s=50, color='b')
plt.title('線性不可分', fontproperties=font, fontsize=20)
plt.xlabel('x')
plt.legend(prop=font, loc='upper right')
plt.show()
從左圖中也可以看出總能找到一條直線將男孩和女孩分開,即男孩和女孩在操場上的分布是線性可分的,此時該分隔直線為
其中\(\omega,b\)是參數,\(x\)是男孩和女孩共有的某種特征。
如果某個男孩不聽話跑到女孩那邊去了,如下圖右圖所示,則無法通過一條直線能夠把所有的男孩和女孩分開,則稱男孩和女孩在操場上的分布是線性不可分的,即無法使用感知機算法完成該分類過程。
上述整個過程其實就是感知機實現的一個過程。
感知機詳解
感知機模型
感知機是一個二分類線性模型,即輸出為實例的類別,一般為其中一類稱為正類\((+1)\),另一類稱為負類\((-1)\)。可以把上圖所示的男孩\((+1)\)稱為正類,女孩\((-1)\)稱為負類。
假設有\(m\)個實例\(n\)維特征並且數據線性可分的數據集
它的輸出空間即\(y\)的取值是\(y=\{+1,-1\}\)。
由於數據線性可分,如果是二維空間,則總能找到一條直線將二維空間中的數據集分為兩類,如上圖所示的\(\omega{x}+b=0\),如果是三維空間,則能找到一個平面把三維空間中的數據集分為兩類。對於上述的假設的數據集\(T\),則總能找到一個超平面\(S\)將該數據集分成兩類,該超平面\(S\)可以記作
其中如果假設\(\omega_0=b,x_0=1\),則超平面為
如果把上述公式使用向量來表示,則超平面為
其中\(\omega,x\)都為\(n+1\)維的向量。
如果把\(\omega^Tx > 0\)內的數據集看成一類;把\(\omega^Tx < 0\)內的數據集看成另一類,即通過\(\omega^Tx=0\)成功將數據集分為兩類。為了將兩個類別符號化,我們可以使用\(sign\)函數,由此即可得到感知機的模型為
感知機損失函數
假設有一個線性可分的數據集
則數據集中的樣本\(x_i\)到超平面\(S\)的距離為
其中\(||\omega||\)為L2范數。
該距離公式源自於數學中點\((x_0,y_0)\)到面\(Ax+By+C=0\)的公式
假設存在一個誤分類的樣本\((x_i,y_i)\),對有誤分類的樣本都存在\(- y_i(\omega^Tx_i) > 0\)。因為誤分類時當\(\omega^Tx_i = 1\)時\(y_i = -1\);當\(\omega^Tx_i = -1\)時\(y_i = 1\)。因此\(|\omega^Tx_i| = -y_i(\omega^Tx_i)\),則誤分類點到超平面\(S\)的距離即損失函數為
感知機目標函數
假設誤分類點的集合為\(M\),那么所有誤分類點到超平面\(S\)的距離即感知機的目標函數為
給定了所有誤分類點到超平面的距離,我們的目的就是優化上述公式,即最小化目標函數。
由於\(\omega^Tx_i=\omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b\),如果\(\omega\)和\(b\)成比例的增加,即分子的\(\omega\)和\(b\)擴大\(n\)倍時,分母的L2范數也將擴大\(n\)倍,也就是說分子和分母有固定的倍數關系,即可以將分子或分母固定為\(1\),然后求分子自己或分母的倒數的最小化作為新的目標函數。(此處講解拿出\(b\),事實上\(b\)對結果的影響很小,后續會繼續用向量的方式,並且忽略\(b\))。
感知機將分母\(||\omega||\)固定為\(1\),然后將分子的最小化作為目標函數,因此感知機的目標函數更新為
多說一嘴,支持向量機則是將分子固定位\(1\),然后將分母的倒數最小化作為目標函數。
對於給定的目標函數\(J(\omega)\),如果沒有誤分類點,目標函數值為0;如果誤分類點越少,則目標函數值越小;如果誤分類點越多,則目標函數值越大。
求出目標函數的最小值便可得到誤分類點少的感知機模型,並且從目標函數中也可以看出目標函數中未知的變量只有\(\omega\),因此需要求出能使目標函數值最小的\(\omega\)。
感知機最小化目標函數原始形式
假設感知機的目標函數為
為了求該函數的最小值一般使用梯度下降算法,首先通過該目標函數可以求出目標函數對\(\omega\)的偏導為
在訓練集中選取一個數據\((x_i, y_i)\),設定\(\omega=0\),如果\(-y_i(\omega^Tx_i)>0\),則對\(\omega\)使用隨機梯度下降的迭代更新
其中\(\alpha(0<\alpha\leq1)\)是自定義的超參數稱為學習率(learning rate)
。
通過對\(\omega\)不斷地更新直到訓練集中沒有誤分類的點時更新停止。即可求出目標函數\(J(\omega)\)的最小值,則該\(\omega\)即最后感知機模型的最優\(\omega\)。
這種學習算法可以理解成,當實例點被誤分類后,則調整\(\omega\)的值,使超平面向靠誤分類點的一側移動,因此減少該誤分類點與超平面間的距離,直至超平面越過該誤分類點將其分類正確;當實例點分類正確,則不會更新\(\omega\)。
感知機最小化目標函數對偶形式
通過隨機梯度下降算法可以得到了一個較好的感知機模型,但是如果樣本特征較多或者誤分類的數據較多,計算將成為該算法的最大的一個麻煩,接下來將介紹計算量較少的感知機最小化目標函數的對偶形式,通過該方法,將極大地減少計算量。
假設誤分類點\((x_i,y_i)\)通過梯度下降算法修改\(\omega\)共\(n_i\)次,誤分類點每次增量\(\alpha{x_i}y_i\),則\(\omega\)的增量是\(\alpha{n_i}x_iy_i\),而正確分類點的\(n_i\)則初始化為\(0\),因此所有實例的總增量為
其中\(n_i\)初始值為\(0\),每當誤分類點因誤分類而梯度更新時則\(n_i+1\)。
通過誤分類點的總增量公式即可得到一個新的感知機目標函數為
對目標函數使用梯度下降法求最小化目標函數,即對\(\alpha{n_i}\)求偏導得
在訓練集中選取一個點\((x_j, y_j)\),設定\(\alpha=0, n_i=0, \quad (i=1,2,\cdots,m)\),如果\(-y_i(\alpha{n_i}x_ix_j)>0\),則對\(\alpha{n_i}\)使用隨機梯度下降的迭代更新
通過對\(\alpha{n_i}\)不斷地更新直到訓練集中沒有誤分類的點時更新停止。即可求出目標函數\(J(\alpha{n_i})\)的最小值,同時可以得到最優的\(\sum_{i=1}^m\alpha{n_i}x_iy_i\),由於\(\omega = \sum_{i=1}^m\alpha{n_i}x_iy_i\)即也可以得到感知機模型的最優\(\omega\)。
對偶形式中在判斷誤分類點的時候是計算\(x_i,x_j\)兩個樣本的內積,因此為了方便可以預先將訓練集中樣本之間的內積計算出來並以矩陣的形式存儲,這個矩陣就是所謂的Gram矩陣(Gram matrix)
,這也正是對偶形式比原始形式計算速度更快的原因之一。
感知機算法的收斂性
感知機流程
輸入
有\(m\)個實例\(n\)維特征的數據集
其中\(x_i\)是實例的特征向量即\(({x_i}^{(1)},{x_i}^{(2)},\cdots,{x_i}^{(n)})\)。
輸出
\(\omega\)和感知機模型\(f(x)=sign(\omega^Tx)\)。
原始形式流程
- 選取初值\(\omega=0\)
- 訓練集中選取數據\((x_i,y_i)\),如果\(-y_i(\omega^Tx_i)>0\),則對\(\omega\)使用梯度下降更新
- 重復步驟2,直至訓練集中沒有誤分類點
- 得到最小化的目標函數\(J(\omega)\),同時可以得到最優的\(\omega^*\),感知機模型為\(f(x)=sign({w^*}^Tx)\)
對偶形式流程
- 選取初值\(\alpha=0, n_i=0, \quad (i=1,2,\cdots,m)\)
- 訓練集中選取數據\((x_j,y_j)\),如果\(-y_j(\alpha{n_i}x_ix_j)>0\),則對\(\alpha{n_i}\)使用梯度下降更新並更新該實例分類錯誤的次數\(n_i\)
- 重復步驟2,直至訓練集中沒有誤分類點
- 得到最小化的目標函數\(J(\alpha{n_i})\),同時可以得到最優的\(\sum_{i=1}^m\alpha{n_i}x_iy_i\),由於\(\omega = \sum_{i=1}^m\alpha{n_i}x_iy_i\)即也可以得到感知機模型的最優\(\omega^*\),感知機模型為\(f(x)=sign({w^*}^Tx)\)。
感知機優缺點
優點
- 簡單易懂,編程實現容易
- 由於非線性支持向量機和神經網絡等算法在此基礎上改進的,感知機在一定程度上值得細細體會
缺點
- 目前在工業上使用的較少(太古老了,沒轍!)
- 只能處理線性可分的數據(它的后代支持向量機和神經網絡完美的解決了這個缺點)
- 無法解決回歸問題(試着使用回歸支持向量機?)
小結
感知機算法最大的前提則是數據集需要線性可分,這也正是感知機算法最大的局限性。為了解決線性不可分數據的分類問題,因此在此感知機算法的基礎上發明了非線性支持向量機、神經網絡等機器學習算法。
感知機算法雖然現在用的很少了,但是如果能深刻了解感知機算法的對偶形式為什么比原始形式更快的做到算法收斂會讓你未來學習其他的機器學習算法輕松不少。
感知機其實用到了部分線性模型知識,至於線性模型是什么,下一篇即會揭曉——線性回歸。