機器學習——10 支持向量機SVM

1 支持向量機

1.1 故事引入

  • 看下圖左邊,藍色和紅色的點混在一起,這就像一堆數據,沒辦法用一條簡單的直線把它們分開。再看下圖右邊,有一條直線把藍色和紅色的點分開,這就是SVM在找的“決策邊界”,它能把不同類別的數據分開。SVM的目標就是找到這樣一條線,讓不同類別的數據分得最開;

    在這里插入圖片描述

  • 下圖有三條線;

    • 左邊的線,離藍色和紅色的點都太近,這樣分類效果肯定不好,新的數據一來可能就會分錯;
    • 中間那條線,周圍有個黃色的區域,這代表“間隔”,SVM要找的就是間隔最大的那條線,這樣分類才最穩定;
    • 右邊那條線就是間隔最大的,它離兩邊的點都最遠,分類效果最好,這就是SVM的核心思想——最大化間隔

    在這里插入圖片描述

  • 對于下面的三張圖:

    • 左圖,藍色和紅色的點在一個平面上怎么都分不開,就像數據在低維度下沒辦法分類;
    • 在中間的圖中,有一條曲線把它們分開了,這說明有時候得用曲線或者高維度的方式來分類;
    • 右圖,它展示了SVM怎么把低維度的“輸入空間”(Input Space)通過一個函數 φ 映射到高維度的“特征空間”(Feature Space);
      • 在高維度空間里,原本分不開的點就能用一個平面(超平面)分開;
      • 這就是SVM的“核技巧”,不用真的計算高維度的點,而是通過核函數來計算點之間的關系;

    在這里插入圖片描述

1.2 概述

  • **支持向量機(SVM)**的目標是找到一個超平面,將數據樣本分成兩類,并且使得這兩類之間的間隔最大;

    • 下圖中的黑色實線就是這個超平面,而兩側的虛線則表示間隔的邊界;
    • 綠色圓圈標記的點是支持向量,這些點是離超平面最近的樣本點,對確定超平面的位置起到關鍵作用;
    • 間隔越大,分類器的泛化能力通常越好,因為它對新數據的分類更穩定;

    在這里插入圖片描述

  • 下圖比較了不同的分類超平面;

    • 左邊的圖顯示了一些可能的分類線,但這些線并沒有最大化間隔;
    • 右邊的圖則展示了 SVM 找到的最大間隔超平面。可以看到,SVM 的超平面離兩類樣本的距離最遠,這樣可以在分類時提供更好的容錯能力;

    在這里插入圖片描述

  • 硬間隔要求所有樣本都必須被正確分類,并且在分類正確的情況下尋找最大間隔。然而,如果數據中存在異常值(Outlier)或者樣本本身線性不可分,硬間隔就無法實現。左邊的圖顯示了一個異常值導致無法找到硬間隔的情況,而右邊的圖則顯示了即使存在異常值,SVM 仍然嘗試找到一個合理的超平面;

    在這里插入圖片描述

  • 軟間隔允許部分樣本在最大間隔之內,甚至在錯誤的一邊,以尋找最大間隔。目標是在保持間隔寬闊和限制間隔違例之間找到平衡;

    • 懲罰系數 C 控制這個平衡:C 值越小,間隔越寬,但允許的間隔違例越多;C 值越大,間隔越窄,但對間隔違例的懲罰越重;
    • 左邊的圖顯示了 C=100 時的情況,間隔較窄,違例較少;右邊的圖顯示了 C=1 時的情況,間隔較寬,違例較多;

    在這里插入圖片描述

  • **核函數(Kernel)**將原始輸入空間映射到新的特征空間,使得原本線性不可分的樣本在新的特征空間中變得線性可分;

    • 左邊的圖顯示了原始空間中線性不可分的樣本,右邊的圖顯示了通過核函數映射到新特征空間后,樣本變得線性可分,并且可以找到一個決策表面(Decision surface)來分隔兩類樣本;
    • 常用的核函數包括線性核、多項式核、徑向基函數(RBF)核等;

    在這里插入圖片描述

2 API&案例

2.1 API介紹

  • 簡介:

    class sklearn.svm.LinearSVC(C=1.0)
    
    • 庫/框架scikit-learn(通常簡稱為sklearn),這是一個常用的Python機器學習庫;

    • sklearn.svm.LinearSVC,這是scikit-learn庫中用于線性支持向量分類的類;

    • C:懲罰系數,類似于線性回歸中的正則化系數。C值越大,模型對誤分類的懲罰越重,模型越傾向于正確分類每個樣本,但可能會導致過擬合;C值越小,模型對誤分類的懲罰越輕,模型可能更簡單,但可能會導致欠擬合;

  • 示例代碼:

    # 從sklearn.svm模塊中導入LinearSVC類
    from sklearn.svm import LinearSVC
    # 創建LinearSVC類的實例,設置懲罰系數C為30
    mysvc = LinearSVC(C=30)
    # 使用訓練數據X_standard和對應的標簽y來訓練模型
    mysvc.fit(X_standard, y)
    # 輸出模型在訓練數據上的準確率
    print(mysvc.score(X_standard, y))
    

