機器學習(5)——支持向量機

1. 支持向量機(SVM)是什么?

支持向量機(SVM,Support Vector Machine)是一種監督學習算法,廣泛應用于分類和回歸問題,尤其適用于高維數據的分類。其核心思想是尋找最優分類超平面,使得不同類別的樣本間隔(Margin)最大化,從而提高模型的泛化能力。

2. SVM的基本原理

2.1. 核心思想

  • 目標: 在特征空間中找到一個超平面(決策邊界),使得兩類樣本的間隔最大化
  • 關鍵概念:
    • 支持向量(Support Vectors): 距離超平面最近的樣本點,決定超平面的位置。這些點在定義分類邊界時起著至關重要的作用,因此稱為“支持向量”
    • 間隔(Margin): 支持向量到超平面的距離,越大表示分類器魯棒性越強。SVM通過最大化這個間隔來選擇最佳超平面。

3. 線性可分和非線性可分

  • 線性可分: 如果數據可以通過一個直線(二維空間)或超平面(高維空間)分開,則稱數據是線性可分的。在這種情況下,SVM能夠找到一個線性決策邊界。

  • 非線性可分: 當數據不是線性可分時,我們可以通過核函數將數據映射到更高維的空間,使得在這個高維空間中數據變得線性可分。這個過程稱為核技巧。

4. SVM的數學基礎

4.1. 線性可分情況(硬間隔 SVM)

4.1.1. 間隔最大化

  • 在二維空間中,我們用一個線性決策邊界(直線)來將數據分開。假設數據點可以被線性分開,則可以表示為:
    w ? x + b = 0 w?x+b=0 w?x+b=0

  • 其中:

    • w w w 是法向量,決定超平面的方向。
    • b b b 是偏置項,控制超平面與原點的距離。
    • x x x 是數據點。
  • 目標是找到一個決策邊界,使得不同類別的數據點到該邊界的距離盡量遠。最大化間隔可以轉化為如下的優化問題:

m a x i m i z e 2 ∥ w ∥ maximize \frac{2}{\|w\|} maximizew2?

  • 其中, ∥ w ∥ \|w\| w是法向量的范數,優化的目標是使這個范數最小化,從而間隔最大化。

4.1.2. SVM 的優化目標

  • 假設數據線性可分,SVM 的優化目標是:
    最大化間隔?等價于?最小化 1 2 ∥ w ∥ 2 最大化間隔 \ 等價于 \ 最小化 \frac {1}{2}\|w\|^2 最大化間隔?等價于?最小化21?w2

  • 約束條件: y i ( w T x i + b ) ≥ 1 , ? i y_i(w^T x_i + b) \geq 1, \quad \forall i yi?(wTxi?+b)1,?i

  • 其中

    • w w w:是法向量。
    • b b b :是偏置項。
    • y i ∈ ? 1 , + 1 y_i∈{?1,+1} yi??1,+1:樣本標簽。
  • 幾何解釋:

    • 超平面方程: w T x + b = 0 w^Tx+b=0 wTx+b=0

    • 支持向量滿足 y i ( w T x i + b ) = 1 y_i(w ^Tx_i +b)=1 yi?(wTxi?+b)=1

3. 線性不可分情況(軟間隔 SVM)

當數據存在噪聲或輕微重疊時,引入松弛變量(Slack Variables) ξ i ≥ 0 \xi_i≥0 ξi?0,允許部分樣本違反約束:
最大化間隔?等價于 min ? 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ξ i 最大化間隔 \ 等價于 \min \frac{1}{2} \|w\|^2 + C \sum_{i=1}^{N} \xi_i 最大化間隔?等價于min21?w2+Ci=1N?ξi?

  • ξ i \xi_i ξi?是松弛變量,表示第 i i i個樣本點與分類邊界的偏差。

約束條件:
y i ( w T x i + b ) ≥ 1 ? ξ i , ξ i ≥ 0 y_i(w^T x_i + b) \geq 1 - \xi_i, \xi_i≥0 yi?(wTxi?+b)1?ξi?,ξi?0

  • 參數 C C C:控制分類嚴格性:

    • C C C 大 → 更嚴格(可能過擬合)。

    • C C C 小 → 允許更多錯誤(提高泛化性)。

