自從在學校安定下來後,小編的學習效率和時長提高了不少。在最近五天的時間裏,看了大約20節視頻並做了對應章節的編程練習。
上一篇文章介紹了欠擬合和過擬合的知識,這次給小夥伴們介紹下支持向量機的知識。
支持向量機和邏輯迴歸(Logistic Regression)很相像,從一方面看,支持向量機是邏輯迴歸的變化版。其重要的區別在於損失函數的不同。
(細線是邏輯迴歸的損失函數圖像,粗線是支持向量機的損失函數圖像)
如果數據是線性可分(能通過一條直線將不同類別區分開來),支持向量機看起來就是和邏輯迴歸使用了不同但很相似的損失函數,往往這兩個分類器的效果也差不多。
如果數據不是線性可分的,支持向量機就要藉助一個名叫“核函數”的東西來構造非線性邊界。核函數是用來衡量兩個向量的相似度,如果兩個向量的相似度越高,核函數的返回值越大。
常見的核函數有如下幾種:
1.線性內核:表示支持向量機不借助核函數來分類。
2.高斯內核:利用高斯公式 計算兩個向量的相似度。
3.多項式內核:利用 公式計算兩個向量的相似度。
下面小編分別用線性內核和高斯內核來實際操作下。
使用線性內核的支持向量機
只有數據集是線性可分的時候,使用線性內核的支持向量機才能夠取得較好的效果。數據集是由二維座標組成的,數據分佈圖如下。
利用Python的sklearn包,使用線性內核的支持向量機訓練數據集的代碼如下。
linear_svm = svm.SVC(kernel='linear', C=100) #C越大越容易過擬合
linear_svm.fit(X_train, Y_train)
繪製的線性決策邊界如下圖所示。
這裏,我使用的參數C的值爲100,較大,對訓練集的擬合效果足夠好了,可以看到已經把所有的數據正確的劃分開,但不一定代表這個模型就好,很有可能出現過擬合問題。
使用高斯內核的支持向量機
當我們的數據集不再線性可分,我們就要藉助"核函數"來構造一個非線性的決策邊界。比如數據集分佈如下。
利用高斯函數訓練並繪製決策邊界的Python代碼如下。
#利用核函數爲高斯函數的支持向量機訓練並繪製決策邊界
def plot_boundray():
X = []
X1 = 0
x2 = 0
for i in range(0,100,1):
X1 = i/100
for j in range(40,100,1):
X2 = j/100
X.append([X1, X2])
linear_svm = svm.SVC(kernel='rbf', gamma=50, C=100)
linear_svm.fit(X_train, Y_train)
Y = linear_svm.predict(X)
print(linear_svm.score(X_train, Y_train))
X1_positive, X2_positive, X1_negative, X2_negative = divide_data_by_class(np.array(X), Y)
plt.scatter(X1_negative, X2_negative, marker='*', color='green')
X1_positive, X2_positive, X1_negative, X2_negative = divide_data_by_class(X_train, Y_train)
plt.scatter(X1_positive, X2_positive, marker='+')
plt.scatter(X1_negative, X2_negative, marker='.', color ='red')
plt.show()
效果圖如下所示。
可以看到決策邊界基本將兩類數據分別開來,但這只是在訓練集上的擬合效果,同樣的可能存在過擬合問題。對於擬合問題的解決,可以利用上篇文章中的一些方法進行探究。
好了,本次分享就到這裏了,有什麼錯誤之處,敬請指正。