文章引自pluskid於2023年發表於「machine learning」板塊,本文僅做編輯。在最開始討論支援向量機的時候
,我們就假定,資料是線性可分的,亦即我們可以找到乙個可行的超平面將資料完全分開。後來為了處理非線性資料,
使用 kernel 方法對原來的線性 svm 進行了推廣
,使得非線性的的情況也能處理。雖然通過對映 ϕ(
⋅)將原始資料對映到高維空間之後,能夠線性分隔的概率大大增加,但是對於某些情況還是很難處理。例如可能並不是因為資料本身是非線性結構的,而只是因為資料有噪音。對於這種偏離正常位置很遠的資料點,我們稱之為 outlier ,在我們原來的 svm 模型裡,outlier 的存在有可能造成很大的影響,因為超平面本身就是只有少數幾個 support vector 組成的,如果這些 support vector 裡又存在 outlier 的話,其影響就很大了。例如下圖:
用黑圈圈起來的那個藍點是乙個 outlier ,它偏離了自己原本所應該在的那個半空間,如果直接忽略掉它的話,原來的分隔超平面還是挺好的,但是由於這個 outlier 的出現,導致分隔超平面不得不被擠歪了,變成途中黑色虛線所示(這只是乙個示意圖,並沒有嚴格計算精確座標),同時 margin 也相應變小了。當然,更嚴重的情況是,如果這個 outlier 再往右上移動一些距離的話,我們將無法構造出能將資料分開的超平面來。
為了處理這種情況,svm 允許資料點在一定程度上偏離一下超平面。例如上圖中,黑色實線所對應的距離,就是該 outlier 偏離的距離,如果把它移動回來,就剛好落在原來的超平面上,而不會使得超平面發生變形了。具體來說,原來的約束條件 y
i(wt
xi+b
)≥1,
i=1,
…,n
現在變成yi
(wtx
i+b)
≥1−ξ
i,i=
1,…,
n 其中 ξi
≥0稱為鬆弛變數 (slack variable) ,對應資料點 xi
允許偏離的 functional margin 的量。當然,如果我們執行 ξi
任意大的話,那任意的超平面都是符合條件的了。所以,我們在原來的目標函式後面加上一項,使得這些
ξ
i的總和也要最小:
min12∥
w∥2+
c∑i=
1nξi
其中
c
是乙個引數,用於控制目標函式中兩項(「尋找 margin 最大的超平面」和「保證資料點偏差量最小」)之間的權重。注意,其中
ξ
是需要優化的變數(之一),而
c
是乙個事先確定好的常量。完整地寫出來是這個樣子:
mins.t
.,12
∥w∥2
+c∑i
=1nξ
iyi(
wtxi
+b)≥
1−ξi
,i=1
,…,n
ξi≥0
,i=1
,…,n
用之前的方法將限制加入到目標函式中,得到如下問題: l
(w,b
,ξ,α
,r)=
12∥w
∥2+c
∑i=1
nξi–
∑i=1
nαi(
yi(w
txi+
b)−1
+ξi)
–∑i=
1nri
ξi
分析方法和前面一樣,轉換為另乙個問題之後,我們先讓
l
針對 w
、b 和 ξ
最小化:∂l
∂w=0
∂l∂b
=0∂l
∂ξi=
0⇒w=
∑i=1
nαiy
ixi⇒
∑i=1
nαiy
i=0⇒
c−αi
−ri=
0,i=
1,…,
n 將
w
帶回 l
並化簡,得到和原來一樣的目標函式:
maxα∑i
=1nα
i–12
∑i,j
=1nα
iαjy
iyj⟨
xi,x
j⟩
不過,由於我們得到 c−
αi−r
i=0
,而又有 ri
≥0(作為 lagrange multiplier 的條件),因此有 αi
≤c,所以整個 dual 問題現在寫作:
maxαs.
t.,∑
i=1n
αi–1
2∑i,
j=1n
αiαj
yiyj
⟨xi,
xj⟩0
≤αi≤
c,i=
1,…,
n∑i=
1nαi
yi=0
和之前的結果對比一下,可以看到唯一的區別就是現在 dual variableα
多了乙個上限
c
。而 kernel 化的非線性形式也是一樣的,只要把 ⟨x
i,xj
⟩
換成 κ(x
i,xj
)
即可。這樣一來,乙個完整的,可以處理線性和非線性並能容忍噪音和 outliers 的支援向量機才終於介紹完畢了。
SVM熟練到精通1 初識SVM
文章引自pluskid於2010年發表於 machine learning 板塊,本文僅做編輯。支援向量機即 support vector machine 簡稱 svm 我最開始聽說這頭機器的名號的時候,一種神秘感就油然而生,似乎把 support 這麼乙個具體的動作和 vector 這麼乙個抽象的...
程式設計訓練 到底買不買
小紅想買些珠子做一串自己喜歡的珠串。賣珠子的攤主有很多串五顏六色的珠串,但是不肯把任何一串拆散了賣。於是小紅要你幫忙判斷一下,某串珠子裡是否包含了全部自己想要的珠子?如果是,那麼告訴她有多少多餘的珠子 如果不是,那麼告訴她缺了多少珠子。為方便起見,我們用 0 9 a z a z 範圍內的字元來表示顏...
迴圈的熟練應用
階乘為例 while迴圈 includeint main printf d n factor return 0 do while迴圈 includeint main while i n printf d n factor return 0 for迴圈 includeint main printf d...