sklearn的svm使用方法
from sklearn.svm import SVC
import numpy as np
# 構(gòu)造數(shù)據(jù)
X= np.array([[-1,-1],[-2,-1],[1,1],[2,1]])
y = np.array([-1,-1, 1, 1])
# 數(shù)據(jù)集線性可分办龄,使用最簡(jiǎn)單的線性核
svc = SVC(kernel='linear')
svc.fit(X, y)
testX = [[-5, -7], [-3, -1], [-7, -89], [5, 7], [3, 1], [7, 89]]
# 輸出 testY = [-1, -1, -1, 1, 1, 1]
print(svc.predict(testX))
以上就是一個(gè)簡(jiǎn)單的svm實(shí)例糕非。
線性分類問題
對(duì)于一個(gè)線性分類問題立宜,假設(shè)有n個(gè)樣本向量藕各,就可以找到一個(gè)超平面將正反向量分隔開。如圖:
但是圖中有三條線可以將其分隔開片效,都是分類面红伦,實(shí)際上,可以找到中間有無數(shù)條分類面淀衣,但是圖中黑色的線分隔效果要比另外兩條線要好昙读,因?yàn)楹诰€離兩個(gè)樣本的距離比另外兩條線要遠(yuǎn)(比如綠線更靠近綠色樣本,以此為分類面時(shí)膨桥,更容易將實(shí)際上綠色的點(diǎn)劃歸紅色區(qū)域)蛮浑。
因此線性分類問題實(shí)際上需要求出類似于圖中黑色的線. 盜用Wikipedia的圖:
其中f(x) = w·x + b, 就是需要求的分類面,圖中寫的是f(x) = w·x - b只嚣,其實(shí)都一樣沮稚。
對(duì)于一個(gè)分類面f(x)
假設(shè)所有樣本距離此分類面的最小距離為δ,并且正反的分類分別為1和-1,則對(duì)于正樣本和負(fù)樣本有如下不等式册舞。
兩端乘以其分類結(jié)果y
所以轉(zhuǎn)換為優(yōu)化δ,使其最大化蕴掏。(max(δ)) 但是函數(shù)距離并不能代表一個(gè)點(diǎn)到一個(gè)分類面的真實(shí)距離,舉例如下: 對(duì)于一個(gè)二維分類面
可以表示成以下兩種等價(jià)形式:
由于δ可以任意變化,并且確定δ后调鲸,w也確定了盛杰,為了求解方便,就強(qiáng)制將\deltaδ歸一化為1藐石。此時(shí)簡(jiǎn)化成了優(yōu)化問題:
上述優(yōu)化問題與以下優(yōu)化問題等價(jià):
然而這組方程并不像表面上那么好解決即供。。于微。 需要使用SMO算法迭代出最優(yōu)解逗嫡。 最終可以迭代出w和b,即求出了分類面f(x)=w??x+b 而SVM的訓(xùn)練過程即SMO算法迭代求解w和b的過程株依。