機器學習算法(十)—— SVM支持向量機

1、SVM是什麼

支撐向量機,SVM(Support Vector Machine),其實就是一個線性分類器。算法

1-1 線性可分

首先咱們先來了解下什麼是線性可分。dom

在二維空間上,兩類點被一條直線徹底分開叫作線性可分。函數

嚴格的數學定義是:優化

1-2 最大間隔超平面

從二維擴展到多維空間中時,將D0 和D1 徹底正確地劃分開的 wx+b = 0就成了一個超平面。設計

爲了使這個超平面更具魯棒性,咱們會去找最佳超平面,以最大間隔把兩類樣本分開的超平面,也稱之爲最大間隔超平面。3d

兩類樣本分別分割在該超平面的兩側; 兩側距離超平面最近的樣本點到超平面的距離被最大化了。code

2、 Support Vector & Margin

2.1 定義及思想

將最優決策邊界向上&下平移,在遇到第一個點時停下來,這個點被稱爲支撐向量Support Vector;支撐向量到決策邊界的距離是d;這兩條平移後的直線的間隔(2d)被稱爲最大間隔Marginblog

支撐向量就是支撐着兩條平移邊界的點,咱們只須要重點研究這幾個支撐向量便可,這也是SVM名稱的由來;**Margin **就是分界面能夠移動的範圍,範圍越大表示容錯能力越強。ip

因此咱們能夠看到,所謂的支撐向量機,最初就是一個線性分類器,只不過這個線性分類器不只能把樣本分對,能夠最大化Marginci

到目前爲止,咱們就將SVM轉換爲了一個最優化問題,下面的工做就是求出Margin的數學表達式,即將支撐向量機思想轉化爲數學問題。

2.2 轉化爲最優化問題(核心)

而後咱們去找決策邊界的表達式:

3、巧妙的Kernel Trick

以前介紹的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中則使用了更加巧妙的方法。

在低維空間中線性不可能的數據,能夠轉化成高維度數據,使得數據更具備分析性;而後使用核函數,其在高維空間上的運算等價於低維空間,從而解決了運算量大的問題。

相關文章
相關標籤/搜索