1. 程式人生 > >svm原理以及利用現成庫實現

svm原理以及利用現成庫實現

blog tps 就是 print ear 原理 允許 ins tails

SVM

1 由來
利用一根直線或者一個超平面把數據按照某種規則區分開來

2 最大間隔分類器
上面我們推導出了間隔的表達式,自然的,我們想讓數據點離超平面越遠越好:
技術分享圖片
技術分享圖片

3 核函數
在前面的討論中,我們假設數據集是線性可分的。但是現實任務中,可能並不存在一個超平面將數據集完美得分開。
這種情況下,我們可以通過將原始空間映射到一個高維空間,如果高維空間中數據集是線性可分的,那麽問題就可以解決了。
這樣,超平面變為:

可見,需要計算 ?(xi)T?(xj)?(xi)T?(xj) ,但很多時候,我們並不知道高維空間是什麽樣子,也就是我們根本連 ?(x)?(x) 是什麽樣子都不知道,更不要說如果高維空間維數很大, ?(xi)T?(xj)?(xi)T?(xj) 計算十分困難。 其實 ?(xi)T?(xj)?(xi)T?(xj) 只是一個實數,如果將它們看成一個整體,它也是關於 xi,xjxi,xj 的一個函數,所以,如果存在那麽一個神奇的函數 κ(xi,xj)=?(xi)T?(xj)κ(xi,xj)=?(xi)T?(xj) ,我們就可以在低維空間計算出高維空間的點積結果。這個函數κ(xi,xj)κ(xi,xj) 就叫做核函數

。 常用的核函數有:
技術分享圖片

技術分享圖片

4 松弛變量
現實任務中,可能用上核函數還是不能線性可分。或者即使找到線性可分的超平面,也不能判斷是不是過擬合。因此,我們將標準放寬一些,允許SVM模型在某些數據點上“出錯”,為此,要引入“軟間隔”:
技術分享圖片技術分享圖片

5程序代碼:
import numpy as np
import pylab as pl
from sklearn import svm

#we create 40 separable points
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
Y = [0]20 +[1]20

#選擇模型,並且訓練出模型參數

#fit the model
clf = svm.SVC(kernel=‘linear‘)
clf.fit(X, Y)

#得到分離超平面
#get the separating hyperplane
w = clf.coef_[0]

a = -w[0]/w[1]
xx = np.linspace(-5, 5)
yy = a*xx - (clf.intercept_[0])/w[1]

#plot the parallels to the separating hyperplane that pass through the support vectors
b = clf.supportvectors[0]
yy_down = axx + (b[1] - a

b[0])
b = clf.supportvectors[-1]
yy_up = axx + (b[1] - ab[0])

print("w: ", w)
print("a: ", a)

#print "xx: ", xx
#print "yy: ", yy
print("supportvectors: ", clf.supportvectors)
print("clf.coef: ", clf.coef)

#switching to the generic n-dimensional parameterization of the hyperplan to the 2D-specific equation
#of a line y=a.x +b: the generic w_0x + w_1y +w_3=0 can be rewritten y = -(w_0/w_1) x + (w_3/w_1)

#plot the line, the points, and the nearest vectors to the plane
pl.plot(xx, yy, ‘k-‘)
pl.plot(xx, yy_down, ‘k--‘)
pl.plot(xx, yy_up, ‘k--‘)

pl.scatter(clf.supportvectors[:, 0], clf.supportvectors[:, 1],
s=80, facecolors=‘none‘)
pl.scatter(X[:, 0], X[:, 1], c=Y, cmap=pl.cm.Paired)

pl.axis(‘tight‘)
pl.show()

部分代碼參考:https://blog.csdn.net/u014433413/article/details/78427574

svm原理以及利用現成庫實現