機器學習“傻瓜式”理解(15)SVM(2)

SVM中的非線性數據進行分類

實際的生產活動中我們遇到的數據大多數不能進行嚴格的區分的,爲了解決這種問題,目前爲止我們可以通過兩種方式來解決:
①直接利用多項式項進行解決。
②利用內核函數(scikit已經封裝好的)
下面我們將通過代碼的方式進行驗證。

1.添加多項式項

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import Standardscaler,PolynomialFeatures
from sklearn.svm import linearSVC
from sklearn.pipeline import Pipeline

'''決策邊界'''
from myML.metrics import plot_decision_boundary

'''模擬數據集'''
X,y = datasets.make_moons(noise=0.15,random_state = 666)
'''查看數據集'''
plt.scatter(X[y==0,0],X[y==0,1],color='red')
plt.scatter(X[y==1,0],X[y==1,1],color='blue')
plt.show()


'''1.使用添加多項式方法'''
def Poly(degree,C= 1.0):
    return Pipeline([
        ('poly',PolynomialFeatures(degree=degree)),
        ('std',Standardscaler()),
        ('svm',linearSVC(C = C))
    ])

poly_svc = Poly(degree=3)
poly_svc.fit(X,y)
plot_decision_boundary(poly_svc, axis=[-1.5, 2.5, -1.0, 1.5])
plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plt.show()


'''2.利用內核函數,直接使用多項式特徵'''
from sklearn.svm import SVC
def PolynomialKernelSVC(degree, C=1.0):
    return Pipeline([
        ('std_scaler', StandardScaler()),
        ('kernelSVC', SVC(kernel='poly', degree=degree, C=C))
    ])

poly_kernel_svc = PolynomialKernelSVC(degree=3)
poly_kernel_svc.fit(X, y)

plot_decision_boundary(poly_kernel_svc, axis=[-1.5, 2.5, -1.0, 1.5])
plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plt.show()

依次運行結果爲:
在這裏插入圖片描述

核函數的介紹應用

核函數分爲多項式核函數以及線性核函數
在這裏插入圖片描述
多項式核函數的內部實現原理:
首先對傳入的數據添加多項式項,然後再返回數據之間進行點乘的結果,其目的便是通過對數據的升維處理使得原本線性不可分的數據線性可分。
例如下例:
在這裏插入圖片描述
轉換後:
在這裏插入圖片描述
(注意:核函數這種技巧並不是SVM所特有,只要是爲了減少計算量或者提高運行速度,都可以使用核函數,但是相對於傳統的機器學習算法,核函數這類的技巧更多的是在SVM中使用。)

SVM的核函數
SVM核函數包括兩種形式,分別爲:
①SVC(kernel = ‘ploy’):表示算法使用多項式核函數;
②SVC(kernel = ‘rbf’):表示算法使用高斯核函數;
高斯核函數是找到更有利於分類任務的樣本空間,開銷巨大,適用於數據集(m,n)m<n,適用於自然語言處理領域。

SVM解決迴歸問題
迴歸問題的本質便是找到一條直線,使得其可以最大程度的擬合住樣本點,但是SVM的迴歸問題便是使得在margin區域中的點儘可能的多,然後中間的那條線便是我們想要的模型。

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