機械学習 - サポートベクターマシン(SVM)アルゴリズムの原理と長所と短所

まず、サポートベクターマシンの原則(SVM)アルゴリズム

  SVM(多くの場合、SVMと呼ばれるサポートベクトルマシンは、)教師あり学習の方法であり、広く統計分類と回帰分析を使用することができます。これは、より高い次元の空間は、この空間内で最大間隔超平面の確立にマッピングされたベクトルです。超平面でデータを分けた2つの超平面は互いに平行であり、2つの離間平行な超平面は、距離を最大にするために超平面。分類の合計誤差も小さく、平行超平面の間の距離またはギャップより大きいと仮定する。

  

 

  以下のための問題を解決する線形分離サポートベクターマシンは、実際に解決するためにベルト制約最適化問題に変換することができます。

    推論:

           

                                                                                  

                                                                                               

                                                                                              

                 結果:

                                                       

 

  線形SVMは切っても切れない、実用上の問題を解決するために解決するためのソフトマージン制約最適化問題のストリップに変換することができます。

                             

  アルゴリズムの利点:  

  カーネル関数を用いて、(1)は、高次元空間にマッピングすることができます

  (2)分類の核非線形関数の使用を解消することができます

  (3)分類アイデアはシンプルですが、それは、サンプル間隔と意思決定の平面を最大化することです

  (4)より良好な分類結果

  アルゴリズムの欠点

  (1) SVMアルゴリズムは、大規模なトレーニングサンプルを実装することは困難です

  (2)マルチ分類SVMとの困難な問題を解決するために

  (3)欠落データ、および敏感なカーネル関数のパラメータの選択に敏感  

第二に、コードの実装

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])

输出结果:

 

おすすめ

転載: www.cnblogs.com/lsm-boke/p/11761534.html