支援向量機從原理到演算法的實現
阿新 • • 發佈:2018-12-29
思想:尋找能夠成功分開兩類樣本並且具有最大分類間隔的最優超平面。
1.原理解析
空間中任何一個平面的方程都可以表示為wx+b =0,如上圖,設最優超平面方程H為wx+b=0,支援向量x-到H的距離為,要使分類間隔最大,即該距離最大,而該距離只與|w|有關,分子為一個常數,為了簡單優美,設分子常數為-1,則H1平面方程為wx+b = -1,同理H2平面方程為wx+b = 1。
則H1H2間的距離為( - ) . =
間隔最大等價於最小化,故目標函式為J(w)=
這個編輯器很難用,不想打公式了,直接上草稿 :
2.例項
-
#1、讀入資料
-
import numpy
as np
-
dataList = []
-
labelList = []
-
def
loadData(fileName):
-
f = open(fileName)
-
for line
in f.readlines():
-
lineStr = line.split(
'\t')
-
dataList.append([float(lineArr[
0
]),float(lineArr[
1])])
-
labelList.append(float(lineArr[
2]))
-
return dataList,labelList
-
-
dataList,labelList = loadData(
'testSet.txt')
-
#2、訓練支援向量機
-
from sklearn
import svm
-
#基於libsvm工具箱,SVC非線性支援向量分類,可通過核定義其核函式,如‘linear’為線性,‘rbf’為徑向基核函式
-
clf = svm.SVC(kernel=
'linear')
-
clf.fit(dataList,labelList)
#訓練
-
#3、預測
-
clf
.predict(
[[7.5,-1.5]])#預測類別
-
clf
.decision_function(
[[7.5,-1.5]])#該
SVC方法
decision_function為每個樣本提供每個類別的分數相當於迴歸
-
-
#支援向量
-
clf
.support_vectors_#獲得支援向量
-
clf
.support_#獲得支援向量索引
-
clf
.n_support_#獲得支援向量屬於不同類別的個數
-
#4、繪製決策邊界和支援向量
-
labelArr = np.
array(labelList)
-
x_min, x_max = dataArr[:,
0].min() -
1, dataArr[:,
0].max() +
1
-
y_min, y_max = dataArr[:,
1].min() -
1, dataArr[:,
1].max() +
1
-
xx, yy = np.meshgrid(np.arange(x_min, x_max,
0.02),np.arange(y_min, y_max,
0.02))
#meshgrid在空間上取點
-
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
#ravel平鋪,相當於np.hstack(xx)
-
row = len(np.arange(y_min,y_max,
0.02))
-
col = len(np.arange(x_min,x_max,
0.02))
-
Z = Z.reshape([row,col])
-
-
#plt.cm中cm全稱表示colormap,paired表示兩個兩個相近色彩輸出,比如淺藍、深藍;淺紅、深紅;淺綠,深綠這種
-
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
-
plt.scatter(dataArr[:,
0], dataArr[:,
1], c=labelList)
#畫出資料點
-
plt.scatter(dataArr[clf.support_,
0],dataArr[clf.support_,
1],c =
'red',s =
100,marker=
'o')
#畫出支援向量
<script>
(function(){
function setArticleH(btnReadmore,posi){
var winH = $(window).height();
var articleBox = $("div.article_content");
var artH = articleBox.height();
if(artH > winH*posi){
articleBox.css({
'height':winH*posi+'px',
'overflow':'hidden'
})
btnReadmore.click(function(){
articleBox.removeAttr("style");
$(this).parent().remove();
})
}else{
btnReadmore.parent().remove();
}
}
var btnReadmore = $("#btn-readmore");
if(btnReadmore.length>0){
if(currentUserName){
setArticleH(btnReadmore,3);
}else{
setArticleH(btnReadmore,1.2);
}
}
})()
</script>
</article>