2.2 案例:使用LinearSVC進行鳶尾花分類

  • 自定義的決策邊界繪制工具:

    import numpy as np
    import matplotlib.pyplot as pltdef plot_decision_boundary(model,axis):x0,x1 = np.meshgrid(np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1))X_new = np.c_[x0.ravel(),x1.ravel()]y_predict = model.predict(X_new)zz = y_predict.reshape(x0.shape)from matplotlib.colors import ListedColormapcustom_map = ListedColormap(["#EF9A9A","#FFF59D","#90CAF9"])# plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_map)plt.contourf(x0,x1,zz,cmap=custom_map)def plot_decision_boundary_svc(model,axis):x0,x1 = np.meshgrid(np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1))X_new = np.c_[x0.ravel(),x1.ravel()]y_predict = model.predict(X_new)zz = y_predict.reshape(x0.shape)from matplotlib.colors import ListedColormapcustom_map = ListedColormap(["#EF9A9A","#FFF59D","#90CAF9"])# plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_map)plt.contourf(x0,x1,zz,cmap=custom_map)w= model.coef_[0]b = model.intercept_[0]# w0* x0 + w1* x1+ b = 0#=>x1 = -w0/w1 * x0 - b/w1plot_x = np.linspace(axis[0],axis[1],200)up_y = -w[0]/w[1]* plot_x - b/w[1]+ 1/w[1]down_y = -w[0]/w[1]* plot_x - b/w[1]-1/w[1]up_index =(up_y >= axis[2])&(up_y <= axis[3])down_index =(down_y>= axis[2])&(down_y<= axis[3])plt.plot(plot_x[up_index],up_y[up_index],color="black")plt.plot(plot_x[down_index],down_y[down_index],color="black")
    
  • 導包:

    from sklearn.datasets import load_iris # 加載鳶尾花數據集
    import matplotlib.pyplot as plt
    from sklearn.preprocessing import StandardScaler
    from sklearn.svm import LinearSVC # 導入線性支持向量機分類器
    from sklearn.metrics import accuracy_score # 用于計算模型準確率
    from plot_util import plot_decision_boundary # 導入自定義的決策邊界繪制工具
    
  • 加載數據:

    # 1.加載數據
    # 加載鳶尾花數據集,return_X_y=True表示分別返回特征數據和標簽
    X,y=load_iris(return_X_y=True)print(y.shape) # (150,)。150個樣本
    print(X.shape) # (150, 4)。每個樣本4個特征
    # 為了簡化問題,只選取標簽為0和1的樣本(前兩類鳶尾花),且只使用前兩個特征
    x = X[y<2,:2] # 取y<2的樣本,且只保留前兩個特征
    y = y[y<2] # 相應的標簽也只保留y<2的部分
    print(y.shape) # 輸出 (100,)。 前兩類各50個# 繪制標簽為0的樣本,用紅色表示
    plt.scatter(x[y==0,0],x[y==0,1],c='red')
    # 繪制標簽為1的樣本,用藍色表示
    plt.scatter(x[y==1,0],x[y==1,1],c='blue')
    plt.show()
    

    在這里插入圖片描述

  • 數據的預處理:

    # 2.數據的預處理
    # 創建標準化轉換器,將數據轉換為均值為0,標準差為1的標準正態分布
    transform = StandardScaler()
    # 對特征數據進行擬合和轉換,計算均值和標準差并應用到數據上
    x_tran = transform.fit_transform(x)
    
  • 模型訓練:

    # 3.模型訓練
    # 創建線性支持向量機分類器實例,設置懲罰系數C為10
    # C值越大,對誤分類的懲罰越重,模型可能更復雜,容易過擬合
    model=LinearSVC(C=10)
    model.fit(x_tran,y)
    y_pred = model.predict(x_tran)# 計算并打印模型在訓練數據上的準確率
    # 準確率 = 正確預測的樣本數 / 總樣本數
    print(accuracy_score(y_pred,y)) # 通常會接近1.0,因為是在訓練數據上評估
    

    在這里插入圖片描述

  • 可視化:

    # 4.可視化
    # 繪制模型的決策邊界,axis參數指定了坐標軸的范圍
    plot_decision_boundary(model,axis=[-3,3,-3,3])
    # 在決策邊界圖上繪制標簽為0的標準化樣本點,紅色表示
    plt.scatter(x_tran[y == 0, 0], x_tran[y == 0, 1], c='red')
    # 在決策邊界圖上繪制標簽為1的標準化樣本點,藍色表示
    plt.scatter(x_tran[y==1,0],x_tran[y==1,1],c='blue')
    plt.show()
    

    在這里插入圖片描述

