Python中使用支持向量機SVM實踐
在機器學習領域,支持向量機SVM(Support Vector Machine)是一個有監(jiān)督的學習模型,通常用來進行模式識別、分類(異常值檢測)以及回歸分析。
其具有以下特征:
(1)SVM可以表示為凸優(yōu)化問題,因此可以利用已知的有效算法發(fā)現(xiàn)目標函數(shù)的全局最小值。而其他分類方法都采用一種基于貪心學習的策略來搜索假設空間,這種方法一般只能獲得局部最優(yōu)解。
(2) SVM通過最大化決策邊界的邊緣來實現(xiàn)控制模型的能力。盡管如此,用戶必須提供其他參數(shù),如使用核函數(shù)類型和引入松弛變量等。
(3)SVM一般只能用在二類問題,對于多類問題效果不好。
代碼及詳細解釋(基于sklearn包):
from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt
#準備訓練樣本
x=[[1,8],[3,20],[1,15],[3,35],[5,35],[4,40],[7,80],[6,49]]
y=[1,1,-1,-1,1,-1,-1,1]
##開始訓練
clf=svm.SVC() ##默認參數(shù):kernel='rbf'
clf.fit(x,y)
##根據(jù)訓練出的模型繪制樣本點
for i in x:
res=clf.predict(np.array(i).reshape(1, -1))
if res > 0:
plt.scatter(i[0],i[1],c='r',marker='*')
else :
plt.scatter(i[0],i[1],c='g',marker='*')
##生成隨機實驗數(shù)據(jù)(15行2列)
rdm_arr=np.random.randint(1, 15, size=(15,2))
##回執(zhí)實驗數(shù)據(jù)點
for i in rdm_arr:
res=clf.predict(np.array(i).reshape(1, -1))
if res > 0:
plt.scatter(i[0],i[1],c='r',marker='.')
else :
plt.scatter(i[0],i[1],c='g',marker='.')
##顯示繪圖結果
plt.show()
從圖上可以看出,數(shù)據(jù)明顯被藍色分割線分成了兩類。但是紅色箭頭標示的點例外,所以這也起到了檢測異常值的作用。
上面的代碼中提到了kernel='rbf',這個參數(shù)是SVM的核心:核函數(shù)
重新整理后的代碼如下:
from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt
##設置子圖數(shù)量
fig, axes = plt.subplots(nrows=2, ncols=2,figsize=(7,7))
ax0, ax1, ax2, ax3 = axes.flatten()
#準備訓練樣本
x=[[1,8],[3,20],[1,15],[3,35],[5,35],[4,40],[7,80],[6,49]]
y=[1,1,-1,-1,1,-1,-1,1]
'''
說明1:
核函數(shù)(這里簡單介紹了sklearn中svm的四個核函數(shù),還有precomputed及自定義的)
LinearSVC:主要用于線性可分的情形。參數(shù)少,速度快,對于一般數(shù)據(jù),分類效果已經很理想
RBF:主要用于線性不可分的情形。參數(shù)多,分類結果非常依賴于參數(shù)
polynomial:多項式函數(shù),degree 表示多項式的程度-----支持非線性分類
Sigmoid:在生物學中常見的S型的函數(shù),也稱為S型生長曲線
說明2:根據(jù)設置的參數(shù)不同,得出的分類結果及顯示結果也會不同
'''
##設置子圖的標題
titles = ['LinearSVC (linear kernel)',
'SVC with polynomial (degree 3) kernel',
'SVC with RBF kernel', ##這個是默認的
'SVC with Sigmoid kernel']
##生成隨機試驗數(shù)據(jù)(15行2列)
rdm_arr=np.random.randint(1, 15, size=(15,2))
def drawPoint(ax,clf,tn):
##繪制樣本點
for i in x:
ax.set_title(titles[tn])
res=clf.predict(np.array(i).reshape(1, -1))
if res > 0:
ax.scatter(i[0],i[1],c='r',marker='*')
else :
ax.scatter(i[0],i[1],c='g',marker='*')
##繪制實驗點
for i in rdm_arr:
res=clf.predict(np.array(i).reshape(1, -1))
if res > 0:
ax.scatter(i[0],i[1],c='r',marker='.')
else :
ax.scatter(i[0],i[1],c='g',marker='.')
if __name__=="__main__":
##選擇核函數(shù)
for n in range(0,4):
if n==0:
clf = svm.SVC(kernel='linear').fit(x, y)
drawPoint(ax0,clf,0)
elif n==1:
clf = svm.SVC(kernel='poly', degree=3).fit(x, y)
drawPoint(ax1,clf,1)
elif n==2:
clf= svm.SVC(kernel='rbf').fit(x, y)
drawPoint(ax2,clf,2)
else :
clf= svm.SVC(kernel='sigmoid').fit(x, y)
drawPoint(ax3,clf,3)
plt.show()
由于樣本數(shù)據(jù)的關系,四個核函數(shù)得出的結果一致。在實際操作中,應該選擇效果最好的核函數(shù)分析。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
基于 Django 的手機管理系統(tǒng)實現(xiàn)過程詳解
這篇文章主要介紹了基于 Django 的手機管理系統(tǒng)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08
淺談Python類里的__init__方法函數(shù),Python類的構造函數(shù)
下面小編就為大家?guī)硪黄獪\談Python類里的__init__方法函數(shù),Python類的構造函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12

