目錄html
更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython
在線性可分支持向量機中說到線性可分支持向量機有一個缺點是沒法對異常點作處理,也正是由於這些異常點致使數據變得線性不可分或者會由於它的正好被判斷爲支持向量致使模型的泛化能力變差。算法
# 異常點致使數據線性不可分圖例 import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties %matplotlib inline font = FontProperties(fname='/Library/Fonts/Heiti.ttc') x1 = [2, 2.5, 3.2, 6.5] x11 = [1, 4.5, 5, 6] x2 = [1.2, 1.4, 1.5, 1.2] x22 = [1, 1.5, 1.3, 1] plt.scatter(x1, x2, s=50, color='b') plt.scatter(x11, x22, s=50, color='r') plt.vlines(3.9, 0.8, 2, colors="g", linestyles="-", label='$w*x+b=0$', alpha=0.2) plt.text(1.1, 1.1, s='異常點A', fontsize=15, color='k', ha='center', fontproperties=font) plt.text(6.3, 1.3, s='異常點B', fontsize=15, color='k', ha='center', fontproperties=font) plt.legend() plt.show()
上圖能夠看出因爲異常點A和異常點B可能致使沒法按照線性可分支持向量機對上述數據集分類。數據結構
# 異常點致使模型泛化能力變差圖例 import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties from sklearn import svm %matplotlib inline font = FontProperties(fname='/Library/Fonts/Heiti.ttc') np.random.seed(8) # 保證數據隨機的惟一性 # 構造線性可分數據點 array = np.random.randn(20, 2) X = np.r_[array-[3, 3], array+[3, 3]] y = [0]*20+[1]*20 # 創建svm模型 clf = svm.SVC(kernel='linear') clf.fit(X, y) # 構造等網個方陣 x1_min, x1_max = X[:, 0].min(), X[:, 0].max(), x2_min, x2_max = X[:, 1].min(), X[:, 1].max(), x1, x2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max)) # 獲得向量w: w_0x_1+w_1x_2+b=0 w = clf.coef_[0] # 加1後纔可繪製 -1 的等高線 [-1,0,1] + 1 = [0,1,2] f = w[0]*x1 + w[1]*x2 + clf.intercept_[0] + 1 # 繪製H2,即wx+b=-1 plt.contour(x1, x2, f, [0], colors='k', linestyles='--', alpha=0.1) plt.text(2, -4, s='$H_2={\omega}x+b=-1$', fontsize=10, color='r', ha='center') # 繪製分隔超平面,即wx+b=0 plt.contour(x1, x2, f, [1], colors='k', alpha=0.1) plt.text(2.5, -2, s='$\omega{x}+b=0$', fontsize=10, color='r', ha='center') plt.text(2.5, -2.5, s='分離超平面', fontsize=10, color='r', ha='center', fontproperties=font) # 繪製H1,即wx+b=1 plt.contour(x1, x2, f, [2], colors='k', linestyles='--') plt.text(3, 0, s='$H_1=\omega{x}+b=1$', fontsize=10, color='r', ha='center') # 繪製數據散點圖 plt.scatter(X[0:20, 0], X[0:20, 1], cmap=plt.cm.Paired, marker='x') plt.text(1, 1.8, s='支持向量', fontsize=10, color='gray', ha='center', fontproperties=font) plt.scatter(X[20:40, 0], X[20:40, 1], cmap=plt.cm.Paired, marker='o') plt.text(-1.5, -0.5, s='支持向量', fontsize=10, color='gray', ha='center', fontproperties=font) # 繪製假設的異常點及假設的間隔邊界,**毫無心義的代碼**,爲了講解用 plt.scatter(-1.5, 3, marker='x', c='b') plt.text(-1.5, 3.1, s='異常點A', fontsize=10, color='r', ha='center', fontproperties=font) x_test = np.linspace(-3, 4, 666) y_test = -(w[0]+0.12)*x_test - (w[1]-0.002)*x_test+clf.intercept_[0]+1.8 y_test_test = -(w[0]+0.12)*x_test - (w[1]-0.002)*x_test+clf.intercept_[0]+2.3 plt.plot(x_test, y_test, linestyle='--') plt.plot(x_test, y_test_test) plt.xlim(x1_min-1, x1_max+1) plt.ylim(x2_min-1, x2_max+1) plt.show()
上圖能夠看出因爲異常點致使分離超平面從淡實線變成了黃色的那條曲線,從圖中能夠明顯看出異常點嚴重影響了模型的泛化能力。dom
此次講到的線性支持向量機(linear support vector machine)將修改線性可分支持向量機的硬間隔最大化爲軟間隔最大化解決上面有異常點致使的問題。機器學習
線性可分支持向量機中說到線性可分支持向量機的目標函數的最優化問題屬於硬間隔最大化,即
\[ \begin{align} & \underbrace{\min}_{\omega,b} {\frac{1}{2}}{||\omega||}^2 \\ & s.t. \quad y_i(\omega{x_i}+b)\geq1, \quad i=1,2,\ldots,m \end{align} \]函數
上一節講到異常點會致使數據線性不可分,即意味着某些樣本點不能知足函數間隔大於等於\(1\)的約束條件,爲了解決該問題能夠對每一個樣本點\((x_i,y_i)\)引進一個鬆弛變量\(\xi_i\geq0\),使得函數間隔加上鬆弛變量大於等於1,所以約束條件將變成
\[ y_i(wx_i+b)\geq1-\xi_i \]
相比較硬間隔最大化,能夠看到樣本到分離超平面的函數距離要求放鬆了,以前必定要大於等於\(1\),如今只須要加上一個大於等於\(0\)的鬆弛變量大於等於\(1\)便可。同時,每一個鬆弛變量\(\xi_i\)對應一個代價\(\xi_i\),則目標函數變成了
\[ {\frac{1}{2}}{||\omega||}^2 + C\sum_{i=1}^m\xi_i \]
其中\(C>0\)稱爲懲罰參數,\(C\)值越大,對誤分類樣本懲罰越大,即間隔寬度越小;\(C\)值越小,對誤分類樣本懲罰越小,即間隔寬度越大。性能
如今的目標函數有兩層意思,即但願\({\frac{1}{2}}{||\omega||}^2\)儘可能小的同時誤分類樣本也儘量的少,\(C\)則是協調二者關係的正則化懲罰係數。上面的思路較於硬間隔最大化稱爲軟間隔最大化,也所以線性支持向量機的原始問題爲
\[ \begin{align} & \underbrace{\min}_{\omega,b,\xi} {\frac{1}{2}}{||\omega||}^2 + C\sum_{i=1}^m\xi_i \\ & s.t. \quad y_i(\omega{x_i}+b)\geq1-\xi_i, \quad i=1,2,\ldots,m \\ & \quad\quad \xi_i\geq0, \quad i=1,2,\ldots,m \end{align} \]學習
對於給定的線性不可分的訓練數據集,經過求解上一節的線性支持向量的原始問題即凸二次規劃問題即軟間隔最大化問題,假設問題的解釋\(w^*\)和\(b^*\),獲得的分離超平面爲
\[ w^*x+b^*=0 \]
分類決策函數爲
\[ f(x) = sign(w^*x+b*) \]
稱做線性支持向量機。優化
線性支持向量機的原始問題爲
\[ \begin{align} & \underbrace{\min}_{\omega,b,\xi} {\frac{1}{2}}{||\omega||}^2 + C\sum_{i=1}^m\xi_i \\ & s.t. \quad y_i(\omega{x_i}+b)\geq1-\xi_i, \quad i=1,2,\ldots,m \\ & \quad\quad \xi_i\geq0, \quad i=1,2,\ldots,m \end{align} \]
經過線性支持向量機的原始問題可得原始問題的拉格朗日函數爲
\[ L(\omega,b,\xi,\alpha,\mu)={\frac{1}{2}}{||w||}^2+C\sum_{i=1}^m\xi_i-\sum_{i=1}^m\alpha_i(y_i(wx_i+b)-1+\xi_i)-\sum_{i=1}^m\mu_i\xi_i \]
其中\(\mu_i\geq0,\alpha_i\geq0\),均爲拉格朗日系數。
即如今須要優化的目標函數爲
\[ \underbrace{\min}_{\omega,b,\xi}\underbrace{\max}_{\mu_i\geq0,\alpha_i\geq0}L(\omega,b,\alpha,\xi,\mu) \]
因爲優化的目標函數知足KKT條件,便可以經過拉格朗日對偶將上述的優化問題轉化爲等價的對偶問題爲
\[ \underbrace{\max}_{\mu_i\geq0,\alpha_i\geq0} \underbrace{\min}_{\omega,b,\xi} L(\omega,b,\alpha,\xi,\mu) \]
對偶問題爲拉格朗日函數的極大極小問題,所以首先求\(L(\omega,b,\alpha,\xi,\mu)\)對\(\omega,b,\xi\)的極小,即
\[ \begin{align} & \nabla_wL(\omega,b,\alpha,\xi,\mu)=w-\sum_{i=1}^m\alpha_iy_ix_i=0 \\ & \nabla_bL(\omega,b,\alpha,\xi,\mu) = -\sum_{i=1}^m\alpha_iy_i=0 \\ & \nabla_{\xi_i}L(\omega,b,\alpha,\xi,\mu)=C-\alpha_i-\mu_i=0 \end{align} \]
得
\[ \begin{align} & w=\sum_{i=1}^m\alpha_iy_ix_i \\ & \sum_{i=1}^m\alpha_iy_i=0 \\ & C-\alpha_i-\mu_i=0 \end{align} \]
將上述三個式子代入拉格朗日函數便可得(注:推導過程相似於線性可分支持向量機的推導過程,很少贅述,直接給出結果)
\[ \underbrace{\min}_{\omega,b,\xi} L(\omega,b,\alpha,\xi,\mu) = -{\frac{1}{2}}\sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_jy_iy_j(x_ix_j)+\sum_{i=1}^m\alpha_i \]
經過\(\underbrace{\min}_{\omega,b,\xi} L(\omega,b,\alpha,\xi,\mu)\)便可得\(\alpha\)的極大,即將上式代入對偶問題得
\[ \begin{align} & \underbrace{\max}_{\alpha} {-{\frac{1}{2}}\sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_jy_iy_j(x_ix_j)+\sum_{i=1}^m\alpha_i} \\ & s.t. \quad \sum_{i=1}^m\alpha_iy_i=0 \\ & \quad\quad C-\alpha_i-\mu_i=0 \\ & \quad\quad \alpha_i\geq0, \quad i=1,2,\ldots,m \\ & \quad\quad \mu_i\geq0, \quad i=1,2,\ldots,m \end{align} \]
因爲\(C-\alpha_i-\mu_i=0\)而且\(\mu_i\geq0\),即\(0\leq\alpha_i\geq{C}\),再對目標函數變號,即變成求極小值
\[ \begin{align} & \underbrace{\min}_{\alpha} {{\frac{1}{2}}\sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_jy_iy_j(x_ix_j)-\sum_{i=1}^m\alpha_i} \\ & s.t. \quad \sum_{i=1}^m\alpha_iy_i=0 \\ & \quad\quad 0\leq\alpha_i\geq{C} \end{align} \]
上式即是線性支持向量機的軟間隔最大化問題,與線性可分支持向量機的硬間隔最大化問題相比僅僅是多了一個約束條件\(0\leq\alpha_i\geq{C}\),即也能夠經過SMO算法求出上式極小化對應的\(\alpha\),假設經過SMO算法獲得了該\(\alpha\)值記做\(\alpha^*\),便可根據\(\alpha^*\)求得原始最優化問題的解\(\omega^*\)和\(b^*\)。
因爲接下來的推導過程與線性可分支持向量機同樣,再也不贅述,值得說一句的是。《線性可分支持向量機》一文曾說道有多少個支持向量機則可能求出多少個\(b^*\),線性可分支持向量機中的\(b^*\)都是同樣的,能夠不用處理;而線性支持向量機因爲鬆弛因子的影響對於不一樣的支持向量\(b^*\)是不一樣的,一般使用取均值的方法獲得最終的\(b^*\)。
硬間隔最大化中的支持向量比較簡單,即知足\(y_j(w^*x_j+b)-1=0\)便可。《線性可分支持向量機》曾給出解釋:由KKT互補條件可得對於\(\alpha^*>0\)樣本點\((x_j,y_j)\)有\(y_j(w^*x_j+b)-1=0\),而且間隔邊界\(H_1\)和\(H_2\)分別爲\(w^*x_j+b^*=1\)和\(w^*x_j+b^*=-1\),即支持向量必定在間隔邊界上。
軟間隔最大化的支持向量則因爲對每一個樣本引入了鬆弛因子\((x_i,y_i)\)變得較爲複雜。第\(i\)個樣本\(x_i\)到對應類別支持向量的距離爲\({\frac{\xi_i}{||w||}}\),根據軟間隔最大化時的KKT條件中的對偶互補條件\({\alpha_i}^*(y_i(wx_i+b)-1+\xi_i)=0\)可得
若是\({\alpha_i}^*=C\),說明這這多是一個異常點,須要檢查此時\(\xi_i\)的狀況
# 軟間隔最大化支持向量圖例 import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties from sklearn import svm %matplotlib inline font = FontProperties(fname='/Library/Fonts/Heiti.ttc') np.random.seed(8) # 保證數據隨機的惟一性 # 構造線性可分數據點 array = np.random.randn(20, 2) X = np.r_[array-[3, 3], array+[3, 3]] y = [0]*20+[1]*20 # 創建svm模型 clf = svm.SVC(kernel='linear', C=10.0) clf.fit(X, y) # 構造等網個方陣 x1_min, x1_max = X[:, 0].min(), X[:, 0].max(), x2_min, x2_max = X[:, 1].min(), X[:, 1].max(), x1, x2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max)) # 獲得向量w: w_0x_1+w_1x_2+b=0 w = clf.coef_[0] # 加1後纔可繪製 -1 的等高線 [-1,0,1] + 1 = [0,1,2] f = w[0]*x1 + w[1]*x2 + clf.intercept_[0] + 1 # 繪製H2,即wx+b=-1 plt.contour(x1, x2, f, [0], colors='k', linestyles='--') # 繪製分隔超平面,即wx+b=0 plt.contour(x1, x2, f, [1], colors='k') # 繪製H1,即wx+b=1 plt.contour(x1, x2, f, [2], colors='k', linestyles='--') # 繪製數據散點圖 plt.scatter(X[0:20, 0], X[0:20, 1], cmap=plt.cm.Paired, marker='x') plt.text(1, 1.8, s='支持向量', fontsize=10, color='gray', ha='center', fontproperties=font) plt.scatter(X[20:40, 0], X[20:40, 1], cmap=plt.cm.Paired, marker='o') plt.text(-1.5, -0.5, s='支持向量', fontsize=10, color='gray', ha='center', fontproperties=font) # 繪製假設的異常點,**毫無心義的代碼**,爲了講解用 plt.annotate(r'${\frac{\xi_1}{||w||}}$', xytext=(0.5, 2.8), xy=(-1.2, -2.2), arrowprops=dict(arrowstyle="->", connectionstyle="arc3"), fontsize=20) plt.scatter(-1.2, -2.2, marker='o', c='orange') plt.annotate(r'${\frac{\xi_2}{||w||}}$', xytext=(1.8, 1.3), xy=( 1.2, -1.5), arrowprops=dict(arrowstyle="->", connectionstyle="arc3"), fontsize=20) plt.scatter(1.2, -1.5, marker='o', c='orange') plt.annotate(r'${\frac{\xi_3}{||w||}}$', xytext=(3, -0.2), xy=( 3, -2), arrowprops=dict(arrowstyle="->", connectionstyle="arc3"), fontsize=20) plt.scatter(3, -2, marker='o', c='orange') plt.xlim(x1_min-1, x1_max+1) plt.ylim(x2_min-1, x2_max+1) plt.show()
線性支持向量機還有另一種解釋,就是最小化如下目標函數
\[ \sum_{i=1}^m [1-y_i(wx_i+b)]_{+}+\lambda{||w||}^2 \]
其中\(\sum_{i=1}^m [1-y_i(wx_i+b)]_{+}\)被稱爲經驗損失,既能夠度量模型的好壞;\(\lambda\)是正則化項。
其中函數\(L(y(wx+b))=[1-y_i(wx_i+b)]_{+}\)稱爲合頁損失函數(hinge loss function),下標\(+\)表示爲
\[ {[z]}_+ = \begin{cases} z \quad z>0 \\ 0 \quad z\leq0 \end{cases} \]
也就是說,若是點被正確分類,即函數間隔\(y_i(wx_i+b)\)大於1,即\(z\leq0\),損失是0;不然損失是\(1-y_i(wx_i+b)\)。可是對於上圖的點3被正確分類可是損失不是0,所以合頁損失函數對學習有更高的要求。
其實上述的目標函數等價於軟間隔最大化的目標函數,即把\([1-y_i(wx_i+b)]_{+}\)當作\(\xi_i\),即上述的目標函數能夠寫成
\[ \underbrace{\min}_{\omega,b} \quad \sum_{i=1}^m\xi_i+\lambda{||\omega||}^2 \]
若是取\(\lambda\)爲\({\frac{1}{2C}}\),則
\[ \underbrace{\min}_{\omega,b} \quad {\frac{1}{C}}({\frac{1}{2}}{||\omega||}^2+C\sum_{i=1}^m\xi_i) \]
軟間隔最大化的目標函數爲
\[ \underbrace{\min}_{\omega,b} \quad {\frac{1}{2}}{||\omega||}^2+C\sum_{i=1}^m\xi_i \]
有\(m\)個樣本的線性可分訓練集\(T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}\),其中\(x_i\)爲\(n\)維特徵向量,\(y_i\)爲二元輸出即值爲\(1\)或者\(-1\)。
分離超平面的參數\(w^*\)和\(b^*\)以及分類決策函數
線性支持向量機解決了最初的支持向量機的一個大問題,即沒法處理原始問題,異常值會給模型的優化帶來極大的麻煩,即會使得模型的最大間隔變窄,影響模型的性能。
雖然線性支持向量機支持這種異常值致使的數據集線性不可分,可是他並無從本質上解決線性支持向量機沒法處理線性不可分的問題,接下來的核函數的使用將讓支持向量機變成分類器模型中的王者,即非線性支持向量機。