目錄
一、為什么需要 SVM?先解決 “怎么分才好” 的問題
二、SVM 的核心:什么是 “最好的超平面”?用 “間隔” 說話
1. 先搞懂兩個關鍵概念
2. 目標:把 “間隔” 拉到最大
三、從 “想要最大間隔” 到 “解數學問題”:SVM 的優化邏輯
1. 把目標 “轉個彎”:從最大化到最小化
2. 加上約束:不能分錯樣本
3. 用拉格朗日乘子法:解帶約束的優化問題
四、SVM 的 “進階技巧”:解決實際問題
1. 軟間隔:允許少量 “不完美”
2. 核函數:把 “低維不可分” 變成 “高維可分”
五、學完 SVM 的一點小感悟
六、機器學習總結
從 “找一條最好的線” 開始:我理解的支持向量機(SVM)核心邏輯
? ? ? 今天跟著課程啃完了機器學習里的支持向量機(SVM),一開始光聽到 “超平面”“間隔最大化” 這些詞還覺得有點繞,但順著邏輯一步步拆下來,發現它的核心思路其實特別 “樸素”—— 本質就是在樣本里找一條 “最穩妥” 的分界線。與其記一堆公式,不如先把背后的道理捋明白,所以想把今天的學習筆記整理出來,也幫自己再順一遍思路。
一、為什么需要 SVM?先解決 “怎么分才好” 的問題
? ? ? 最開始老師拋了個問題:如果給你一堆兩類樣本,比如左邊是紅色點、右邊是藍色點,你怎么畫一條線把它們分開?
? ? ? 我第一反應是 “隨便畫一條不就行?”,但老師緊接著舉了個例子:如果畫的線離某一邊的點特別近,萬一新進來的樣本稍微偏一點,不就分錯了?這時候才意識到,劃分的關鍵不是 “能分開”,而是 “分的穩”—— 也就是這條線對樣本的 “容錯性” 要足夠高,哪怕樣本稍微有點擾動,也不會輕易分錯。
? ? ? 這就是 SVM 的出發點:在樣本空間里找一個 “最優劃分超平面”(對二維數據來說是直線,三維是平面,更高維就是超平面),讓這個超平面能最大限度地 “遠離” 兩邊的樣本,這樣容錯性自然就高了。
二、SVM 的核心:什么是 “最好的超平面”?用 “間隔” 說話
? ? ? 既然要找 “最穩” 的超平面,那怎么量化 “穩不穩”?這里就引出了 “間隔(margin)” 的概念 —— 簡單說,就是超平面到它兩邊最近樣本的距離之和。
1. 先搞懂兩個關鍵概念
? ? ? 超平面本身:它不是隨便畫的,有固定的數學表達。比如 n 維空間里,超平面可以寫成w^T x + b = 0
,其中w
是超平面的法向量(決定超平面的方向),b
是偏置(決定超平面的位置)。像我們熟悉的二維直線Ax + By + C = 0
,其實就是超平面在二維空間的特殊情況。
? ? ? 點到超平面的距離:要算 “間隔”,得先知道單個樣本到超平面的距離。這個公式是從二維直線的距離公式拓展開的 —— 二維里點(x,y)
到Ax+By+C=0
的距離是|Ax+By+C|/√(A2+B2)
,推廣到 n 維,就是|w^T x + b| / ||w||
(||w||
是w
的范數,類似二維里的√(A2+B2)
)。
2. 目標:把 “間隔” 拉到最大
? ? ? SVM 里的 “最優超平面”,就是能讓 “間隔” 最大的那個。為什么是最大間隔?因為間隔越大,超平面離兩邊樣本越遠,后續新樣本進來時,不小心分錯的概率就越小 —— 這就像走馬路,走中間比走路邊更不容易被車碰到,一個道理。
? ? ? 不過這里有個小細節:間隔其實是 “超平面到兩邊最近樣本的距離之和”,我們把這兩個最近的樣本叫做 “支持向量”—— 沒錯,SVM 的名字就是從這來的!因為這兩個點直接決定了超平面的位置和間隔大小,其他樣本哪怕再多,只要不影響這兩個支持向量,對超平面就沒影響。這一點我覺得特別妙,相當于 SVM 只 “關注” 最關鍵的樣本,不被冗余信息干擾。
三、從 “想要最大間隔” 到 “解數學問題”:SVM 的優化邏輯
? ? ? 想清楚 “要最大化間隔” 之后,接下來就是把這個目標變成數學問題來解。這一步一開始有點繞,但跟著老師拆步驟,其實也沒那么難。
1. 把目標 “轉個彎”:從最大化到最小化
? ? ? 首先,我們已經知道間隔的核心是 “超平面到支持向量的距離”,假設這個距離是d
,那間隔就是2d
(兩邊各d
)。要最大化間隔,其實就是最大化d
。
? ? ? 而d
的公式是|w^T x + b| / ||w||
,這里有個小技巧:我們可以通過調整w
和b
的尺度,讓支持向量滿足|w^T x + b| = 1
(因為w
和b
成比例縮放時,超平面位置不變,只是|w^T x + b|
的數值變了,所以可以固定這個值)。這樣一來,d
就變成了1/||w||
。
? ? ? 所以 “最大化d
” 就等價于 “最小化||w||
”—— 不過為了計算方便(比如求導時更簡單),我們通常會最小化(1/2)||w||2
(平方不影響最小值的位置,系數 1/2 是為了求導后抵消)。
2. 加上約束:不能分錯樣本
? ? ? 當然,優化不能沒有約束 —— 我們得保證所有樣本都被超平面正確分類。怎么表達?如果用y
表示樣本類別(正例y=+1
,負例y=-1
),那么對于所有樣本,必須滿足y*(w^T x + b) ≥ 1
。這個式子的意思是:正例的w^T x + b
得是正的,負例的得是負的,而且它們的絕對值都至少是 1(也就是都在支持向量的外側),這樣才能保證分類正確,且間隔是1/||w||
。
3. 用拉格朗日乘子法:解帶約束的優化問題
? ? ? 到這里,問題就變成了 “在y*(w^T x + b) ≥ 1
的約束下,最小化(1/2)||w||2
”—— 這是一個帶不等式約束的優化問題,老師說這種問題通常用 “拉格朗日乘子法” 來解。
? ? ? 具體的推導過程我就不寫太細了(怕自己記混),核心是把 “帶約束的最小化問題” 轉換成 “無約束的對偶問題”—— 簡單說,就是引入拉格朗日乘子α
,把約束條件融入到目標函數里,然后通過對w
和b
求偏導,找到最優解的條件。
? ? ? 最后解出來的結果里,有兩個關鍵結論:
? ? ? (1)最優的w
是所有支持向量乘以其類別和拉格朗日乘子后的總和(w = Σα_i y_i x_i
);
? ? ? (2)所有非支持向量的α_i
都是 0—— 再次印證了 “只有支持向量影響超平面”。
四、SVM 的 “進階技巧”:解決實際問題
? ? ? 理論上的 SVM 要求樣本 “完全線性可分”,但實際數據里難免有噪音(比如個別樣本放錯了類別),或者樣本本身就不是線性可分的(比如像螺旋線一樣繞在一起)。這時候就需要 SVM 的兩個 “進階技能”。
1. 軟間隔:允許少量 “不完美”
? ? ? 如果數據里有噪音,硬要求所有樣本都滿足y*(w^T x + b) ≥ 1
,反而會讓超平面 “拐個彎” 去遷就噪音,導致泛化能力變差(也就是過擬合)。這時候就需要 “軟間隔”—— 允許少數樣本不滿足約束,但要對這些 “不滿足” 的樣本罰分。
? ? ? 具體來說,就是引入一個 “松弛因子”ξ_i
(ξ_i ≥ 0
),把約束條件改成y*(w^T x + b) ≥ 1 - ξ_i
。ξ_i
越大,說明這個樣本離 “理想位置” 越遠,罰分也越重。然后目標函數就變成了(1/2)||w||2 + C*Σξ_i
,其中C
是懲罰系數:
C
越大,說明越不能容忍錯誤,超平面會盡量把所有樣本分對,但可能過擬合;
C
越小,說明可以容忍更多錯誤,超平面更 “平緩”,但可能欠擬合。
2. 核函數:把 “低維不可分” 變成 “高維可分”
? ? ? 如果樣本在低維空間里根本沒法用直線(或超平面)分開,比如二維空間里的 “同心圓” 樣本,怎么辦?老師舉了個特別形象的例子:把二維平面 “掰彎” 成三維的圓錐面,原本的同心圓在三維空間里就變成了兩個平行的圓,這時候用一個平面就能分開了。
? ? ? 這個 “掰彎” 的過程,就是 “特征映射”—— 把低維空間的樣本映射到高維空間。但高維空間的計算量太大了(比如二維映射到 100 維,計算量會爆炸),這時候 “核函數” 就派上用場了。
? ? ? 核函數的神奇之處在于:它能直接計算兩個樣本在高維空間里的內積,而不用真的把樣本映射到高維空間。比如常用的 “高斯核”,就能把低維不可分的數據,在無形中映射到無窮維空間,從而實現線性可分。這一步我目前還沒完全吃透,但記住了核心結論:遇到非線性問題,試試用核函數,比如線性核(適合線性可分)、高斯核(適合非線性)。
五、學完 SVM 的一點小感悟
? ? ? 今天學完 SVM,最大的感受是 “數學是為解決問題服務的”。一開始看到w^T x + b
、拉格朗日乘子這些公式會有點怵,但順著 “找最穩的超平面” 這個核心目標往下拆,每一步推導都有它的道理 —— 不是為了復雜而復雜,而是為了把 “穩” 這個模糊的需求,變成能計算、能求解的數學問題。
? ? ? 另外,SVM 的 “極簡主義” 也很打動我:它只關注支持向量,忽略冗余樣本,既保證了模型的簡潔性,又能有很好的泛化能力。難怪老師說,在小樣本、高維數據(比如文本分類)里,SVM 至今還是很常用的模型。
? ? ? 當然,現在只是搞懂了 SVM 的核心邏輯,后面還需要多做實驗(比如用真實數據集跑一跑,調調C
和核函數的參數),才能真正掌握。不過今天能把 “從找線到解公式” 的邏輯串起來,已經很有成就感啦~
六、機器學習總結
? ? ? 今天這篇文章發完,機器學習的內容我們就告一段落啦,從機器學習的概論描述到KNN、決策樹、隨機森林、邏輯回歸、線性回歸、無監督學習、樸素貝葉斯、支持向量機這些算法學完之后相對于你對機器學習會有進一步的了解,可以用機器學習的算法對數據集完成基本的操作模型任務啦,接下來我會通過之前學習過的東西完成一個大任務哦,盡請期待吧!!!