Python中使用支持向量機(jī)(SVM)算法
在機(jī)器學(xué)習(xí)領(lǐng)域,支持向量機(jī)SVM(Support Vector Machine)是一個有監(jiān)督的學(xué)習(xí)模型,通常用來進(jìn)行模式識別、分類(異常值檢測)以及回歸分析。
其具有以下特征:
(1)SVM可以表示為凸優(yōu)化問題,因此可以利用已知的有效算法發(fā)現(xiàn)目標(biāo)函數(shù)的全局最小值。而其他分類方法都采用一種基于貪心學(xué)習(xí)的策略來搜索假設(shè)空間,這種方法一般只能獲得局部最優(yōu)解。
(2) SVM通過最大化決策邊界的邊緣來實(shí)現(xiàn)控制模型的能力。盡管如此,用戶必須提供其他參數(shù),如使用核函數(shù)類型和引入松弛變量等。
(3)SVM一般只能用在二類問題,對于多類問題效果不好。
1. 下面是代碼及詳細(xì)解釋(基于sklearn包):
from sklearn import svm import numpy as np import matplotlib.pyplot as plt #準(zhǔn)備訓(xùn)練樣本 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] ##開始訓(xùn)練 clf=svm.SVC() ##默認(rèn)參數(shù):kernel='rbf' clf.fit(x,y) #print("預(yù)測...") #res=clf.predict([[2,2]]) ##兩個方括號表面?zhèn)魅氲膮?shù)是矩陣而不是list ##根據(jù)訓(xùn)練出的模型繪制樣本點(diǎn) 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='*') ##生成隨機(jī)實(shí)驗(yàn)數(shù)據(jù)(15行2列) rdm_arr=np.random.randint(1, 15, size=(15,2)) ##回執(zhí)實(shí)驗(yàn)數(shù)據(jù)點(diǎn) 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='.') ##顯示繪圖結(jié)果 plt.show()
結(jié)果如下圖:
從圖上可以看出,數(shù)據(jù)明顯被藍(lán)色分割線分成了兩類。但是紅色箭頭標(biāo)示的點(diǎn)例外,所以這也起到了檢測異常值的作用。
2.在上面的代碼中提到了kernel='rbf',這個參數(shù)是SVM的核心:核函數(shù)
重新整理后的代碼如下:
from sklearn import svm import numpy as np import matplotlib.pyplot as plt ##設(shè)置子圖數(shù)量 fig, axes = plt.subplots(nrows=2, ncols=2,figsize=(7,7)) ax0, ax1, ax2, ax3 = axes.flatten() #準(zhǔn)備訓(xùn)練樣本 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ù),分類效果已經(jīng)很理想 RBF:主要用于線性不可分的情形。參數(shù)多,分類結(jié)果非常依賴于參數(shù) polynomial:多項(xiàng)式函數(shù),degree 表示多項(xiàng)式的程度-----支持非線性分類 Sigmoid:在生物學(xué)中常見的S型的函數(shù),也稱為S型生長曲線 說明2:根據(jù)設(shè)置的參數(shù)不同,得出的分類結(jié)果及顯示結(jié)果也會不同 ''' ##設(shè)置子圖的標(biāo)題 titles = ['LinearSVC (linear kernel)', 'SVC with polynomial (degree 3) kernel', 'SVC with RBF kernel', ##這個是默認(rèn)的 'SVC with Sigmoid kernel'] ##生成隨機(jī)試驗(yàn)數(shù)據(jù)(15行2列) rdm_arr=np.random.randint(1, 15, size=(15,2)) def drawPoint(ax,clf,tn): ##繪制樣本點(diǎn) 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='*') ##繪制實(shí)驗(yàn)點(diǎn) 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()
結(jié)果如圖:
由于樣本數(shù)據(jù)的關(guān)系,四個核函數(shù)得出的結(jié)果一致。在實(shí)際操作中,應(yīng)該選擇效果最好的核函數(shù)分析。
3.在svm模塊中還有一個較為簡單的線性分類函數(shù):LinearSVC(),其不支持kernel參數(shù),因?yàn)樵O(shè)計(jì)思想就是線性分類。如果確定數(shù)據(jù)
可以進(jìn)行線性劃分,可以選擇此函數(shù)。跟kernel='linear'用法對比如下:
from sklearn import svm import numpy as np import matplotlib.pyplot as plt ##設(shè)置子圖數(shù)量 fig, axes = plt.subplots(nrows=1, ncols=2,figsize=(7,7)) ax0, ax1 = axes.flatten() #準(zhǔn)備訓(xùn)練樣本 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] ##設(shè)置子圖的標(biāo)題 titles = ['SVC (linear kernel)', 'LinearSVC'] ##生成隨機(jī)試驗(yàn)數(shù)據(jù)(15行2列) rdm_arr=np.random.randint(1, 15, size=(15,2)) ##畫圖函數(shù) def drawPoint(ax,clf,tn): ##繪制樣本點(diǎn) 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='*') ##繪制實(shí)驗(yàn)點(diǎn) 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,2): if n==0: clf = svm.SVC(kernel='linear').fit(x, y) drawPoint(ax0,clf,0) else : clf= svm.LinearSVC().fit(x, y) drawPoint(ax1,clf,1) plt.show()
結(jié)果如圖所示:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python中字符串類型代碼的執(zhí)行函數(shù)——eval()、exec()和compile()詳解
這篇文章主要介紹了Python中字符串類型代碼的執(zhí)行函數(shù)——eval()、exec()和compile(),字符串類型代碼的執(zhí)行函數(shù)有三個,都是Python的內(nèi)置函數(shù),下面逐一對這三個函數(shù)詳細(xì)講解,需要的朋友可以參考下2023-02-02人工智能最火編程語言 Python大戰(zhàn)Java!
開發(fā)者到底應(yīng)該學(xué)習(xí)哪種編程語言才能獲得機(jī)器學(xué)習(xí)或數(shù)據(jù)科學(xué)這類工作呢?這是一個非常重要的問題。本文為大家提供作者的答案并解釋原因2017-11-11python神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)使用Keras進(jìn)行回歸運(yùn)算
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)使用Keras進(jìn)行回歸運(yùn)算,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Python字典創(chuàng)建 遍歷 添加等實(shí)用基礎(chǔ)操作技巧
字段是Python是字典中唯一的鍵-值類型,本文講述了Python中字典如何創(chuàng)建 遍歷 添加等實(shí)用基礎(chǔ)操作技巧,內(nèi)容非?;A(chǔ)但非常重要,一定要熟練掌握2018-09-09吳恩達(dá)機(jī)器學(xué)習(xí)練習(xí):SVM支持向量機(jī)
這篇文章主要為我們帶來了吳恩達(dá)機(jī)器學(xué)習(xí)的一個練習(xí):SVM支持向量機(jī),通過本次練習(xí)相信你能對機(jī)器學(xué)習(xí)深入更進(jìn)一步,需要的朋友可以參考下2021-04-04圖文詳解梯度下降算法的原理及Python實(shí)現(xiàn)
梯度下降是迭代法的一種,可以用于求解最小二乘問題(線性和非線性都可以)。本文將通過圖文詳解梯度下降算法的原理及實(shí)現(xiàn),需要的可以參考一下2022-08-08Django?Rest?Framework實(shí)現(xiàn)身份認(rèn)證源碼詳解
這篇文章主要為大家介紹了Django?Rest?Framework實(shí)現(xiàn)身份認(rèn)證源碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05