[ML] 機器學習技法:第一講 linear SVM

ML:基礎技法學習
Package:scikit-learn
課程:機器學習技法
簡介:第一講 linear SVM (support vector machine)

根據 PLA
以下三個圖皆符合條件,但何者最好呢?相信大部分的人都會選擇右邊的圖,因為 margin 最大

基本 Model

minb,w  12wTwsubject to  yn(wTxn+b)1 for all n 注意:此時的 w 不包含 w0x 也不包含 x0=1,而 b=w0
首先,可以先想成,當線性可分時,要取出最大 margin 的那條線
而 margin 的定義,為所有資料點遠離線的最小距離
maxw~  margin(w~)subject to  every ynw~Txn>0  margin(w~)=minn=1,2,,N distance(xn,w~) 假設變數如下
w~=[w0=bw]x=[x1xd] 如何求距離呢?
如下圖,可看到距離即是 xx 投影在法向量的長度
法向量為 w
wTx=bwTx=bwT(xx)=0 xx 即是平面上的向量
只有法向量的內積為 0,故 w 為法向量
disance(x,b,w)=|wTw(xx)|=|1w(wTxwTx)|=|1w(wTx+b)|=1w|wTx+b|yn 只差在正負值,大小一樣,不影響 margin 取最小值,所以可用來拿掉絕對值 disance(xn,b,w)=1w|wTxn+b|yn(wTx+b)>0 and yn=±Valueminn=1,2,,N distance(xn,w~)minn=1,2,,N 1wyn(wTxn+b) 故可重新定義 model
maxb,w  margin(b,w)subject to  every yn(wTxn+b)>0  margin(b,w)=minn=1,2,,N 1wyn(wTxn+b) 平面方程式,不因 scaling 而有所不同,如下平面是一樣的
wTxn+b=0100wTxn+100b=0
那麼利用一特別的 scaling 使得 最小的值為 1 (當為 1 時,x 其實就在邊界 )
minn=1,2,,N yn(wTxn+b)=1margin(b,w)=1w 可再重新定義 model,且因為 minn=1,2,,N yn(wTxn+b)=1
所以 every yn(wTxn+b)>0 可以去掉
maxb,w 1wsubject to  minn=1,2,,N yn(wTxn+b)=1 可以再被取代嗎?如下 minn=1,2,,N yn(wTxn+b)=1?yn(wTxn+b)1yn(wTxn+b)1 比較寬鬆
要確保即使放鬆條件,解出來的解仍落在 minn=1,2,,N yn(wTxn+b)=1 之中
試想一情況,假設解出來的解令 yn(wTxn+b)=a>1
那麼此時最佳解為 (b,w),但因為 scaling 的關係,可得另一個解為 (ba,wa)
結果發現後者比前者在 maxb,w 1w 還最佳化
矛盾,故即使使用 yn(wTxn+b)1 也不會令解落在 minn=1,2,,N yn(wTxn+b)=1 之外
再將 max 改一下
maxb,w 1wminb,w wminb,w wTwminb,w 12wTw 故得 minb,w  12wTwsubject to  yn(wTxn+b)1 for all n

SVM 命名簡單說明

可以看到只有在邊緣的點,才會影響得到的解
因此將這些點稱作 support vector,由這些點支撐出來的 margin

Linear Hard-Margin SVM Algorithm

  • 利用 Quadratic Programming 解 (程式語言都有 QP Solver 的套件)
    [bw]=uw=[0d×1Id×d]ub=[101×d]u12wTw=12([0d×1Id×d]u)T[0d×1Id×d]u=12uT[01×dId×d][0d×1Id×d]u=12uT[001×d0d×1Id×d]u=12uT[001×d0d×1Id×d]u+01×d+1u=12uTQu+pTuyn(wTxn+b)=yn(([0d×1Id×d]u)Txn+[101×d]u)=yn(uT[01×dId×d]xn+[101×d]u)=yn(uT[0xn]+[101×d]u)=yn([0xnT]u+[101×d]u)=yn[1xnT]u=anTucn=1M=N
  • 演算法
    1. Q=[001×d0d×1Id×d]; p=01×d+1; anT=yn[1xnT]; cn=1
    2. [bw]QP(Q,p,A,c)
    3. gsvm(x)=sign(wTx+b) with [bRwRd]
  • 字詞說明
    • hard-margin => 線性可分,無違反的資料
    • linear => 原始的 xn,無經過任何轉換
  • 非線性做法

SVM 優點

  • 一種 Regularization 
    • 只是反過來求 wTw 的最小值
    • 條件為 Ein=0 甚至還多了相乘必須等於 1 的條件
  • 降低 VC dimention
    • 限定 margin(b,w)=1wρ
    • 原本可以 shatter 的 dimention 會因此無法 shatter
    • 若資料分佈在半徑為 R 的圓內,就二分法而言
      dvc(Aρ)min (R2ρ2,d)+1d+1
  • 降低非線性的複雜度

程式碼

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn import svm
  4.  
  5. # 建立 40 筆資料
  6. np.random.seed(0)
  7. # np.r_ 詳細說明 https://www.ptt.cc/bbs/Python/M.1490169034.A.2D4.html
  8. # np.r_ 的功能為新建立一個 row 陣列
  9. X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
  10. Y = [0] * 20 + [1] * 20
  11.  
  12. # C 越大表示越無法容忍錯誤,故設定一很大的值 for hard margin
  13. g_svm = svm.SVC(kernel='linear', C=1e10)
  14. # 訓練
  15. g_svm.fit(X, Y)
  16.  
  17. # 得到係數,為 wx+b
  18. w = g_svm.coef_[0]
  19. b = g_svm.intercept_[0]
  20. # 直線方程式 y=a1*x+b1
  21. a1 = -w[0] / w[1]
  22. b1 = -b / w[1]
  23. xx = np.linspace(-5, 5)
  24. yy = a1 * xx + b1
  25.  
  26. # 得到第一個 support vectors
  27. p = g_svm.support_vectors_[0]
  28. # 斜率不變,求截距為 b1 = y-a1*x
  29. yy_down = a1 * xx + (p[1] - a1 * p[0])
  30.  
  31. # 得到最後一個 support vectors,與上面相反的 y
  32. p = g_svm.support_vectors_[-1]
  33. # 斜率不變,求截距為 b1 = y-a1*x
  34. yy_up = a1 * xx + (p[1] - a1 * p[0])
  35.  
  36. # 畫圖
  37. plt.plot(xx, yy, 'k-')
  38. plt.plot(xx, yy_down, 'k--')
  39. plt.plot(xx, yy_up, 'k--')
  40.  
  41. # 畫出所有點
  42. plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)
  43. # 將 support vector 標示出來
  44. plt.scatter(g_svm.support_vectors_[:, 0], g_svm.support_vectors_[:, 1], color='g', linewidths=3, linestyle='-', s=100, facecolors='none')
  45.  
  46. plt.show()

參考資料

sklearn.svm.SVC

留言