4. 非線性 SVM(核方法)

當數據非線性可分時,通過核函數(Kernel)將數據映射到高維空間,使其線性可分。

常用核函數

  • 線性核(無映射):
    K ( x i , x j ) = x i T x j K(x_i, x_j) = x_i^T x_j K(xi?,xj?)=xiT?xj?
  • 線性核(無映射):
    K ( x i , x j ) = ( x i T x j + c ) d K(x_i, x_j) = (x_i^T x_j + c)^d K(xi?,xj?)=(xiT?xj?+c)d
  • 高斯核(RBF)(最常用):
    K ( x i , x j ) = exp ? ( ? ∥ x i ? x j ∥ 2 2 σ 2 ) K(x_i, x_j) = \exp \left( -\frac{\|x_i - x_j\|^2}{2\sigma^2} \right) K(xi?,xj?)=exp(?2σ2xi??xj?2?)
    • σ 控制樣本間影響范圍(小 → 過擬合,大 → 欠擬合)。
  • Sigmoid 核:
    K ( x i , x j ) = tanh ? ( α x i T x j + c ) K(x_i, x_j) = \tanh(\alpha x_i^T x_j + c) K(xi?,xj?)=tanh(αxiT?xj?+c)

核技巧(Kernel Trick)

  • 無需顯式計算高維映射 ? ( x ) ?(x) ?(x),直接通過核函數計算內積:
    ? ( x i ) T ? ( x j ) = K ( x i , x j ) \phi(x_i)^T \phi(x_j) = K(x_i, x_j) ?(xi?)T?(xj?)=K(xi?,xj?)

5. 優化方法(對偶問題)

原始問題轉化為拉格朗日對偶問題,通過求解:
max ? α ∑ i = 1 n α i ? 1 2 ∑ i , j α i α j y i y j K ( x i , x j ) \max_{\alpha} \sum_{i=1}^{n} \alpha_i - \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j y_i y_j K(x_i, x_j) αmax?i=1n?αi??21?i,j?αi?αj?yi?yj?K(xi?,xj?)
約束:
∑ i = 1 n α i y i = 0 , 0 ≤ α i ≤ C \sum_{i=1}^{n} \alpha_i y_i = 0, \quad 0 \leq \alpha_i \leq C i=1n?αi?yi?=0,0αi?C

α i α_i αi?:拉格朗日乘子,非零 α i α_i αi? 對應支持向量。

最終決策函數:
f ( x ) = sign ( ∑ i ∈ S V α i y i K ( x i , x ) + b ) f(x) = \text{sign} \left( \sum_{i \in SV} \alpha_i y_i K(x_i, x) + b \right) f(x)=sign(iSV?αi?yi?K(xi?,x)+b)

6. 優缺點

  • ? 優點

    • 高維數據有效(尤其適合文本、圖像)。

    • 核方法處理非線性問題。

    • 泛化能力強(最大化間隔)。

    • 對過擬合有一定魯棒性(通過 C C C 控制)。

  • ? 缺點

    • 計算復雜度高(訓練時間隨樣本數增長)。

    • 對參數( C C C、核參數)敏感。

    • 不直接提供概率輸出(需額外校準)。

7. Python 示例(Scikit-learn)

7.1. 線性 SVM

from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split# 加載數據
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)# 訓練線性SVM(C=1.0)
model = SVC(kernel='linear', C=1.0)
model.fit(X_train, y_train)# 評估
print("Accuracy:", model.score(X_test, y_test))

7.2. 非線性 SVM(RBF 核)

from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler# 標準化數據
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# 訓練RBF核SVM(C=1.0, gamma='scale')
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train_scaled, y_train)# 預測
print("Accuracy:", model.score(X_test_scaled, y_test))

7.3. 支持向量可視化

import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay# 僅用前兩特征簡化可視化
X_2d = X[:, :2]
model = SVC(kernel='linear').fit(X_2d, y)disp = DecisionBoundaryDisplay.from_estimator(model, X_2d, response_method="predict",plot_method="pcolormesh", alpha=0.3,
)
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y, edgecolor='k')
plt.title("SVM Decision Boundary")
plt.show()

