Machine-Learning

支持向量機 - 手動計算 w

  • June 28, 2018

我正在研究一個簡單的 SVM 示例,以獲取其工作方式背後的一些直覺。在 6 個數據點的情況下,是否可以計算和用手?直觀地說,我只能得到一個比例因子的正確值。

使用帶有線性內核的 Sklearn,正確的值是

直覺上我嘗試了不同的值:

  • 和它來自直線的直接方程. 這給出了正確的決策邊界和幾何邊距
  • 和這確保了但並沒有讓我走得更遠

例子

支持向量機簡單

數據集和 Sklearn 結果

import numpy as np
from sklearn.svm import SVC

X = np.array([[3,4],[1,4],[2,3],[6,-1],[7,-1],[5,-3]] )
y = np.array([-1,-1, -1, 1, 1 , 1 ])

clf = SVC(C = 1e5, kernel = 'linear')
clf.fit(X, y) 

通過檢查解決 SVM 問題

通過檢查我們可以看到邊界決策線是函數 $ x_2 = x_1 - 3 $ . 使用公式 $ w^T x + b = 0 $ 我們可以得到參數的第一個猜測為

$$ w = [1,-1] \ \ b = -3 $$

使用這些值,我們將獲得支持向量之間的以下寬度: $ \frac{2}{\sqrt{2}} = \sqrt{2} $ . 再次通過檢查,我們看到支持向量之間的寬度實際上是長度 $ 4 \sqrt{2} $ 意味著這些值不正確。

回想一下,將邊界縮放一個因子 $ c $ 不改變邊界線,因此我們可以將方程推廣為

$$ cx_1 - xc_2 - 3c = 0 $$ $$ w = [c,-c] \ \ b = -3c $$

回到我們得到的寬度的方程

$$ \begin{aligned} \frac{2}{||w||} & = 4 \sqrt{2} \ \frac{2}{\sqrt{2}c} & = 4 \sqrt{2} \ c = \frac{1}{4} \end{aligned} $$

因此參數實際上是 $$ w = [\frac{1}{4},-\frac{1}{4}] \ \ b = -\frac{3}{4} $$

找到的值 $ \alpha_i $ 我們可以使用來自對偶問題的以下兩個約束:

$$ w = \sum_i^m \alpha_i y^{(i)} x^{(i)} $$ $$ \sum_i^m \alpha_i y^{(i)} = 0 $$

並利用以下事實 $ \alpha_i \geq 0 $ 僅對於支持向量(即在這種情況下為 3 個向量),我們獲得聯立線性方程組: $$ \begin{aligned} \begin{bmatrix} 6 \alpha_1 - 2 \alpha_2 - 3 \alpha_3 \ -1 \alpha_1 - 3 \alpha_2 - 4 \alpha_3 \ 1 \alpha_1 - 2 \alpha_2 - 1 \alpha_3 \end{bmatrix} & = \begin{bmatrix} 1/4 \ -1/4 \ 0 \end{bmatrix} \ \alpha & = \begin{bmatrix} 1/16 \ 1/16 \ 0 \end{bmatrix} \end{aligned} $$

來源

引用自:https://stats.stackexchange.com/questions/353552

comments powered by Disqus