機器學習(五):SVM支持向量機_Python

機器學習

四、SVM支持向量機

1、代價函數

  • 在邏輯迴歸中,我們的代價爲:
    \cos t({h_\theta }(x),y) = \left{ {\begin{array}{c}    { - \log ({h_\theta }(x))} \\    { - \log (1 - {h_\theta }(x))}  \end{array} \begin{array}{c}    {y = 1} \\    {y = 0}  \end{array} } \right.
    其中:{h_\theta }({\text{z}}) = \frac{1}{{1 + {e^{ - z}}}}z = {\theta ^T}x
  • 如圖所示,如果y=1cost代價函數如圖所示
    ![enter description here][24]
    我們想讓{\theta ^T}x >  > 0,即z>>0,這樣的話cost代價函數纔會趨於最小(這是我們想要的),所以用途中紅色的函數\cos {t_1}(z)代替邏輯迴歸中的cost
  • y=0時同樣,用\cos {t_0}(z)代替
    ![enter description here][25]
  • 最終得到的代價函數爲:
    J(\theta ) = C\sum\limits_{i = 1}^m {[{y^{(i)}}\cos {t_1}({\theta ^T}{x^{(i)}}) + (1 - {y^{(i)}})\cos {t_0}({\theta ^T}{x^{(i)}})} ] + \frac{1}{2}\sum\limits_{j = 1}^{\text{n}} {\theta _j^2}
    最後我們想要\mathop {\min }\limits_\theta  J(\theta )
  • 之前我們邏輯迴歸中的代價函數爲:
    J(\theta ) =  - \frac{1}{m}\sum\limits_{i = 1}^m {[{y^{(i)}}\log ({h_\theta }({x^{(i)}}) + (1 - } {y^{(i)}})\log (1 - {h_\theta }({x^{(i)}})] + \frac{\lambda }{{2m}}\sum\limits_{j = 1}^n {\theta _j^2}
    可以認爲這裏的C = \frac{m}{\lambda },只是表達形式問題,這裏C的值越大,SVM的決策邊界的margin也越大,下面會說明

2、Large Margin

  • 如下圖所示,SVM分類會使用最大的margin將其分開
    ![enter description here][26]
  • 先說一下向量內積

    • u = \left[ {\begin{array}{c}    {{u_1}} \\    {{u_2}}  \end{array} } \right]v = \left[ {\begin{array}{c}    {{v_1}} \\    {{v_2}}  \end{array} } \right]
    • ||u||表示u歐幾里得範數(歐式範數),||u||{\text{ = }}\sqrt {{\text{u}}_1^2 + u_2^2}
    • 向量V向量u上的投影的長度記爲p,則:向量內積:
      {{\text{u}}^T}v = p||u|| = {u_1}{v_1} + {u_2}{v_2}
      ![enter description here][27]
      根據向量夾角公式推導一下即可,\cos \theta  = \frac{{\overrightarrow {\text{u}} \overrightarrow v }}{{|\overrightarrow {\text{u}} ||\overrightarrow v |}}
  • 前面說過,當C越大時,margin也就越大,我們的目的是最小化代價函數J(θ),當margin最大時,C的乘積項\sum\limits_{i = 1}^m {[{y^{(i)}}\cos {t_1}({\theta ^T}{x^{(i)}}) + (1 - {y^{(i)}})\cos {t_0}({\theta ^T}{x^{(i)}})} ]要很小,所以近似爲:
    J(\theta ) = C0 + \frac{1}{2}\sum\limits_{j = 1}^{\text{n}} {\theta _j^2}  = \frac{1}{2}\sum\limits_{j = 1}^{\text{n}} {\theta _j^2}  = \frac{1}{2}(\theta _1^2 + \theta _2^2) = \frac{1}{2}{\sqrt {\theta _1^2 + \theta _2^2} ^2}
    我們最後的目的就是求使代價最小的θ


  • \left{ {\begin{array}{c}    {{\theta ^T}{x^{(i)}} \geqslant 1} \\    {{\theta ^T}{x^{(i)}} \leqslant  - 1}  \end{array} } \right.\begin{array}{c}    {({y^{(i)}} = 1)} \\    {({y^{(i)}} = 0)}  \end{array} 可以得到:
    \left{ {\begin{array}{c}    {{p^{(i)}}||\theta || \geqslant 1} \\    {{p^{(i)}}||\theta || \leqslant  - 1}  \end{array} } \right.\begin{array}{c}    {({y^{(i)}} = 1)} \\    {({y^{(i)}} = 0)}  \end{array} p即爲xθ上的投影
  • 如下圖所示,假設決策邊界如圖,找其中的一個點,到θ上的投影爲p,則p||\theta || \geqslant 1或者p||\theta || \leqslant  - 1,若是p很小,則需要||\theta ||很大,這與我們要求的θ使||\theta || = \frac{1}{2}\sqrt {\theta _1^2 + \theta _2^2} 最小相違背,所以最後求的是large margin
    ![enter description here][28]

3、SVM Kernel(核函數)

  • 對於線性可分的問題,使用線性核函數即可
  • 對於線性不可分的問題,在邏輯迴歸中,我們是將feature映射爲使用多項式的形式1 + {x_1} + {x_2} + x_1^2 + {x_1}{x_2} + x_2^2SVM中也有多項式核函數,但是更常用的是高斯核函數,也稱爲RBF核
  • 高斯核函數爲:f(x) = {e^{ - \frac{{||x - u|{|^2}}}{{2{\sigma ^2}}}}}
    假設如圖幾個點,
    ![enter description here][29]
    令:
    {f_1} = similarity(x,{l^{(1)}}) = {e^{ - \frac{{||x - {l^{(1)}}|{|^2}}}{{2{\sigma ^2}}}}}
    {f_2} = similarity(x,{l^{(2)}}) = {e^{ - \frac{{||x - {l^{(2)}}|{|^2}}}{{2{\sigma ^2}}}}}
    .
    .
    .
  • 可以看出,若是x{l^{(1)}}距離較近,==》{f_1} \approx {e^0} = 1,(即相似度較大)
    若是x{l^{(1)}}距離較遠,==》{f_2} \approx {e^{ - \infty }} = 0,(即相似度較低)
  • 高斯核函數的σ越小,f下降的越快
    ![enter description here][30]
    ![enter description here][31]

  • 如何選擇初始的{l^{(1)}}{l^{(2)}}{l^{(3)}}...

    • 訓練集:(({x^{(1)}},{y^{(1)}}),({x^{(2)}},{y^{(2)}}),...({x^{(m)}},{y^{(m)}}))
    • 選擇:{l^{(1)}} = {x^{(1)}},{l^{(2)}} = {x^{(2)}}...{l^{(m)}} = {x^{(m)}}
    • 對於給出的x,計算f,令:f_0^{(i)} = 1所以:{f^{(i)}} \in {R^{m + 1}}
    • 最小化J求出θ
      J(\theta ) = C\sum\limits_{i = 1}^m {[{y^{(i)}}\cos {t_1}({\theta ^T}{f^{(i)}}) + (1 - {y^{(i)}})\cos {t_0}({\theta ^T}{f^{(i)}})} ] + \frac{1}{2}\sum\limits_{j = 1}^{\text{n}} {\theta _j^2}
    • 如果{\theta ^T}f \geqslant 0,==》預測y=1

4、使用scikit-learn中的SVM模型代碼

    '''data1——線性分類'''
    data1 = spio.loadmat('data1.mat')
    X = data1['X']
    y = data1['y']
    y = np.ravel(y)
    plot_data(X,y)

    model = svm.SVC(C=1.0,kernel='linear').fit(X,y) # 指定核函數爲線性核函數
  • 非線性可分的,默認核函數爲rbf
    '''data2——非線性分類'''
    data2 = spio.loadmat('data2.mat')
    X = data2['X']
    y = data2['y']
    y = np.ravel(y)
    plt = plot_data(X,y)
    plt.show()

    model = svm.SVC(gamma=100).fit(X,y)     # gamma爲核函數的係數,值越大擬合的越好

5、運行結果

  • 線性可分的決策邊界:
    ![enter description here][32]
  • 線性不可分的決策邊界:
    ![enter description here][33]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章