目錄html
更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython
感知機在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{x}+b=0 \]
其中\(\omega,b\)是參數,\(x\)是男孩和女孩共有的某種特徵。dom
若是某個男孩不聽話跑到女孩那邊去了,以下圖右圖所示,則沒法經過一條直線可以把全部的男孩和女孩分開,則稱男孩和女孩在操場上的分佈是線性不可分的,即沒法使用感知機算法完成該分類過程。機器學習
上述整個過程其實就是感知機實現的一個過程。函數
感知機是一個二分類線性模型,即輸出爲實例的類別,通常爲其中一類稱爲正類\((+1)\),另外一類稱爲負類\((-1)\)。能夠把上圖所示的男孩\((+1)\)稱爲正類,女孩\((-1)\)稱爲負類。學習
假設有\(m\)個實例\(n\)維特徵而且數據線性可分的數據集
\[ T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\} \]
它的輸出空間即\(y\)的取值是\(y=\{+1,-1\}\)。
因爲數據線性可分,若是是二維空間,則總能找到一條直線將二維空間中的數據集分爲兩類,如上圖所示的\(\omega{x}+b=0\),若是是三維空間,則能找到一個平面把三維空間中的數據集分爲兩類。對於上述的假設的數據集\(T\),則總能找到一個超平面\(S\)將該數據集分紅兩類,該超平面\(S\)能夠記做
\[ \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b = 0 \]
其中若是假設\(\omega_0=b,x_0=1\),則超平面爲
\[ \omega_0x_0 + \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n =0 \]
若是把上述公式使用向量來表示,則超平面爲
\[ \omega^Tx = 0 \]
其中\(\omega,x\)都爲\(n+1\)維的向量。
若是把\(\omega^Tx > 0\)內的數據集當作一類;把\(\omega^Tx < 0\)內的數據集當作另外一類,即經過\(\omega^Tx=0\)成功將數據集分爲兩類。爲了將兩個類別符號化,咱們可使用\(sign\)函數,由此便可獲得感知機的模型爲
\[ sign(\omega^Tx)= \begin{cases} 1, \quad \omega^Tx > 0 \\ -1, \quad \omega^Tx < 0 \end{cases} \]
假設有一個線性可分的數據集
\[ T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_i,y_i),\cdots,(x_m,y_m)\} \]
則數據集中的樣本\(x_i\)到超平面\(S\)的距離爲
\[ {\frac{|\omega^Tx_i|}{||\omega||}} \]
其中\(||\omega||\)爲L2範數。
該距離公式源自於數學中點\((x_0,y_0)\)到面\(Ax+By+C=0\)的公式
\[ \frac{Ax_0+By_0+C}{\sqrt{A^2+B^2}} \]
假設存在一個誤分類的樣本\((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\)的距離即損失函數爲
\[ -{\frac{y_i(\omega^Tx_i)}{||\omega||}} \]
假設誤分類點的集合爲\(M\),那麼全部誤分類點到超平面\(S\)的距離即感知機的目標函數爲
\[ J(\omega)=\sum_{{x_i}\in{M}} -{\frac{y_i(\omega^Tx_i)}{||\omega||}} \]
給定了全部誤分類點到超平面的距離,咱們的目的就是優化上述公式,即最小化目標函數。
因爲\(\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\),而後將分子的最小化做爲目標函數,所以感知機的目標函數更新爲
\[ J(\omega)=-\sum_{{x_i}\in{M}}y_i(\omega^Tx_i) \]
多說一嘴,支持向量機則是將分子固定位\(1\),而後將分母的倒數最小化做爲目標函數。
對於給定的目標函數\(J(\omega)\),若是沒有誤分類點,目標函數值爲0;若是誤分類點越少,則目標函數值越小;若是誤分類點越多,則目標函數值越大。
求出目標函數的最小值即可獲得誤分類點少的感知機模型,而且從目標函數中也能夠看出目標函數中未知的變量只有\(\omega\),所以須要求出能使目標函數值最小的\(\omega\)。
假設感知機的目標函數爲
\[ J(\omega)=-\sum_{{x_i}\in{M}}y_i(\omega^Tx_i) \]
爲了求該函數的最小值通常使用梯度降低算法,首先經過該目標函數能夠求出目標函數對\(\omega\)的偏導爲
\[ \Delta_\omega{J(\omega)} = -\sum_{x_i\in{M}}x_iy_i \]
在訓練集中選取一個數據\((x_i, y_i)\),設定\(\omega=0\),若是\(-y_i(\omega^Tx_i)>0\),則對\(\omega\)使用隨機梯度降低的迭代更新
\[ \omega = \omega + \alpha{x_iy_i} \]
其中\(\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\),所以全部實例的總增量爲
\[ \omega = \sum_{i=1}^m\alpha{n_i}x_iy_i \]
其中\(n_i\)初始值爲\(0\),每當誤分類點因誤分類而梯度更新時則\(n_i+1\)。
經過誤分類點的總增量公式便可獲得一個新的感知機目標函數爲
\[ J(\alpha{n_i}) = \sum_{x=1}^my_i(\alpha{n_i}x_iy_ix) =\sum_{x=1}^m\alpha{n_i}x_ix \]
對目標函數使用梯度降低法求最小化目標函數,即對\(\alpha{n_i}\)求偏導得
\[ \Delta_{\alpha{n_i}}{J(\alpha{n_i})} = -\sum_{x=1}^m\alpha \]
在訓練集中選取一個點\((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}\)使用隨機梯度降低的迭代更新
\[ \begin{align} & \alpha{n_i} = \alpha{n_i} + \alpha \\ & n_i = n_i + 1 \end{align} \]
經過對\(\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)
,這也正是對偶形式比原始形式計算速度更快的緣由之一。
感知機算法中全部誤分類點到超平面的總距離爲
\[ -{\frac{1}{||w||_2}}\sum_{{x_i}\in{M}}y_i(w^Tx_i) \]
一般狀況下默認\(||w||_2\)爲1(注:支持向量機會講到爲何爲1),即存在知足條件\(||\hat{w}_{opt}||=1\)的超平面\(\hat{w}_{opt}^T\hat{x}=0\)將數據集徹底正確分開,即當\(\hat{w}_{opt}^T\hat{x}>0\),則\(y_i>0\);當\(\hat{w}_{opt}^T\hat{x}<0\),則\(y_i<0\)。所以必定存在\(\gamma>0\),對任何一個樣本\((x_i,y_i)\)都有
\[ y_i(\hat{w}_{opt}^T\hat{x})\geq\gamma \]
當\(1\geq{i}\leq{n}\)時\(R=max||\hat{x_i}||\),則感知機算法在訓練集上的誤分類次數\(k\)知足
\[ k\leq{\frac{R}{\gamma}}^2 \]
有\(m\)個實例\(n\)維特徵的數據集
\[ T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\} \]
其中\(x_i\)是實例的特徵向量即\(({x_i}^{(1)},{x_i}^{(2)},\cdots,{x_i}^{(n)})\)。
\(\omega\)和感知機模型\(f(x)=sign(\omega^Tx)\)。
感知機算法最大的前提則是數據集須要線性可分,這也正是感知機算法最大的侷限性。爲了解決線性不可分數據的分類問題,所以在此感知機算法的基礎上發明了非線性支持向量機、神經網絡等機器學習算法。
感知機算法雖然如今用的不多了,可是若是能深入瞭解感知機算法的對偶形式爲何比原始形式更快的作到算法收斂會讓你將來學習其餘的機器學習算法輕鬆很多。
感知機其實用到了部分線性模型知識,至於線性模型是什麼,下一篇即會揭曉——線性迴歸。