8. 關鍵參數調優

  • C C C:平衡分類嚴格性與泛化能力。

    • 網格搜索:GridSearchCV(param_grid={‘C’: [0.1, 1, 10]})
  • 核函數選擇

    • 線性:kernel=‘linear’

    • RBF:kernel=‘rbf’(需調 gamma)

  • γ γ γ(RBF核):

    • 小 → 決策邊界平滑,大 → 復雜(過擬合風險)。

9. 總結

  • SVM 核心:最大化間隔的超平面,支持核方法處理非線性。

  • 關鍵參數:

    • 正則化參數 C C C

    • 核函數類型(RBF/線性/多項式)。

    • RBF 核的 γ γ γ

  • 適用場景:

    • 中小規模高維數據(如文本分類、圖像識別)。

    • 需強泛化能力的分類任務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77170.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77170.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77170.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零到一:網站設計新手如何快速上手?

從零到一:網站設計新手如何快速上手? 在當今數字化時代,網站已成為企業、個人展示信息、提供服務的重要窗口。對于想要涉足網站設計領域的新手而言,如何快速上手并掌握必要的技能成為首要任務。本文將從基礎知識、軟件工具、設計…

藍橋杯2024國B數星星

小明正在一棵樹上數星星,這棵樹有 n 個結點 1,2,?,n。他定義樹上的一個子圖 G 是一顆星星,當且僅當 G 同時滿足: G 是一棵樹。G 中存在某個結點,其度數為 ∣VG?∣?1。其中 ∣VG?∣ 表示這個子圖含有的結點數。 兩顆星星不相…

Django從零搭建賣家中心登陸與注冊實戰

在電商系統開發中,賣家中心是一個重要的組成部分,而用戶注冊與登陸則是賣家中心的第一步。本文將詳細介紹如何使用Django框架從零開始搭建一個功能完善的賣家注冊頁面,包括前端界面設計和后端邏輯實現。 一、項目概述 我們將創建一個名為sel…

Opencv使用cuda實現圖像處理

main.py import os import cv2 print(fOpenCV: {cv2.__version__} for python installed and working) image cv2.imread(bus.jpg) if image is None:print("無法加載圖像1") print(cv2.cuda.getCudaEnabledDeviceCount()) cv2.cuda.setDevice(0) cv2.cuda.printCu…

如何編制實施項目管理章程

本文檔概述了一個項目管理系統的實施計劃,旨在通過統一的業務規范和技術架構,加強集團公司的業務管控,并規范業務管理。系統建設將遵循集團統一模板,確保各單位項目系統建設的標準化和一致性。 實施范圍涵蓋投資管理、立項管理、設計管理、進度管理等多個方面,支持項目全生…

B端可視化方案,如何助力企業精準決策,搶占市場先機

在當今競爭激烈的商業環境中,企業需要快速、準確地做出決策以搶占市場先機。B端可視化方案通過將復雜的企業數據轉化為直觀的圖表和儀表盤,幫助企業管理層和業務人員快速理解數據背后的業務邏輯,從而做出精準決策。本文將深入探討B端可視化方…

基于FPGA的一維時間序列idct變換verilog實現,包含testbench和matlab輔助驗證程序

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1 DCT離散余弦變換 4.2 IDCT逆離散余弦變換 4.3 樹結構實現1024點IDCT的原理 5.算法完整程序工程 1.算法運行效果圖預覽 (完整程序運行后無水印) matlab仿真結果 FPGA仿真結果 由于FP…

Android基礎教程 - 學習完成記錄

視頻學習教程 視頻鏈接:2022 最新 Android 基礎教程,從開發入門到項目實戰,看它就夠了,更新中_嗶哩嗶哩_bilibili 學習下來,有遇到很多問題,在 chatgpt、claude 和 Android Studio 插件通義千問的幫助下&…

Web開發-JavaEE應用原生和FastJson反序列化URLDNS鏈JDBC鏈Gadget手搓

