1. 程式人生 > >支援向量機——sklearn 實現支援向量機(SVM)

支援向量機——sklearn 實現支援向量機(SVM)

《Python machine learning》書籍學習~~~

支援向量機的數學模型稍後補上,先來講一下sklearn中的實現。

Support Vector Machine(SVM) ,優化目標與感知機相反,感知機是實現錯誤的最小優化;SVM實現邊緣最大優化。

邊緣(margin):兩個分離差超平面之間的距離

支援向量(support vector):距離分割超平面最近的訓練樣本點


SVM的數學模型稍後補上。

SVC:SVM的一種型別,用於分類;SVR用於迴歸。

【sklearn庫實現SVM】

呼叫sklearn.svm庫中的SVC類。其中C引數是懲罰鬆弛變數。

C值越大,表示對誤分類的懲罰增大,趨向於對於訓練集全部正確分類,泛化能力弱。

C值越小,表示可以容忍錯誤分類,泛化能力強。

from sklearn.svm import SVC
svm = SVC(kernel = 'linear', C = 1.0, random_state = 1)
svm.fit(X_combined_std, y_combined)
plot_decision_regions(X =  X_combined_std, 
                      y = y_combined, 
                      classifier = svm, 
                      test_idx = range(105,150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
#plt.savefig('images/03_06.png', dpi=300)
plt.show()

【解決極大資料集的 SGDClassifier】

perceptron ,LogisticRegression來自於liblinear庫,svc來自於libsvm庫,這兩個庫對於大量的線性分類器允許進行極其快速的訓練。 但是如果訓練資料極其大,  sklearn庫提供了SGDclassifier 類,即stochastic gradient descent classifier(隨機梯度遞減)。可以分別用perceptron,LR,SVM初始化SGDClassifier,loss引數表示損失函式選項,可選擇不同分類器的損失函式。


例如:

from sklearn.linear_model import SGDClassifier
ppn = SGDClassifier(loss = 'perceptron')
lr = SGDClassifier(loss = 'log')#LogisticRegression
svm = SGDClassifier(loss = 'hinge')

【kernel methods  for linearly inseparable data】

#利用異或構造線性不可分資料集
#inlinear dataset
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
X_xor = np.random.randn(200, 2)
#logical_xor(X1,X2)函式,返回   x1邏輯異或x2的結果
y_xor = np.logical_xor(X_xor[:, 0] > 0 , 
                      X_xor[:, 1] > 0)
y_xor = np.where(y_xor,1,-1)   
plt.scatter(X_xor[y_xor == 1, 0],
            X_xor[y_xor == 1, 1], 
            c = 'b', marker = 'x',
            label = '1')

plt.scatter(X_xor[y_xor == -1, 0],
            X_xor[y_xor == -1, 1],
            c = 'r', marker = 's', 
            label = '-1')
plt.xlim([-3, 3])
plt.ylim([-3, 3])
plt.legend(loc='best')
plt.tight_layout()
plt.show()

#利用kernel methods 分類資料集kernel methods  即將二維非線性資料轉換為三維可分資料集,利用下列φ函式

定義kernel function為:

其中比較常用的為radial basic function (RBF)也稱為高斯kernel(Gaussian kenel)

   

常寫作,其中

svc = SVC(kernel ='rbf', C = 10.0, gamma =0.1, random_state = 1 )
svc.fit(X_xor, y_xor)
plot_decision_regions(X= X_xor, y = y_xor, classifier = svc)
plt.legend(loc = 'best')
plt.show()

其中gamma引數越大,分離超平面越嚴格,但是泛化能力越弱。所以gamma函式的調整是調整泛華能力的關鍵。