【機器學習-10】 | Scikit-Learn工具包進階指南:Scikit-Learn工具包之支持向量機模塊研究

🎩 歡迎來到技術探索的奇幻世界👨?💻

📜 個人主頁:@一倫明悅-CSDN博客

?🏻 作者簡介:?C++軟件開發、Python機器學習愛好者

🗣??互動與支持💬評論?? ? ?👍🏻點贊?? ? ?📂收藏?? ? 👀關注+

如果文章有所幫助,歡迎留下您寶貴的評論,

點贊加收藏支持我,點擊關注,一起進步!

前言 ? ? ? ? ? ? ? ? ? ?? ? ?

???????支持向量機(Support Vector Machine, SVM)是一種強大且靈活的監督學習算法,用于分類和回歸分析。它特別適用于小樣本數據集上的分類問題,同時也能有效地處理高維空間數據。以下是支持向量機的詳細分析和解釋:

原理和工作方式:

  1. 基本概念

    • SVM 的基本目標是找到一個超平面(在二維空間中即為一條直線,在更高維空間中為一個超平面),能夠將不同類別的數據點盡可能分開,同時具有最大的間隔(margin)。
  2. 間隔和支持向量

    • 間隔是指超平面與離它最近的訓練樣本點之間的距離。支持向量則是離超平面最近的那些點。在優化過程中,SVM 將尋找最大化間隔的超平面,并且只有支持向量對超平面的位置起決定性作用。
  3. 數學形式

    • SVM 的數學形式可以用凸優化理論來描述,主要包括最小化正則化的損失函數和約束條件。常見的損失函數包括 Hinge Loss,正則化項可以是 L1 或 L2 范數。

主要優點:

  • 高效處理高維空間數據:由于其核函數技巧,SVM 在高維空間中處理數據效果顯著。
  • 泛化能力強:在小樣本數據上表現良好,并且能夠有效避免過擬合。
  • 可以解決非線性問題:通過選擇合適的核函數(如多項式核、高斯核等),SVM 可以處理非線性分類問題。

主要缺點:

  • 計算效率低下:對于大規模數據集和特征數量較多的情況,訓練時間較長且消耗資源。
  • 對參數調節和核函數的選擇敏感:選擇不當可能導致性能下降。

應用領域:

  • 文本分類:如情感分析、垃圾郵件過濾等。
  • 圖像分類:例如人臉識別、物體識別等。
  • 生物信息學:如蛋白質分類、基因分類等。

SVM 的工作流程:

  1. 數據準備:選擇合適的特征和標簽。
  2. 選擇核函數:根據問題選擇合適的核函數或者直接使用線性核。
  3. 訓練模型:通過優化算法找到最優的超平面。
  4. 預測:使用訓練好的模型對新數據進行分類或回歸預測。

正文? ?

01-使用帶有RBF核的非線性SVC執行二分類任務??? ? ? ? ? ? ? ? ??

????????使用帶有RBF核的非線性支持向量機(SVM)執行二分類任務是一種常見且強大的方法。RBF核(徑向基函數核)允許SVM處理非線性可分的數據集,通過將數據映射到高維空間來構建一個非線性的決策邊界。

1. RBF核的基本概念

RBF核是SVM中最常用的核函數之一,其數學形式為:

[ K(\mathbf{x}_i, \mathbf{x}_j) = \exp \left( -\gamma |\mathbf{x}_i - \mathbf{x}_j|^2 \right) ]

其中,( \gamma )是一個控制RBF核函數衰減速度的參數,(\mathbf{x}_i) 和 ( \mathbf{x}_j) 是數據點。

2. 非線性SVM的工作原理

  • 特征映射:RBF核通過將輸入數據映射到一個高維特征空間,使得原始的非線性可分問題在這個空間中變得線性可分或更容易分割。

  • 最大化間隔:與線性SVM類似,非線性SVM也尋求一個最大化間隔的超平面來分割不同類別的數據點。這個超平面在高維特征空間中對應于一個非線性的決策邊界。

  • 支持向量:在優化過程中,只有位于間隔邊界上的支持向量對構建決策邊界起作用。它們決定了最終模型的形狀和位置。

3. 實施步驟

數據準備

????????首先,準備包含特征和標簽的訓練數據集。

選擇核函數

????????針對非線性問題,選擇RBF核函數是常見且有效的選擇。通過調節 ( \gamma ) 參數可以控制決策邊界的復雜度,過高或過低的 ( \gamma ) 值都可能導致性能下降。

訓練模型

