1. 程式人生 > >支援向量機從原理到演算法的實現

支援向量機從原理到演算法的實現

思想:尋找能夠成功分開兩類樣本並且具有最大分類間隔的最優超平面。

1.原理解析

空間中任何一個平面的方程都可以表示為wx+b =0,如上圖,設最優超平面方程H為wx+b=0,支援向量x-到H的距離為\frac{wx_{-}+b}{|w|},要使分類間隔最大,即該距離最大,而該距離只與|w|有關,分子為一個常數,為了簡單優美,設分子常數為-1,則H1平面方程為wx+b = -1,同理H2平面方程為wx+b = 1。

則H1H2間的距離為(  -  ) . = 

間隔最大等價於最小化,故目標函式為J(w)= 

這個編輯器很難用,不想打公式了,直接上草稿 :

 

 

2.例項


  
  1. #1、讀入資料
  2. import numpy as np
  3. dataList = []
  4. labelList = []
  5. def
    loadData(fileName):
  6. f = open(fileName)
  7. for line in f.readlines():
  8. lineStr = line.split( '\t')
  9. dataList.append([float(lineArr[ 0
    ]),float(lineArr[ 1])])
  10. labelList.append(float(lineArr[ 2]))
  11. return dataList,labelList
  12. dataList,labelList = loadData( 'testSet.txt')

  
  1. #2、訓練支援向量機
  2. from sklearn import svm
  3. #基於libsvm工具箱,SVC非線性支援向量分類,可通過核定義其核函式,如‘linear’為線性,‘rbf’為徑向基核函式
  4. clf = svm.SVC(kernel= 'linear')
  5. clf.fit(dataList,labelList) #訓練

 


  
  1. #3、預測
  2. clf .predict( [[7.5,-1.5]])#預測類別
  3. clf .decision_function( [[7.5,-1.5]])#該 SVC方法 decision_function為每個樣本提供每個類別的分數相當於迴歸
  4. #支援向量
  5. clf .support_vectors_#獲得支援向量
  6. clf .support_#獲得支援向量索引
  7. clf .n_support_#獲得支援向量屬於不同類別的個數

 


  
  1. #4、繪製決策邊界和支援向量
  2. labelArr = np. array(labelList)
  3. x_min, x_max = dataArr[:, 0].min() - 1, dataArr[:, 0].max() + 1
  4. y_min, y_max = dataArr[:, 1].min() - 1, dataArr[:, 1].max() + 1
  5. xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),np.arange(y_min, y_max, 0.02)) #meshgrid在空間上取點
  6. Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) #ravel平鋪,相當於np.hstack(xx)
  7. row = len(np.arange(y_min,y_max, 0.02))
  8. col = len(np.arange(x_min,x_max, 0.02))
  9. Z = Z.reshape([row,col])
  10. #plt.cm中cm全稱表示colormap,paired表示兩個兩個相近色彩輸出,比如淺藍、深藍;淺紅、深紅;淺綠,深綠這種
  11. plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
  12. plt.scatter(dataArr[:, 0], dataArr[:, 1], c=labelList) #畫出資料點
  13. 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>