機器學習--支持向量機 (SVM)算法的原理及優缺點

1、支持向量機 (SVM)算法的原理算法

  支持向量機(Support Vector Machine,常簡稱爲SVM)是一種監督式學習的方法,可普遍地應用於統計分類以及迴歸分析。它是將向量映射到一個更高維的空間裏,在這個空間裏創建有一個最大間隔超平面。在分開數據的超平面的兩邊建有兩個互相平行的超平面,分隔超平面使兩個平行超平面的距離最大化。假定平行超平面間的距離或差距越大,分類器的總偏差越小。函數

  

 

  對於線性可分的支持向量機求解問題實際上可轉化爲一個帶約束條件的最優化求解問題:學習

    推理過程:優化

           

                                                                                  

                                                                                               

                                                                                              

                 結果:spa

                                                       

 

  對於線性不可分的支持向量機求解問題實際上可轉化爲一個帶約束條件的soft-margin最優化求解問題:3d

                             

  算法優勢:  code

  (1)使用核函數能夠向高維空間進行映射orm

  (2)使用核函數能夠解決非線性的分類blog

  (3)分類思想很簡單,就是將樣本與決策面的間隔最大化ci

  (4)分類效果較好

  算法缺點

  (1)SVM算法對大規模訓練樣本難以實施

  (2)用SVM解決多分類問題存在困難

  (3)對缺失數據敏感,對參數和核函數的選擇敏感  

2、代碼實現

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

iris = datasets.load_iris()

X = iris.data
y = iris.target

X = X[y<2,:2]
y = y[y<2]

plt.scatter(X[y==0,0], X[y==0,1], color='red')
plt.scatter(X[y==1,0], X[y==1,1], color='blue')

standardScaler = StandardScaler()
standardScaler.fit(X)
X_standard = standardScaler.transform(X)

svc = LinearSVC(C=1e9)
svc.fit(X_standard, y)

def plot_svc_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 ListedColormap
    custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
    
    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
    
    w = model.coef_[0]
    b = model.intercept_[0]
    
    # w0*x0 + w1*x1 + b = 0
    # => x1 = -w0/w1 * x0 - b/w1
    plot_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')
    
plot_svc_decision_boundary(svc, axis=[-3, 3, -3, 3])
plt.scatter(X_standard[y==0,0], X_standard[y==0,1])
plt.scatter(X_standard[y==1,0], X_standard[y==1,1])

輸出結果:

相關文章
相關標籤/搜索