淺談支持向量機(Support Vector Machine)

自從在學校安定下來後,小編的學習效率和時長提高了不少。在最近五天的時間裏,看了大約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()

效果圖如下所示。

可以看到決策邊界基本將兩類數據分別開來,但這只是在訓練集上的擬合效果,同樣的可能存在過擬合問題。對於擬合問題的解決,可以利用上篇文章中的一些方法進行探究。

好了,本次分享就到這裏了,有什麼錯誤之處,敬請指正。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章