????????使用訓練數據集訓練非線性SVM模型。訓練過程包括優化SVM的損失函數和間隔最大化的目標。

模型預測

????????使用訓練好的模型對新的數據進行分類預測。模型將根據學習到的決策邊界將新數據點分配給各個類別。

4. 優缺點

  • 優點:能夠有效處理非線性問題,具有良好的泛化能力,適用于各種復雜的數據分布。
  • 缺點:依然對參數 ( \gamma ) 和 ( C ) (正則化參數)敏感,需要仔細調參以達到最佳性能。

5. 應用領域

????????非線性SVM在各種領域都有廣泛的應用,特別是在圖像識別、文本分類、生物信息學等需要處理復雜數據結構的任務中表現出色。

????????通過以上步驟和理解,可以詳細分析和解釋使用帶有RBF核的非線性SVM執行二分類任務的過程及其在實際應用中的意義和影響。

這段代碼演示了如何使用支持向量機(SVM)進行二分類,并使用?NuSVC?模型擬合一個 XOR 數據集,并可視化決策邊界。

代碼解釋

  1. 數據生成

    xx, yy = np.meshgrid(np.linspace(-3, 3, 500),np.linspace(-3, 3, 500))
    np.random.seed(0)
    X = np.random.randn(300, 2)
    Y = np.logical_xor(X[:, 0] > 0, X[:, 1] > 0)
    
    • meshgrid?創建了一個二維網格?xx?和?yy,用于繪制決策邊界。
    • np.random.randn(300, 2)?生成一個包含300個樣本的二維隨機數據集?X
    • logical_xor?創建了標簽?Y,其為?True?當且僅當?X[:, 0] > 0?與?X[:, 1] > 0?中有一個成立時。
  2. 模型擬合

    clf = svm.NuSVC(gamma='auto')
    clf.fit(X, Y)
    
    • 使用?NuSVC?模型初始化一個支持向量機分類器,gamma='auto'?表示自動選擇核函數的參數。
    • 使用?fit?方法擬合模型到數據集?(X, Y)?上。
  3. 決策函數計算

    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    
    • decision_function?計算網格上每個點的決策函數值,這些值用于繪制決策邊界。
    • np.c_[xx.ravel(), yy.ravel()]?將網格點展平并連接成二維數組,以便作為輸入進行預測。
    • Z?被重塑為與網格?xx?相同的形狀,以便用于繪制。
  4. 可視化

    plt.imshow(Z, interpolation='nearest',extent=(xx.min(), xx.max(), yy.min(), yy.max()), aspect='auto',origin='lower', cmap=plt.cm.PuOr_r)
    contours = plt.contour(xx, yy, Z, levels=[0], linewidths=2,linestyles='dashed')
    plt.scatter(X[:, 0], X[:, 1], s=30, c=Y, cmap=plt.cm.Paired,edgecolors='k')
    plt.xticks(())
    plt.yticks(())
    plt.axis([-3, 3, -3, 3])
    plt.show()
    
    • imshow?顯示決策函數?Z?的值作為背景色彩圖,extent?確定顯示范圍,cmap?為顏色映射。
    • contour?繪制決策邊界,使用?levels=[0]?表示繪制決策函數為0的等高線。
    • scatter?繪制樣本數據點?X,根據標簽?Y?的不同類別使用不同的顏色。
    • 其他繪圖設置用于美化圖像和刪除坐標軸標簽。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svmxx, yy = np.meshgrid(np.linspace(-3, 3, 500),np.linspace(-3, 3, 500))
np.random.seed(0)
X = np.random.randn(300, 2)
Y = np.logical_xor(X[:, 0] > 0, X[:, 1] > 0)#(譯者注:可以在這里通過顯示Y來查看什么是XOR數據)# 擬合模型
clf = svm.NuSVC(gamma='auto')
clf.fit(X, Y)# 在網格上為每個數據點繪制決策函數
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)plt.imshow(Z, interpolation='nearest',extent=(xx.min(), xx.max(), yy.min(), yy.max()), aspect='auto',origin='lower', cmap=plt.cm.PuOr_r)
contours = plt.contour(xx, yy, Z, levels=[0], linewidths=2,linestyles='dashed')
plt.scatter(X[:, 0], X[:, 1], s=30, c=Y, cmap=plt.cm.Paired,edgecolors='k')
plt.xticks(())
plt.yticks(())
plt.axis([-3, 3, -3, 3])
plt.savefig("../5.png", dpi=500)
plt.show()

結果如下圖所示:

