支撐向量機,SVM(Support Vector Machine),其實就是一個線性分類器。算法
首先咱們先來了解下什麼是線性可分。dom
在二維空間上,兩類點被一條直線徹底分開叫作線性可分。函數
嚴格的數學定義是:優化
從二維擴展到多維空間中時,將D0 和D1 徹底正確地劃分開的 wx+b = 0就成了一個超平面。設計
爲了使這個超平面更具魯棒性,咱們會去找最佳超平面,以最大間隔把兩類樣本分開的超平面,也稱之爲最大間隔超平面。3d
兩類樣本分別分割在該超平面的兩側; 兩側距離超平面最近的樣本點到超平面的距離被最大化了。code
將最優決策邊界向上&下平移,在遇到第一個點時停下來,這個點被稱爲支撐向量Support Vector;支撐向量到決策邊界的距離是d;這兩條平移後的直線的間隔(2d)被稱爲最大間隔Margin。blog
支撐向量就是支撐着兩條平移邊界的點,咱們只須要重點研究這幾個支撐向量便可,這也是SVM名稱的由來;**Margin **就是分界面能夠移動的範圍,範圍越大表示容錯能力越強。ip
因此咱們能夠看到,所謂的支撐向量機,最初就是一個線性分類器,只不過這個線性分類器不只能把樣本分對,能夠最大化Margin。ci
到目前爲止,咱們就將SVM轉換爲了一個最優化問題,下面的工做就是求出Margin的數學表達式,即將支撐向量機思想轉化爲數學問題。
而後咱們去找決策邊界的表達式:
以前介紹的SVM,本質上就是個線性分類器,保證Margin最大。實際上都是線性SVM,包括Soft Margin解決的也不是線性不可分問題,而是解決在線性可分問題下存在噪點、異常點等問題。那麼如何解決一個線性不可分問題呢?
處理非線性數據最典型的思路就是使用多項式的方式:擴充本來數據,製造新的多項式特徵。
準備數據: import numpy as np import matplotlib.pyplot as plt from sklearn import datasets
X, y = datasets.make_moons(noise=0.20,random_state=123) plt.scatter(X[y==0,0], X[y==0,1]) plt.scatter(X[y==1,0], X[y==1,1]) plt.show()
下面使用多項式特徵,用SVM算法進行分類:
from sklearn.preprocessing import PolynomialFeatures, StandardScaler from sklearn.svm import LinearSVC from sklearn.pipeline import Pipeline def PolynomialSVC(degree, C=1.0): return Pipeline([ ("poly", PolynomialFeatures(degree=degree)), ("std_scaler", StandardScaler()), ("linearSVC", LinearSVC(C=C)) ]) poly_svc = PolynomialSVC(degree=3) poly_svc.fit(X,y)
而後咱們使用以前用到的plot_decision_boundary方法繪製決策邊界。
經過多項式的方式,讓決策邊界再也不是一條直線了,而是一條曲線。 對於SVM算法來講,能夠不使用多項式PolynomialFeatures的方式。而是使用一種巧妙的方法。
能夠將數據從原始空間映射到Feature Space中去,就能夠解決本來的線性不可分問題。那麼如何作映射呢?
其實咱們並不用特地地去設計映射(實際上咱們也很難在高維空間去設計映射),而是使用固定的幾種映射方法便可。這些映射方法就是核函數。
SVM算法做爲數據挖掘領域十大經典算法之一,其中設計了不少精妙的思想。在這篇文章中,咱們首先回顧瞭如何使用多項式來解決非線性問題。但在SVM中則使用了更加巧妙的方法。
在低維空間中線性不可能的數據,能夠轉化成高維度數據,使得數據更具備分析性;而後使用核函數,其在高維空間上的運算等價於低維空間,從而解決了運算量大的問題。