Python中使用支援向量機 SVM 實踐

2021-08-02 01:18:43 字數 3838 閱讀 3901

在機器學習領域,支援向量機svm(support vector machine)是乙個有監督的學習模型,通常用來進行模式識別、分類(異常值檢測)以及回歸分析。

其具有以下特徵:

(1)svm可以表示為凸優化問題,因此可以利用已知的有效演算法發現目標函式的全域性最小值。而其他分類方法都採用一種基於貪心學習的策略來搜尋假設空間,這種方法一般只能獲得區域性最優解。

(2) svm通過最大化決策邊界的邊緣來實現控制模型的能力。儘管如此,使用者必須提供其他引數,如使用核函式型別和引入鬆弛變數等。

(3)svm一般只能用在二類問題,對於多類問題效果不好。

1**及詳細解釋(基於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() #

#預設引數:kernel='rbf'

clf.fit(x,y)

#

#根據訓練出的模型繪製樣本點

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='*'

)##生成隨機實驗資料(15行2列)

rdm_arr=np.random.randint(1, 15, size=(15,2))

##回執實驗資料點

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='.'

)##顯示繪圖結果

從圖上可以看出,資料明顯被藍色分割線分成了兩類。但是紅色箭頭標示的點例外,所以這也起到了檢測異常值的作用。
上面的**中提到了kernel='rbf',這個引數是svm的核心:核函式

重新整理後的**如下:   

from sklearn import

svmimport

numpy as np

import

matplotlib.pyplot as plt

##設定子圖數量

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:

核函式(這裡簡單介紹了sklearn中svm的四個核函式,還有precomputed及自定義的)

linearsvc:主要用於線性可分的情形。引數少,速度快,對於一般資料,分類效果已經很理想

rbf:主要用於線性不可分的情形。引數多,分類結果非常依賴於引數

polynomial:多項式函式,degree 表示多項式的程度-----支援非線性分類

sigmoid:在生物學中常見的s型的函式,也稱為s型生長曲線

說明2:根據設定的引數不同,得出的分類結果及顯示結果也會不同

'''#

#設定子圖的標題

titles = ['

linearsvc (linear kernel)

',

'svc with polynomial (degree 3) kernel

',

'svc with rbf kernel

', #

#這個是預設的

'svc with sigmoid kernel']

##生成隨機試驗資料(15行2列)

rdm_arr=np.random.randint(1, 15, size=(15,2))

defdrawpoint(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__":

##選擇核函式

由於樣本資料的關係,四個核函式得出的結果一致。在實際操作中,應該選擇效果最好的核函式分析。

支援向量機專題 線性支援向量機

原文 當資料線性不可分時,使用硬間隔支援向量機很難得到理想的結果。但是如果資料近似線性可分,可以採用軟間隔支援向量機 線性支援向量機 進行分類。這通常適用於有少量異常樣本的分類,如果使用線性支援向量機,它會盡量使得所有訓練樣本都正確,如下圖所示。顯然這並不是最好的結果,軟間隔支援向量機可以權衡 間隔...

支援向量機

支援向量機 svm 一種專門研究有限樣本 的學習方法。是在統計學習理論基礎之上發展而來的。沒有以傳統的經驗風險最小化原則作為基礎,而是建立在結構風險最小化原理的基礎之上,發展成為一種新型的結構化學習方法。結構風險最小歸納原理 解決了有限樣本或小樣本的情況下獲得具有優異泛化能力的學習機器。包含了學習的...

支援向量機

支援向量 與分離超平面距離最近的樣本點的例項 優點 泛化錯誤率低,計算開銷不大,結果易解釋 缺點 對引數調節和核函式選擇敏感,原始分類器不加修改僅適用於處理二分類問題 適合資料型別 數值型和標稱型資料 每次迴圈中選擇兩個alpha進行優化處理。一旦找到一對合適的alpha,那麼久增大其中乙個同時減小...