圖像顯示了使用非線性 SVM(使用 RBF 核)在 XOR 數據集上學習的決策邊界。這個數據集在原始空間中是線性不可分的,但在高維特征空間中可能是線性可分的。關鍵點包括:

  • 背景色彩圖:顯示了決策函數的值,越接近0的區域表示決策邊界附近。
  • 虛線等高線:標記了決策函數為0的等高線,即決策邊界。
  • 散點圖:顯示了原始數據點,根據其標簽用不同顏色表示不同類別。

這種圖像演示了 SVM 如何利用 RBF 核處理非線性問題,并展示了如何在二維空間中繪制決策邊界和樣本點。

02-支持向量機:最大邊際分割超平面? ? ? ? ??

????????支持向量機(SVM)中的最大邊際分割超平面是指通過優化過程找到的能夠將不同類別數據點分開并且具有最大間隔(margin)的超平面。以下是對這個概念的詳細解釋:

基本概念

  1. 超平面

    • 在二維空間中,超平面是一條直線;在更高維空間中,它是一個線性決策邊界。超平面能夠將特征空間劃分為兩個部分,每個部分包含一個類別的數據點。
  2. 間隔(Margin)

    • 間隔是指超平面與離它最近的訓練樣本點之間的距離。在 SVM 中,優化的目標是找到最大化間隔的超平面,這使得模型對未見過的數據具有更好的泛化能力。
  3. 支持向量(Support Vectors)

    • 支持向量是離超平面最近的那些數據點。它們是在優化問題中決定超平面位置和方向的關鍵元素。支持向量的位置對于定義決策邊界和最大化間隔至關重要。

工作原理

SVM 的優化過程旨在找到一個超平面,使得:

  • 所有的正樣本點(屬于一個類別的數據點)距離超平面的距離大于等于一個正常數,表示為 ( \gamma );
  • 所有的負樣本點(屬于另一個類別的數據點)距離超平面的距離小于等于一個負常數,表示為 -( \gamma )。

這可以表達為以下約束條件:
[ y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq \gamma \quad \text{對于正樣本} ]
[ y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \leq -\gamma \quad \text{對于負樣本} ]

其中,( \mathbf{w} ) 是超平面的法向量,( b ) 是偏置項,( y_i ) 是樣本 ( \mathbf{x}_i ) 的類別標簽。

數學形式

SVM 的目標函數可以形式化為一個凸優化問題,通常包括:

  • 最小化損失函數(如 Hinge Loss)和/或
  • 正則化項(如 ( L1 ) 或 ( L2 ) 范數)

這些組成部分一起用來確保找到一個最大邊際的超平面,并在優化過程中保持其對訓練數據的泛化能力。

總結

最大邊際分割超平面是支持向量機中核心的概念之一,它通過最大化類別之間的間隔來優化模型的泛化能力。這種方法使得 SVM 在處理小樣本數據和高維特征空間中表現出色,但也需要仔細調參和處理核函數選擇等問題,以達到最佳性能。

這段代碼演示了如何使用支持向量機(SVM)進行二分類,并在二維空間中繪制決策邊界、支持向量以及間隔。讓我們逐步解釋和分析代碼:

代碼解釋

  1. 生成數據集

    X, y = make_blobs(n_samples=40, centers=2, random_state=6)
    
    • 使用?make_blobs?生成一個包含40個樣本的二維數據集?X,每個樣本屬于兩個中心之一,由?centers=2?指定,random_state?用于復現結果。
  2. 模型擬合

    clf = svm.SVC(kernel='linear', C=1000)
    clf.fit(X, y)
    
    • 使用?SVC?初始化一個線性核的支持向量機分類器,C=1000?表示正則化參數的倒數,控制間隔的硬度。
    • 使用?fit?方法將模型擬合到數據集?(X, y)?上。
  3. 繪制數據點

    plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)
    
    • 使用?scatter?繪制數據點?X,不同的類別用不同的顏色標識,顏色映射為?Paired
  4. 繪制決策函數結果

    ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()xx = np.linspace(xlim[0], xlim[1], 30)
    yy = np.linspace(ylim[0], ylim[1], 30)
    YY, XX = np.meshgrid(yy, xx)
    xy = np.vstack([XX.ravel(), YY.ravel()]).T
    Z = clf.decision_function(xy).reshape(XX.shape)ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,linestyles=['--', '-', '--'])
    
    • 獲取當前圖形對象?ax?并獲取當前的 x 和 y 軸限制。
    • 創建一個網格?xx?和?yy,并用?meshgrid?將它們組合成?XX,?YY
    • decision_function?計算網格上每個點的決策函數值,并將結果繪制為等高線?contour
    • levels=[-1, 0, 1]?表示繪制決策函數為?-1,?0,?1?的等高線,分別對應于間隔的邊界和決策邊界。
  5. 繪制支持向量

    ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100,linewidth=1, facecolors='none', edgecolors='k')
    
    • 使用?scatter?繪制支持向量,這些向量是決策邊界上最靠近數據點的樣本。
    • clf.support_vectors_?包含支持向量的坐標,s=100?控制支持向量的大小,facecolors='none'?表示使用空心圓點,edgecolors='k'?表示邊框顏色為黑色。
  6. 保存和顯示圖像

    plt.savefig("../5.png", dpi=500)
    plt.show()
    
    • 使用?savefig?保存圖像為?5.png,分辨率為?500?dpi。
    • plt.show()?顯示生成的圖像。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs# 我們創建40個用來分割的數據點