知識點: 1、安全開發-JavaEE-原生序列化-URLDNS鏈分析 2、安全開發-JavaEE-FastJson-JdbcRowSetImpl鏈分析 利用鏈也叫"gadget chains",我們通常稱為gadget: 1、共同條件:實現Serializable或者Externalizable接口&…

OpenCV操作函數

1、cv2.imread() 2、 cv2.imshow() 3、 cv2.waitKey() 4、cv2.imwrite() 5、cv2.selectROI() 6、 cv2.VideoCapture() 7、cv2.cvtColor(&#xff…

AI編程新紀元:GitHub Copilot、CodeGeeX與VS2022的聯合開發實踐

引言:AI編程時代的到來 在軟件開發領域,我們正站在一個歷史性的轉折點上。GitHub Copilot、CodeGeeX等AI編程助手的出現,結合Visual Studio 2022的強大功能,正在重塑代碼編寫的本質。這不僅是工具層面的革新,更是開發范式的根本轉變。能夠有效利用這些AI工具的開發者將跨…

[特殊字符] MySQL MCP 開發實戰:打造智能數據庫操作助手

💡 簡介:本文詳細介紹如何利用MCP(Model-Control-Panel)框架開發MySQL數據庫操作工具,使AI助手能夠直接執行數據庫操作。 📚 目錄 引言MCP框架簡介項目架構設計開發環境搭建核心代碼實現錯誤處理策略運行和…

Dify部署過程中的錯誤和解決方案匯總

本文僅限于記錄Dify部署及使用過程中的BUG和解決方案 1. Dify配置SearXNG時報錯: 報錯內容: PluginInvokeError: {"args":{},"error_type":"ToolProviderCredentialValidationError","message":"Error 4…

C#中async await異步關鍵字用法和異步的底層原理

目錄 C#異步編程一、異步編程基礎二、異步方法的工作原理三、代碼示例四、編譯后的底層實現五、總結 C#異步編程 一、異步編程基礎 異步編程是啥玩意兒 就是讓程序在干等著某些耗時操作(比如等網絡響應、讀寫文件啥的)的時候,能把線程騰出來…

安全教育知識競賽答題小程序怎么做

以下是制作安全教育知識競賽答題小程序的一般步驟: 一、準備階段 注冊小程序賬號:前往微信公眾平臺,注冊一個小程序賬號,主體類型可根據實際情況選擇個人或企業等,注冊成功后登錄獲取appid。 下載安裝開發工具&#x…

記錄待辦事項的便簽軟件有沒有推薦的?

在快節奏的現代生活中,我們每天都要處理大量的工作任務和生活瑣事,稍有不慎就可能遺漏重要事項。你是否經常遇到這樣的情況:明明記得有件事要做,卻怎么也想不起來是什么;或者手頭同時有好幾項任務,卻不知道…

實驗四 中斷實驗

一、實驗目的 掌握中斷服務程序的編寫。 二、實驗電路 三、實驗內容 1.實驗用PC機內部的中斷控制器8259A,中斷源用TPC-ZK實驗箱上的單脈沖電路,將單脈沖電路的輸出接中斷請求信號IRQ,每按一次單脈沖按鍵產生一次…

React 項目src文件結構

SCSS 組件庫 SCSS為預處理器 支持除原生CSS外的其他語句 別名路徑 在項目下的第一級目錄就加入craco.config.js文件并且修改packpage.js 中的部分 // 擴展webpage的配置const path require(path)module.exports {// exports配置webpack:{// 配置別名alias:{:path.resolve(__d…

Cursor入門教程-JetBrains過度向

Cursor使用筆記 **前置:**之前博主使用的是JetBrains的IDE,VSCode使用比較少,所以會盡量朝著JetBrains的使用習慣及樣式去調整。 一、設置語言為中文 如果剛上手Cursor,那么肯定對Cursor中的眾多選項配置項不熟悉,這…

Linux上位機開發實踐(SoC和MCU的差異)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】 soc一般是指跑linux的芯片,而mcu默認是跑rtos的芯片,兩者在基本原理方面其實差異不大。只不過,前者由于性能的原…