2.3 懲罰系數C對超平面的影響

  • 導包、加載數據、數據預處理同上;

  • C 值越大,間隔越窄,但對間隔違例的懲罰越重;

    在這里插入圖片描述

  • C 值越小,間隔越寬,但允許的間隔違例越多;

    在這里插入圖片描述

3 SVM算法原理

3.1 支持向量機原理

  • SVM思想:找到一組參數(w,b)(w, b)(w,b),使得構建的超平面函數能夠最優地分離兩個集合;

  • 樣本空間中任意點xxx到超平面(w,b)(w, b)(w,b)的距離公式
    r=∣wTx+b∣∥w∥ r = \frac{|w^T x + b|}{\|w\|} r=wwTx+b?

    • 其中,www是超平面的法向量,bbb是超平面的截距,xxx是樣本點,∥w∥\|w\|wwww的范數;
  • 最大間隔的約束條件

    • 對于樣本點xix_ixi?和對應的標簽yiy_iyi?,有:
      {wTxi+b≥+1,yi=+1wTxi+b≤?1,yi=?1 \begin{cases} w^T x_i + b \geq +1, & y_i = +1 \\ w^T x_i + b \leq -1, & y_i = -1 \end{cases} {wTxi?+b+1,wTxi?+b?1,?yi?=+1yi?=?1?
    • 這意味著對于正樣本(yi=+1y_i = +1yi?=+1),wTxi+bw^T x_i + bwTxi?+b至少為+1+1+1
    • 對于負樣本(yi=?1y_i = -1yi?=?1),wTxi+bw^T x_i + bwTxi?+b至多為?1-1?1
  • 支持向量:距離超平面最近的幾個訓練樣本點,使得上述約束條件中的等號成立;

  • 兩個異類支持向量到超平面的距離之和,也是最大間隔距離公式:
    γ=2∥w∥ \gamma = \frac{2}{\|w\|} γ=w2?
    在這里插入圖片描述

  • 目標函數
    max?w,b2∥w∥ \max_{w, b} \frac{2}{\|w\|} w,bmax?w2?

    • 同時滿足約束條件yi(wTxi+b)≥1y_i (w^T x_i + b) \geq 1yi?(wTxi?+b)1,其中i=1,2,??,mi = 1, 2, \cdots, mi=1,2,?,m
  • 目標函數的進一步優化
    min?w,b12∥w∥2 \min_{w, b} \frac{1}{2} \|w\|^2 w,bmin?21?w2

    • 同時滿足約束條件yi(wTxi+b)≥1y_i (w^T x_i + b) \geq 1yi?(wTxi?+b)1,其中i=1,2,??,mi = 1, 2, \cdots, mi=1,2,?,m
  • 添加核函數后的目標函數和約束條件

    • 目標函數:min?w,b12∥w∥2\min_{w, b} \frac{1}{2} \|w\|^2minw,b?21?w2
    • 約束條件:∑i=1n(1?yi(wTΦ(xi)+b))≤0\sum_{i=1}^n (1 - y_i (w^T \Phi(x_i) + b)) \leq 0i=1n?(1?yi?(wTΦ(xi?)+b))0
    • 其中,Φ(xi)\Phi(x_i)Φ(xi?)是將樣本xix_ixi?映射到高維特征空間的函數;
  • 構建拉格朗日函數L(w,b,α)=12∥w∥2?∑i=1nαi(yi(wTΦ(xi)+b)?1)L(w, b, \alpha) = \frac{1}{2} \|w\|^2 - \sum_{i=1}^n \alpha_i (y_i (w^T \Phi(x_i) + b) - 1)L(w,b,α)=21?w2?i=1n?αi?(yi?(wTΦ(xi?)+b)?1)

    • 其中,αi\alpha_iαi?是拉格朗日乘子;
  • 對偶問題轉換min?w,bmax?αL(w,b,α)?max?αmin?w,bL(w,b,α)\min_{w, b} \max_{\alpha} L(w, b, \alpha) \Longleftrightarrow \max_{\alpha} \min_{w, b} L(w, b, \alpha)minw,b?maxα?L(w,b,α)?maxα?minw,b?L(w,b,α)

  • www求偏導并令其等于0

    • 首先,將拉格朗日函數展開:
      L=12∥w∥2?∑i=1nαi(yiwTΦ(xi)+yib?1)L=12∥w∥2?∑i=1nαiyiwTΦ(xi)+αiyib?αi L = \frac{1}{2} \|w\|^2 - \sum_{i=1}^n \alpha_i (y_i w^T \Phi(x_i) + y_i b - 1) \\ L = \frac{1}{2} \|w\|^2 - \sum_{i=1}^n \alpha_i y_i w^T \Phi(x_i) + \alpha_i y_i b - \alpha_i L=21?w2?i=1n?αi?(yi?wTΦ(xi?)+yi?b?1)L=21?w2?i=1n?αi?yi?wTΦ(xi?)+αi?yi?b?αi?

    • www求偏導:
      ?L?w=w?∑i=1nαiyiΦ(xi)=0 \frac{\partial L}{\partial w} = w - \sum_{i=1}^n \alpha_i y_i \Phi(x_i) = 0 ?w?L?=w?i=1n?αi?yi?Φ(xi?)=0

    • 得到:
      w=∑i=1nαiyiΦ(xi) w = \sum_{i=1}^n \alpha_i y_i \Phi(x_i) w=i=1n?αi?yi?Φ(xi?)

  • bbb求偏導并令其等于0

    • bbb求偏導:
      ?L?b=∑i=1nαiyi=0 \frac{\partial L}{\partial b} = \sum_{i=1}^n \alpha_i y_i = 0 ?b?L?=i=1n?αi?yi?=0
    • 得到:
      ∑i=1nαiyi=0 \sum_{i=1}^n \alpha_i y_i = 0 i=1n?αi?yi?=0
  • 將對wwwbbb的偏導結果代入拉格朗日函數:首先,將w=∑i=1nαiyiΦ(xi)w = \sum_{i=1}^n \alpha_i y_i \Phi(x_i)w=i=1n?αi?yi?Φ(xi?)代入拉格朗日函數
    KaTeX parse error: Can't use function '$' in math mode at position 317: … \alpha_i \\ 由于$?\sum_{i=1}^n \a…

3.2 多元支持向量機原理

  • 求解當 α 是什么值時拉格朗日函數最大
    α?=arg?max?α(∑i=1nαi?12∑i,j=1nαiαjyiyjΦT(xi)Φ(xj)) \alpha^* = \arg \max_{\alpha} \left( \sum_{i=1}^n \alpha_i - \frac{1}{2} \sum_{i,j=1}^n \alpha_i \alpha_j y_i y_j \Phi^T(x_i) \Phi(x_j) \right) α?=argαmax?(i=1n?αi??21?i,j=1n?αi?αj?yi?yj?ΦT(xi?)Φ(xj?))

    • 這一步是為了找到最優的拉格朗日乘子 α\alphaα,使得拉格朗日函數最大化

    • αi\alpha_iαi? 是拉格朗日乘子,對應每個樣本的權重

    • yiy_iyi? 是樣本的標簽(+1 或 -1)

    • Φ(xi)\Phi(x_i)Φ(xi?) 是將樣本 xix_ixi? 映射到高維特征空間的函數

    • ΦT(xi)Φ(xj)\Phi^T(x_i) \Phi(x_j)ΦT(xi?)Φ(xj?) 是高維特征空間中樣本 xix_ixi?xjx_jxj? 的內積

  • 將上述公式化簡成極小值問題
    min?α12∑i=1n∑j=1nαiαjyiyj(Φ(xi)?Φ(xj))?∑i=1nαi \min_{\alpha} \frac{1}{2} \sum_{i=1}^n \sum_{j=1}^n \alpha_i \alpha_j y_i y_j (\Phi(x_i) \cdot \Phi(x_j)) - \sum_{i=1}^n \alpha_i αmin?21?i=1n?j=1n?αi?αj?yi?yj?(Φ(xi?)?Φ(xj?))?i=1n?αi?

    • 約束條件:
      s.t.?∑i=1nαiyi=0αi≥0,i=1,2,…,n \text{s.t. } \sum_{i=1}^n \alpha_i y_i = 0 \\ \alpha_i \geq 0, \quad i = 1, 2, \ldots, n s.t.?i=1n?αi?yi?=0αi?0,i=1,2,,n

    • 將最大化問題轉換為最小化問題,便于求解

    • 目標函數是原拉格朗日函數的對偶形式

    • 約束條件確保了最優解的可行性:

      • ∑i=1nαiyi=0\sum_{i=1}^n \alpha_i y_i = 0i=1n?αi?yi?=0 是對偶問題的約束條件
      • αi≥0\alpha_i \geq 0αi?0 是拉格朗日乘子的非負約束
  • 將訓練樣本帶入上面2步驟公式,求解出 αi\alpha_iαi? 值。將 αi\alpha_iαi? 值代入下面公式計算 w,bw, bw,b 的值
    w?=∑i=1Nαi?yiΦ(xi)b?=yi?∑i=1Nαi?yi(Φ(xi)?Φ(xj)) w^* = \sum_{i=1}^N \alpha_i^* y_i \Phi(x_i) \\ b^* = y_i - \sum_{i=1}^N \alpha_i^* y_i (\Phi(x_i) \cdot \Phi(x_j)) w?=i=1N?αi??yi?Φ(xi?)b?=yi??i=1N?αi??yi?(Φ(xi?)?Φ(xj?))

    • 求解出最優的 αi?\alpha_i^*αi?? 后,代入上述公式計算超平面的參數 w?w^*w?b?b^*b?
    • w?w^*w? 是超平面的法向量
    • b?b^*b? 是超平面的截距
  • 求得分類超平面
    w?Φ(x)+b?=0 w^* \Phi(x) + b^* = 0 w?Φ(x)+b?=0

    • 最終的分類超平面由 w?w^*w?b?b^*b? 確定;

    • 對于新樣本 xxx,通過判斷 w?Φ(x)+b?w^* \Phi(x) + b^*w?Φ(x)+b? 的符號來確定其類別。

4 SVM核函數

4.1 概述

  • 核函數將原始輸入空間映射到新的特征空間,從而使原本線性不可分的樣本可能在核空間中變得可分;

    • 左圖顯示了原始空間(Original space)中線性不可分的樣本(紅色和藍色點);
    • 中間圖顯示了通過核函數映射到新的特征空間后,樣本變得線性可分;
    • 右圖進一步展示了這種映射的效果;

    在這里插入圖片描述

  • 核函數分類

    名稱表達式參數
    線性核$ \kappa(\boldsymbol{x}_i, \boldsymbol{x}_j) = \boldsymbol{x}_i^T \boldsymbol{x}_j $無參數
    多項式核$ \kappa(\boldsymbol{x}_i, \boldsymbol{x}_j) = (\boldsymbol{x}_i^T \boldsymbol{x}_j)^d $$ d \geq 1 $ 為多項式的次數
    高斯核$ \kappa(\boldsymbol{x}_i, \boldsymbol{x}_j) = \exp\left( -\frac{|\boldsymbol{x}_i - \boldsymbol{x}_j|2}{2\sigma2} \right) $$ \sigma > 0 $ 為高斯核的帶寬(width)
    拉普拉斯核$ \kappa(\boldsymbol{x}_i, \boldsymbol{x}_j) = \exp\left( -\frac{|\boldsymbol{x}_i - \boldsymbol{x}_j|}{\sigma} \right) $$ \sigma > 0 $
    Sigmoid 核$ \kappa(\boldsymbol{x}_i, \boldsymbol{x}_j) = \tanh(\beta \boldsymbol{x}_i^T \boldsymbol{x}_j + \theta) $$ \tanh $ 為雙曲正切函數,$ \beta > 0 ,, \theta < 0 $
    • 高斯核(徑向基函數)是最常用的核函數之一,它可以將樣本投射到無限維空間,使得原本不可分的數據變得可分。

4.2 高斯核函數

  • 高斯核函數(Radial Basis Function Kernel,RBF 核)是支持向量機(SVM)中常用的核函數之一;
    K(x,y)=e?γ∥x?y∥2K(x, y) = e^{-\gamma \|x - y\|^2}K(x,y)=e?γx?y2

    • $ x $ 和 $ y $ 是樣本點;$ \gamma $ 是超參數,控制高斯分布的寬度;
  • 超參數 $ \gamma $ 的作用

    • $ \gamma $ 越大,高斯分布越窄,模型越容易過擬合;
    • $ \gamma $ 越小,高斯分布越寬,模型越容易欠擬合;
  • 圖示說明

    在這里插入圖片描述

    • 上方的圖顯示了原始樣本點(藍色和紅色);
    • 下方的圖顯示了通過高斯核函數映射后的樣本點(藍色和紅色),可以看到樣本點在新的特征空間中變得線性可分
  • API

    • scikit-learn 中,可以通過以下代碼使用高斯核函數:
      from sklearn.svm import SVC
      # kernel='rbf'表示使用高斯核函數;gamma是超參數,控制高斯分布的寬度
      SVC(kernel='rbf', gamma=gamma)
      
  • 超參數 $ \gamma $ 對模型的影響

    • 左圖($ \gamma = 1.0 $):模型效果合適,分類邊界合理;
    • 中圖($ \gamma = 100 $):模型效果過擬合,分類邊界過于復雜,可能在訓練集上表現很好,但在測試集上表現較差;
    • 右圖($ \gamma = 0.1 $):模型效果欠擬合,分類邊界過于簡單,無法有效區分樣本;

    在這里插入圖片描述

4.3 案例

  • 導包:

    from sklearn.datasets import make_moons
    import matplotlib.pyplot as plt # 生成月牙形數據集
    from sklearn.pipeline import Pipeline # 構建機器學習工作流的管道
    from sklearn.preprocessing import StandardScaler
    from sklearn.svm import SVC # 支持向量機分類器
    from plot_util import plot_decision_boundary # 自定義的決策邊界繪制工具
    
  • 準備數據:

    # 準備數據
    # 生成帶有噪聲的月牙形數據集,noise=0.15控制噪聲大小
    # 月牙形數據是典型的非線性可分數據,適合展示核函數的效果
    x,y=make_moons(noise=0.15)
    # 可視化原始數據分布
    # 繪制標簽為0的樣本點
    plt.scatter(x[y==0, 0], x[y==0, 1])
    # 繪制標簽為1的樣本點
    plt.scatter(x[y==1, 0], x[y==1, 1])
    # 顯示圖形,可觀察到數據呈月牙狀分布,線性不可分
    plt.show()
    

    在這里插入圖片描述

  • 構建函數:

    # 構建函數:創建使用RBF核的SVM模型管道
    def RBFsvm(gamma=0.1):# Pipeline用于將數據預處理和模型訓練步驟串聯起來return Pipeline([# 第一步:數據標準化,將特征轉換為均值為0、標準差為1的分布('std_scalar', StandardScaler()),# 第二步:使用SVM分類器,指定核函數為RBF(徑向基函數)# gamma是RBF核的超參數,控制高斯函數的寬度('svc', SVC(kernel='rbf', gamma=gamma))])
    
  • 實驗1:

    # 實驗1:gamma=0.5時的模型效果
    # 創建gamma=0.5的RBF SVM模型
    svc1 = RBFsvm(0.5)
    # 單獨獲取管道中的標準化器,對數據進行標準化處理
    x_std = svc1['std_scalar'].fit_transform(x)
    # 使用標準化后的數據訓練模型
    svc1.fit(x_std, y)
    # 繪制決策邊界,設置坐標軸范圍
    plot_decision_boundary(svc1, axis=[-3, 3, -3, 3])
    # 在決策邊界圖上繪制標準化后的樣本點
    plt.scatter(x_std[y==0, 0], x_std[y==0, 1])
    plt.scatter(x_std[y==1, 0], x_std[y==1, 1])
    # 顯示圖形,可觀察到較合理的分類邊界
    plt.show()
    

    在這里插入圖片描述

  • 實驗2:

    # 實驗2:gamma=1.0時的模型效果
    # 創建gamma=1.0的RBF SVM模型
    svc1 = RBFsvm(1.0)
    # 使用原始數據訓練模型(管道內部會自動進行標準化)
    svc1.fit(x, y)
    # 繪制決策邊界,設置適合原始數據的坐標軸范圍
    plot_decision_boundary(svc1, axis=[-1.5, 2.5, -1, 1.5])
    # 繪制原始樣本點
    plt.scatter(x[y==0, 0], x[y==0, 1])
    plt.scatter(x[y==1, 0], x[y==1, 1])
    # 顯示圖形,邊界比gamma=0.5時更復雜一些
    plt.show()
    

    在這里插入圖片描述

  • 實驗3:

    # 實驗3:gamma=100時的模型效果
    # 創建gamma=100的RBF SVM模型
    svc2 = RBFsvm(100)
    svc2.fit(x, y)
    plot_decision_boundary(svc2, axis=[-1.5, 2.5, -1, 1.5])
    plt.scatter(x[y==0, 0], x[y==0, 1])
    plt.scatter(x[y==1, 0], x[y==1, 1])
    # 顯示圖形,可觀察到過擬合現象:
    # 決策邊界非常復雜,過度擬合了訓練數據中的噪聲
    plt.show()
    

    在這里插入圖片描述

  • 實驗4:

    # 實驗4:gamma=0.1時的模型效果
    # 創建gamma=0.1的RBF SVM模型
    svc3 = RBFsvm(0.1)
    svc3.fit(x, y)
    plot_decision_boundary(svc3, axis=[-1.5, 2.5, -1, 1.5])
    plt.scatter(x[y==0, 0], x[y==0, 1])
    plt.scatter(x[y==1, 0], x[y==1, 1])
    # 顯示圖形,可觀察到欠擬合現象:
    # 決策邊界過于簡單,無法很好地區分兩類數據
    plt.show()
    

    在這里插入圖片描述

4.4 超參數 gamma 的意義和作用

  • 高斯核函數(RBF)表達式
    K(x,y)=e?γ∥x?y∥2 K(x, y) = e^{-\gamma \|x - y\|^2} K(x,y)=e?γx?y2

  • 對比高斯函數
    g(x)=1σ2πe?12(x?μσ)2 g(x) = \frac{1}{\sigma \sqrt{2\pi}} e^{-\frac{1}{2} \left( \frac{x - \mu}{\sigma} \right)^2} g(x)=σ2π?1?e?21?(σx?μ?)2

  • 超參數 gamma 的意義

    • 高斯核函數中的 gammaγ\gammaγ)等價于高斯函數中的 12σ2\frac{1}{2\sigma^2}2σ21?
    • gamma 控制高斯分布的寬度;
  • 標準差(σ\sigmaσ)對數據分布的影響

    • 標準差越大:數據越分散,圖像越寬;

    • 標準差越小:數據越集中,圖像越窄;

  • 超參數 gamma 對模型的影響

    • gamma 越大:高斯分布越窄,數據變化越劇烈,模型容易過擬合;

    • gamma 越小:高斯分布越寬,數據變化越平緩,模型容易欠擬合;

  • 看下圖中曲線

    在這里插入圖片描述

    • 藍色曲線:μ=0,σ2=0.2\mu = 0, \sigma^2 = 0.2μ=0,σ2=0.2(數據集中,圖像窄)
    • 紅色曲線:μ=0,σ2=1.0\mu = 0, \sigma^2 = 1.0μ=0,σ2=1.0(數據較集中,圖像較窄)
    • 橙色曲線:μ=0,σ2=5.0\mu = 0, \sigma^2 = 5.0μ=0,σ2=5.0(數據分散,圖像寬)
    • 綠色曲線:μ=?2,σ2=0.5\mu = -2, \sigma^2 = 0.5μ=?2,σ2=0.5(數據集中,圖像窄)

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

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

相關文章

若以微服務部署踩坑點

windows docker desktop 部署nacos mysql1、docker部署nacosdocker pull nacos/nacos-server:v2.4.3docker啟動命令 docker run --name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 --privilegedtrue --network bridge -e MODEstandalone -e SPRING_DATASOURCE_PLATFORMm…

Lua基礎+Lua數據類型

Lua基礎 Lua介紹 特點&#xff1a;輕量、小巧。C語言開發。開源。 設計的目的&#xff1a;嵌入到應用程序當中&#xff0c;提供靈活的擴展和定制化的功能。 luanginx&#xff0c;luaredis。 環境安裝 windows上安裝lua&#xff1a; 檢查機器上是否有lua C:\Users\cpf>lua lu…

基于VuePress2開發文檔自部署及嵌入VUE項目

最近在搞前端開發幫助文檔&#xff0c;轉了一圈發現Vue提供了一個高性能的、Vue驅動的靜態網站生成框架-VuePress。VuePress 是一個以 Markdown 為中心的靜態網站生成器。你可以使用 Markdown 來書寫內容&#xff08;如文檔、博客等&#xff09;&#xff0c;然后 VuePress 會生…

Flask初步學習

文章目錄一、初識Flask1.1 Pycharm修改環境配置1.2 運行第一個flask項目1.3 獲取數據請求1.3.1 動態路由參數一、初識Flask 1.1 Pycharm修改環境配置 file——settings——project——python Interpreter——add interpreter——add local interpreter 1.2 運行第一個fla…

word的正則替換

word查看選中了幾行 word替換掉空行 替換空行 按下 “Ctrl H” 組合鍵打開 “查找和替換” 對話框&#xff0c;在 “查找內容” 框中輸入 “pp”&#xff0c;“^p” 代表段落標記&#xff0c;兩個 “^p” 表示連續的兩個段落標記&#xff0c;即空行。在 “替換為” 框中輸入 “…

Spring Framework源碼解析——DisposableBean

版權聲明 本文原創作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl一、概述 DisposableBean 是 Spring 框架中用于定義 Bean 銷毀時回調行為的核心接口之一。它提供了一個標準化的鉤子方法 destroy()&#xff0c;允許 Bean 在容器關閉或作用域…

linux安裝和使用git

Linux 上安裝 Git 在 Linux 上安裝 Git&#xff0c;你可以按照以下步驟進行&#xff1a; 打開終端&#xff1a;打開你的 Linux 終端應用程序。通常可以通過在應用程序菜單中搜索 "Terminal" 或 "終端" 來找到它。 更新軟件包列表&#xff1a;運行以下命令…

數字圖像處理4

預處理——ROI——形態學處理形態學處理形態學變化只能在二值圖上處理1.腐蝕Erode對kernel映射的區域做與操作&#xff0c;包括自己在內如果有0則中間賦值成02.膨脹Dilate對kernel映射的區域做或操作&#xff0c;包括自己在內如果有1則中間賦值成13.其他操作開操作&#xff1a;…

Solon v3.4.3 發布(國產 Java 應用開發生態基座)

Solon 框架&#xff01; Solon 是新一代&#xff0c;Java 企業級應用開發框架。從零開始構建&#xff08;No Java-EE&#xff09;&#xff0c;有靈活的接口規范與開放生態。采用商用友好的 Apache 2.0 開源協議&#xff0c;是“杭州無耳科技有限公司”開源的根級項目&#xff…

Spring-Security-5.7.11升級6.5.2

1.Session Management 1.1.必須明確調用SecurityContextRepository保存SecurityContext 在Spring Security 5中&#xff0c;默認行為是SecurityContext使用SecurityContextPersistenceFilter自動保存到SecurityContextRepository。 //版本5.7.11 //SecurityContextPersisten…

docker下載安裝和使用(Hyper-V方式)

1.環境準備 左鍵單擊電腦左下角開始按鈕—>點擊“設置”—>搜索“Windows功能”—>啟用或關閉Windows功能—>勾選Hyper-v&#xff0c;啟用后電腦會重啟&#xff0c;安裝環境配置成功。 選擇 Hyper-v2.下載docker docker官網下載地址&#xff1a;https://www.docker…

【消息隊列】RabbitMQ “消息隊列模式” 以及NET8集成

在 .NET 8 中集成 RabbitMQ 消息隊列&#xff0c;可以使用官方推薦的 RabbitMQ.Client 庫或封裝好的 MassTransit/EasyNetQ 等高級庫。以下是 RabbitMQ 的基本集成代碼 和 常見消息模式 的實現。 RabbitMQ 本身并沒有直接支持延時消息的功能&#xff0c;但是可以通過一些機制來…

Docker 鏡像常見標簽(如 `標準`、`slim`、`alpine` 和 `noble`)詳細對比

以下是 Docker 鏡像常見標簽&#xff08;如 標準、slim、alpine 和 noble&#xff09;的詳細對比&#xff0c;涵蓋基礎系統、體積、適用場景及注意事項&#xff1a;1. 標準鏡像&#xff08;無后綴&#xff09; 基礎系統&#xff1a;完整 Linux 發行版&#xff08;如 Debian、Ub…

(1-9-2)Java 工廠模式

目錄 1.設計模式與分類 2. 工廠模式 2.1 工廠模式概述 2.2 簡單工廠 2.3 學生推薦就業Demo 00.項目目錄 01. 創建抽象接口Job 02. 創建實體類 03. 創建推薦工作工廠類 04. 創建學生推薦就業客戶類 3. i18n國際化語言標題自適應 00. 實現效果 01. 創建抽象接口 02…

QT遠程開發技巧

交叉編譯時野火提供的文件 交叉編譯器 GNU官網可以下載, QT庫文件這里給的QT-everyWhere版本,是開源版本需要自行編譯。(遠程服務器通常是PC架構【AMD64】,直接apt-get install下載的qt也是Pc架構的,不能直接在板卡【ARM64】上運行,必須對源碼交叉編譯) 注意QT遵從GPL開源…

Linux操作系統從入門到實戰(十九)進程狀態

Linux操作系統從入門到實戰&#xff08;十九&#xff09;進程狀態前言一、什么是進程狀態二、狀態本質三、最核心的3種狀態1. 就緒狀態2. 運行狀態3. 阻塞狀態四、狀態變化的核心1/兩種資源如何影響狀態&#xff1f;五、操作系統怎么管理這些狀態&#xff1f;六、Linux里結構體…

容器技術之docker

容器技術之Docker一、什么是Docker二、為什么會出現Docker2.1 環境一致性問題2.2 虛擬化技術的局限性2.3 微服務架構的興起三、重要概念3.1 什么是鏡像3.2 什么是容器3.3 總結&#xff1a;3.4 Docker倉庫四、安裝Docker&#xff08;Ubuntu系統下&#xff09;1.卸載老的版本2.更…

數據結構與算法:樹狀數組

前言 太難了…… 一、樹狀數組使用場景 樹狀數組一般用來維護可差分的信息&#xff0c;比如累加和&#xff0c;累乘積等。舉個例子&#xff0c;當整個數組的累加和為sum1&#xff0c;一個區間內的累加和為sum2&#xff0c;那么除了這個區間剩下部分的累加和就是sum1-sum2&am…

“一車一碼一池一充”:GB 17761-2024新國標下電動自行車的安全革命

2025年9月1日&#xff0c;電動自行車行業將迎來一場深刻變革。隨著強制性國家標準GB 17761-2024《電動自行車安全技術規范》的全面實施&#xff0c;我國超3.5億電動自行車用戶的安全出行將獲得全新的技術保障。在這場安全升級中&#xff0c;“一車一碼一池一充”的全鏈條管控機…

QT聊天項目DAY18

1.文件傳輸1.1 客戶端采用分塊傳輸(20MB/塊)&#xff0c;以及MD5碼校驗并將讀出的二進制數據采用Base64編碼進行傳輸1.1.0 通信協議1.1.1 UI采用垂直布局&#xff0c;該布局大小為570 * 160&#xff0c;間隔全是0&#xff0c;UI方面不詳細介紹了1.1.2 MainWindow頭文件#ifndef …