X, y = make_blobs(n_samples=40, centers=2, random_state=6)# 擬合模型,并且為了展示作用,并不進行標準化
clf = svm.SVC(kernel='linear', C=1000)
clf.fit(X, y)plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)# 繪制decision function的結果
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()# 創造網格來評估模型
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)# 繪制決策邊界和邊際
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,linestyles=['--', '-', '--'])
# 繪制支持向量
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100,linewidth=1, facecolors='none', edgecolors='k')
plt.savefig("../5.png", dpi=500)
plt.show()

這幅圖展示了線性核支持向量機在二維空間中的工作效果:

  • 散點圖:顯示了生成的二維數據集,每個類別用不同顏色表示。
  • 等高線:展示了決策函數的值,黑色虛線表示決策邊界,而實線則表示間隔的邊界。
  • 支持向量:用大圓圈表示的支持向量,它們是決策邊界上距離最近的數據點。

03-帶有自定義核函數的支持向量機? ? ? ? ??

????????帶有自定義核函數的支持向量機(SVM)允許在非線性可分的情況下進行分類,通過將數據映射到高維特征空間來實現線性分離。以下是對帶有自定義核函數的SVM的詳細解釋:

基本概念

  1. 核函數

    • 核函數是SVM中的關鍵概念,它定義了數據如何從輸入空間映射到特征空間。在線性不可分的情況下,通過核函數可以在高維空間中找到線性分割超平面,而無需顯式計算高維特征空間的數據表示。
  2. 支持向量機

    • SVM是一種監督學習算法,其目標是找到一個超平面來最大化不同類別數據點之間的間隔。對于線性不可分的情況,引入核函數使得SVM可以處理復雜的數據結構,如曲線或高度非線性分布的數據。

工作原理

帶有自定義核函數的SVM的工作原理如下:

  1. 核方法

    • SVM使用核方法計算數據點之間的相似性,而不是直接操作高維空間中的數據。核函數可以是多種類型,如線性、多項式、高斯(徑向基函數)等。
  2. 非線性映射

    • 核函數將輸入空間中的數據映射到高維特征空間,使得在高維空間中可能是線性可分的。例如,徑向基函數(RBF)核會將數據映射到無限維的特征空間,在此空間中,數據點更有可能是線性可分的。
  3. 決策邊界

    • 在高維特征空間中,SVM尋找一個最優超平面來分割數據。這個超平面可以被視為在原始輸入空間中復雜邊界的映射。

數學形式

使用核函數的SVM的數學形式如下:

  • 給定一個核函數 ( K(\mathbf{x}_i, \mathbf{x}_j) ),它可以通過內積計算兩個數據點 ( \mathbf{x}_i ) 和 ( \mathbf{x}_j ) 在特征空間中的相似度。

  • 優化目標仍然是找到一個超平面 ( \mathbf{w} \cdot \Phi(\mathbf{x}) + b = 0 ),其中 ( \Phi(\mathbf{x}) ) 是特征空間中的映射函數。

實現和應用

在實際應用中,選擇合適的核函數非常重要,它直接影響了模型的性能和泛化能力。常見的核函數有:

  • 線性核函數( K(\mathbf{x}_i, \mathbf{x}_j) = \mathbf{x}_i \cdot \mathbf{x}_j )
  • 多項式核函數( K(\mathbf{x}_i, \mathbf{x}_j) = (\gamma \mathbf{x}_i \cdot \mathbf{x}_j + r)^d ),其中 ( \gamma )、 ( r ) 和 ( d ) 是參數。
  • 徑向基函數(RBF)核( K(\mathbf{x}_i, \mathbf{x}_j) = \exp(-\gamma ||\mathbf{x}_i - \mathbf{x}_j||^2) ),其中 ( \gamma ) 是參數。

