支持向量機 - 手動計算 w
我正在研究一個簡單的 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} $$
來源