總結

帶有自定義核函數的支持向量機通過核方法將非線性問題映射到高維空間中進行處理,從而實現了在復雜數據結構中的高效分類。選擇合適的核函數和調整其參數對于模型的性能和泛化能力至關重要,這需要根據具體問題進行實驗和優化。

這段代碼演示了如何使用帶有自定義核函數的支持向量機(SVM)對鳶尾花數據集進行分類,并繪制分類結果的決策邊界。

代碼解釋

  1. 導入庫和數據集

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import svm, datasets
    

    這里導入了需要使用的庫,包括NumPy用于數據處理,Matplotlib用于繪圖,以及sklearn中的svm和datasets模塊。

  2. 加載數據

    iris = datasets.load_iris()
    X = iris.data[:, :2]  # 僅使用前兩個特征,這里使用了切片操作
    Y = iris.target
    

    從鳶尾花數據集中加載數據,僅使用前兩個特征(萼片長度和寬度),目標變量為類別標簽。

  3. 定義自定義核函數

    def my_kernel(X, Y):"""我們創建一個自定義的核函數:(2  0)k(X, Y) = X  (    ) Y.T(0  1)"""M = np.array([[2, 0], [0, 1.0]])return np.dot(np.dot(X, M), Y.T)
    

    這里定義了一個簡單的自定義核函數,它是一個線性核函數的變體,通過矩陣M對輸入數據進行線性變換。

  4. 創建SVM實例并擬合數據

    clf = svm.SVC(kernel=my_kernel)
    clf.fit(X, Y)
    

    使用svm.SVC創建了一個支持向量機實例,指定了自定義核函數my_kernel,并對數據進行擬合。

  5. 生成網格并預測

    h = .02  # 設置網格中的步長
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    

    創建了一個網格來覆蓋輸入空間的范圍,并使用訓練好的SVM模型對每個網格點進行分類預測。

  6. 繪制決策邊界和數據點

    Z = Z.reshape(xx.shape)
    plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)# 繪制訓練點
    plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired, edgecolors='k')
    

    使用pcolormesh繪制網格中每個點的預測結果,使用scatter繪制原始數據點,其中不同顏色表示不同的類別。

  7. 圖像設置和顯示

    plt.title('3-Class classification using Support Vector Machine with custom kernel')
    plt.axis('tight')
    plt.show()
    

    設置標題和坐標軸,然后顯示繪制的圖像。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets# 導入數據以便處理
iris = datasets.load_iris()
X = iris.data[:, :2] 
# 我們僅僅使用前兩個特征,我們可以通過使用二維數據集來避免復雜的切片
Y = iris.targetdef my_kernel(X, Y):"""我們創建一個自定義的核函數:(2  0)k(X, Y) = X  (    ) Y.T(0  1)"""M = np.array([[2, 0], [0, 1.0]])return np.dot(np.dot(X, M), Y.T)h = .02  # 設置網格中的步長# 我們創建一個SVM實例并擬合數據。
clf = svm.SVC(kernel=my_kernel)
clf.fit(X, Y)# 繪制決策邊界。為此,我們將為網格[x_min,x_max] x [y_min,y_max]中的每個點分配顏色。
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])# 將結果放入顏色圖
Z = Z.reshape(xx.shape)
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)# 繪制訓練點
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired, edgecolors='k')
plt.title('3-Class classification using Support Vector Machine with custom'' kernel')
plt.axis('tight')
plt.savefig("../5.png", dpi=500)
plt.show()
  • 背景色塊和決策邊界

    • 背景色塊通過顏色區分了不同類別的預測區域,每個顏色塊表示SVM預測該區域內的所有點屬于同一類別。
    • 決策邊界是分類器在特征空間中的決策界限,分隔不同類別的區域。
  • 數據點

    • 數據點在圖中以散點的形式顯示,每種類別使用不同的顏色表示,有助于可視化各個類別在特征空間中的分布。

這樣,通過自定義核函數,支持向量機能夠有效地處理非線性問題,并提供清晰的分類決策邊界。

04-繪制線性支持向量機(基于liblinear)的支持向量

????????

繪制線性支持向量機(Linear SVM)基于liblinear的支持向量,需要了解以下幾個關鍵點:

線性支持向量機(Linear SVM)

  1. 核心概念

    • 線性支持向量機是通過一個線性超平面來分割數據空間,使得不同類別的數據點能夠盡可能遠離超平面,從而構建最優的分類邊界。
  2. 支持向量

    • 支持向量是離超平面最近的數據點,它們決定了超平面的位置。在線性情況下,支持向量通常位于分類邊界附近,是決策邊界的主要構成部分。

繪制支持向量的步驟解釋

  1. 使用LinearSVC初始化模型

    from sklearn.svm import LinearSVC
    model = LinearSVC()
    model.fit(X, Y)
    
    • LinearSVC是scikit-learn中專門用于線性SVM分類的模型。通過fit方法訓練模型,其中X是特征數據,Y是對應的類別標簽。
  2. 獲取支持向量

    support_vectors = model.support_vectors_
    
    • support_vectors_屬性可以獲取模型中找到的支持向量的數據點。
  3. 繪制支持向量和決策邊界

    plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired, edgecolors='k')
    plt.scatter(support_vectors[:, 0], support_vectors[:, 1], s=100, facecolors='none', edgecolors='k')
    
    • 使用scatter方法繪制所有數據點,其中不同顏色代表不同類別。
    • 使用scatter方法再次繪制支持向量,通常使用圓圈標識,以突出顯示它們。
  4. 設置圖像屬性

    plt.title('Support Vectors of Linear SVM (liblinear)')
    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.show()
    
    • 添加標題和坐標軸標簽,最后使用show方法展示繪制的圖像。

圖像解釋

  • 數據點

    • 所有數據點通過散點圖顯示,顏色表示它們的類別。這些點包括訓練集中的所有數據。
  • 支持向量

    • 通過繪制大圓圈(只有邊界沒有填充)標識出模型確定的支持向量。這些點是模型決策邊界最接近的數據點,對模型的決策起到關鍵作用。
  • 決策邊界

    • 在線性SVM中,決策邊界是一個直線,它在特征空間中分隔不同類別的數據點。

通過這種方式,可以清晰地展示線性支持向量機的工作原理及其在數據集上的表現,特別是如何通過支持向量確定最優的分類邊界。

這段代碼演示了如何使用Scikit-Learn的LinearSVC繪制線性支持向量機(Linear SVM)的決策邊界和支持向量。

代碼解釋

  1. 數據生成與初始化模型

    X, y = make_blobs(n_samples=40, centers=2, random_state=0)
    
    • 使用make_blobs生成一個二分類的數據集,共40個樣本,用于模擬實際數據。
  2. 模型訓練與決策邊界繪制

    for i, C in enumerate([1, 100]):clf = LinearSVC(C=C, loss="hinge", random_state=42).fit(X, y)decision_function = clf.decision_function(X)support_vector_indices = np.where((2 * y - 1) * decision_function <= 1)[0]support_vectors = X[support_vector_indices]
    
    • 對每個參數C(正則化參數)分別訓練一個LinearSVC模型。loss="hinge"指定了線性SVM所使用的損失函數。
    • decision_function計算決策函數的值,支持向量的索引通過條件(2 * y - 1) * decision_function <= 1確定。
    • 支持向量通過這些索引從數據集X中獲取。
  3. 繪制圖像

    plt.subplot(1, 2, i + 1)
    plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)
    ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()
    xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 50),np.linspace(ylim[0], ylim[1], 50))
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,linestyles=['--', '-', '--'])
    plt.scatter(support_vectors[:, 0], support_vectors[:, 1], s=100,linewidth=1, facecolors='none', edgecolors='k')
    plt.title("C=" + str(C))
    
    • 使用subplot在一行兩列中創建子圖,分別展示不同參數C的結果。
    • 通過scatter方法繪制所有數據點,根據類別用不同顏色標示。
    • 使用contour函數繪制決策邊界,其中levels=[-1, 0, 1]繪制了決策函數為-1、0、1的等高線,代表不同的決策邊界。
    • 通過scatter繪制支持向量,使用大圓圈表示,以突出顯示它們。
  4. 圖像屬性設置與展示

    plt.tight_layout()
    plt.savefig("../5.png", dpi=500)
    plt.show()
    
    • 使用tight_layout確保圖像布局合適。
    • savefig保存圖像為高分辨率PNG格式。
    • show展示生成的圖像。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.svm import LinearSVCX, y = make_blobs(n_samples=40, centers=2, random_state=0)plt.figure(figsize=(10, 5))
for i, C in enumerate([1, 100]):# "hinge"是支持向量機慣例使用的損失函數clf = LinearSVC(C=C, loss="hinge", random_state=42).fit(X, y)# 通過決策函數獲得支持向量decision_function = clf.decision_function(X)# 我們也可以手動計算決策函數# decision_function = np.dot(X, clf.coef_[0]) + clf.intercept_[0]support_vector_indices = np.where((2 * y - 1) * decision_function <= 1)[0]support_vectors = X[support_vector_indices]plt.subplot(1, 2, i + 1)plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)ax = plt.gca()xlim = ax.get_xlim()ylim = ax.get_ylim()xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 50),np.linspace(ylim[0], ylim[1], 50))Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,linestyles=['--', '-', '--'])plt.scatter(support_vectors[:, 0], support_vectors[:, 1], s=100,linewidth=1, facecolors='none', edgecolors='k')plt.title("C=" + str(C))
plt.tight_layout()
plt.savefig("../5.png", dpi=500)
plt.show()
  • 左圖(C=1):較小的正則化參數C,決策邊界可以更接近一些數據點,支持向量的數量較多。
  • 右圖(C=100):較大的正則化參數C,決策邊界更嚴格,支持向量的數量較少。

在每幅圖中,數據點用不同顏色表示不同的類別,決策邊界用黑色實線(0值)、虛線(-1和1值)表示,支持向量用大圓圈標出。這種可視化方式清晰地展示了線性支持向量機在不同正則化參數下的決策邊界和支持向量位置。

總結? ? ? ? ? ? ? ? ? ? ? ??

????????總之,支持向量機因其在解決小樣本問題和處理高維數據時的優秀表現而受到廣泛關注,盡管需要注意的是在大數據集和復雜問題上可能面臨一些挑戰。

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

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

相關文章

高考填報志愿攻略,5個步驟選專業和院校

在高考完畢出成績的時候&#xff0c;很多人會陷入迷茫中&#xff0c;好像努力了這么多年&#xff0c;卻不知道怎么規劃好未來。怎么填報志愿合適&#xff1f;在填報志愿方面有幾個內容需要弄清楚&#xff0c;按部就班就能找到方向&#xff0c;一起來了解一下正確的步驟吧。 第…

入局AI手機 蘋果公布Apple Intelligence

日前&#xff0c;蘋果WWDC 2024如期召開。在這持續1個小時44分鐘的開發者大會上&#xff0c;蘋果在前一個小時里更新了iOS、iPadOS、MacOS等操作系統&#xff0c;而且還首次更新了visionOS。余下的時間全部留給了蘋果的“AI大禮包”——Apple Intelligence&#xff08;蘋果智能…

請說明Thread類中run和start的區別,從方法的區別,及運行結果的區別分別說明

方法本身的區別 start() 方法&#xff1a; run()方法是Thread類的一個普通方法&#xff0c;它包含了線程要執行的代碼。當你直接調用一個線程的run()方法&#xff08;如myThread.run()&#xff09;&#xff0c;你實際上是在當前線程&#xff08;通常是主線程&#xff09;中執行…

PointCloudLib-濾波模塊(Filtering)-使用參數化模型投影點

在本教程中,我們將學習如何將點投影到參數化模型上 (例如,平面、球體等)。參數模型通過一組 系數 – 在平面的情況下,通過其方程:ax + by + cz + d = 0。 代碼 #include <iostream> #include <pcl/point_cloud.h> // for PointCloud #include <pcl/point…

mysql是什么

mysql是什么 是DBMS軟件系統&#xff0c;并不是一個數據庫&#xff0c;管理數據庫 DBMS相當于用戶和數據庫之間的橋梁&#xff0c;有超過300種不同的dbms系統 mysql是關系型數據庫&#xff0c;關系型數據庫存儲模型很想excel&#xff0c;用行和列組織數據 sql是一門編程語言…

關于ip地址的網頁無法訪問navigator的gpu、媒體、藍牙等設備的解決方法

在使用threejs的WebGPURenderer渲染器時&#xff0c;發現localhost以及127.0.0.1才能訪問到navigator.gpu&#xff0c;直接使用ip會變成undefined,原因是為了用戶的隱私安全&#xff0c;只能在安全的上下文中使用&#xff0c;非安全的上下文就會是undefined&#xff0c;安全上下…

谷歌云(GCP)4門1453元最熱門證書限時免費考

谷歌云(GCP)最新活動&#xff0c;完成免費官方課程&#xff0c;送4門最熱門考試免費考試券1張(每張價值200刀/1453元)&#xff0c;這4門也包括最近大熱的AI/ML考試&#xff0c;非常值得學習和參加&#xff0c;活動7/17截止 谷歌云是全球最火的三大云計算廠商(前兩名AWS, Azure…

MySQL索引優化解決方案--索引失效(3)

索引失效情況 最佳左前綴法則&#xff1a;如果索引了多列&#xff0c;要遵循最左前綴法則&#xff0c;指的是查詢從索引的最左前列開始并且不跳過索引中的列。不在索引列上做任何計算、函數操作&#xff0c;會導致索引失效而轉向全表掃描存儲引擎不能使用索引中范圍條件右邊的…

【Linux】進程信號_1

文章目錄 八、進程信號1.信號 未完待續 八、進程信號 1.信號 信號和信號量之間沒有任何關系。信號是Linux系統提供的讓用戶/進程給其他進程發送異步信息的一種方式。 常見信號&#xff1a; 當信號產生時&#xff0c;可選的處理方式有三種&#xff1a;①忽略此信號。②執行該…

小程序注冊

【 一 】小程序注冊 微信公眾平臺 https://mp.weixin.qq.com/ https://mp.weixin.qq.com/注冊 郵箱激活 小程序賬戶注冊 微信小程序配置 微信小程序開發流程 添加項目成員 【 二 】云服務 lass 基礎設施服務&#xff08;組裝機&#xff09; 你買了一大堆的電腦配件&#x…

AI早班車2024.6.25

全球AI新聞速遞 1.高通&#xff1a;開放 AI 模型&#xff0c;幫助開發者打造驍龍 X Elite 平臺智能應用。 2.OpenAI&#xff1a;收購數據庫分析公司Rockset。 3.大眾海外版車型支持 ChatGPT。 4.樂聚夸父人形機器人&#xff0c;搭載華為云盤古具身智能大模型。 5.微軟正努力…

Day45

Day45 jQuery動畫 顯示和隱藏 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script src"js/jquery-1.8.2.js" type"text/javascript" charset"utf-8"></script&…

Linux系統移動光標類命令

天行健&#xff0c;君子以自強不息&#xff1b;地勢坤&#xff0c;君子以厚德載物。 每個人都有惰性&#xff0c;但不斷學習是好好生活的根本&#xff0c;共勉&#xff01; 文章均為學習整理筆記&#xff0c;分享記錄為主&#xff0c;如有錯誤請指正&#xff0c;共同學習進步。…

iHRM人力資源管理系統測試用例集

1、初始化項目環境 1&#xff09;初始化用例集 2&#xff09;初始化環境&#xff1a;測試環境&#xff0c;生產環境&#xff08;不同環境對應不同的url&#xff0c;在進行用例集測試之前一定要指定環境&#xff09; 3&#xff09;單接口模塊 從Excel表格的測試用例文檔中提…

云南省森林管理新篇章:可視化大屏引領綠色智慧革命

在云南省這片綠意盎然的土地上&#xff0c;森林不僅是自然的寶藏&#xff0c;更是生態的守護者。 想象一下&#xff0c;站在巨大的屏幕前&#xff0c;云南省的森林分布、生長狀況、病蟲害情況等信息一目了然&#xff0c;仿佛擁有了一雙能夠洞察森林奧秘的“智慧眼”。這正是森林…

輸入/輸出文字

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在海龜繪圖中&#xff0c;也可以輸入或者輸出文字&#xff0c;下面分別進行介紹。 1 輸出文字 輸出文字可以使用write()方法來實現&#xff0c;語…

使用Python實現手勢替代鼠標操作并生成.exe可執行文件

使用Python實現手勢替代鼠標操作并生成.exe可執行文件 在現代計算機交互中&#xff0c;手勢識別作為一種自然的人機交互方式&#xff0c;逐漸受到人們的關注。本文將介紹如何使用Python實現手勢替代鼠標操作&#xff0c;并生成一個可執行的.exe文件&#xff0c;使得這項技術更…

python常見概念

文章目錄 1.python是什么&#xff1f;2.編輯器的選擇——pycharm3.第一個python程序4.print函數5.關鍵字介紹6.python的注釋方式7.python語句分類 1.python是什么&#xff1f; Python 是一種面向對象的解釋性的計算機程序設計語言&#xff0c;也是一種功能強大而完善的通用型語…

濁度傳感器設備的監測控制和智慧運維

濁度傳感器是一種用于測量液體中懸浮顆粒濃度從而反映液體濁度的設備。 其工作原理主要基于以下幾種常見方式&#xff1a; 1. 散射光測量原理&#xff1a;當光線穿過含有懸浮顆粒的液體時&#xff0c;顆粒會使光線發生散射。傳感器通過測量特定角度的散射光強度來確定濁度。散…