1. 程式人生 > >基於libsvm庫的python支援向量機(SVM)簡明乾貨

基於libsvm庫的python支援向量機(SVM)簡明乾貨

最近專案在搞模式識別,通過支援向量機的方法來進行分類,網上看到了python程式碼,但是,只能做到二維分類。

維數上去之後,沒有辦法有效識別,這個svm的程式碼有序有時間的話,我會寫好一份多維特徵量判別的程式碼發上來。

話題開始,先簡單說說支援向量機:

支援向量機SVM,是人工智慧領域一類比較常用的有效分類方式,通過尋找全域性最優支援向量,將平面或者超平面分割為兩個部分,

這兩個部分可以通過一個線性函式或者非線性函式f(x)來實現劃分,這個f(x)的定義式:

f(x)=[W].T*x+b

後面的T代表矩陣的轉置,這裡的自變數x∈Rn,也就是我們說的n維向量,我們可以通過一個一維陣列來表示,陣列成員數就是n。

所謂的支援向量機訓練操作就是在尋找一個W和b這樣的常數矩陣,可以看做是在解W.和b的過程。

我們訓練好這兩個引數之後,再把我們想要測試的x值帶到這裡面去,就可以知道這個樣本屬於哪一類了。

結果

y=sgn(f(x))

習慣上用符號函式來表示,這種表示方法與支援向量機裡面的建模函式有關,這裡不詳說。意思就是隻需比較這個結果是否為0即可判別屬於哪類。

臺灣大學的林教授給我們提供好了一個SVM的庫,這個庫提供原始碼,感興趣的可以去下載下,下載地址百度、谷歌libsvm即可,這裡講用法。

講libsvm資料夾下面windows資料夾中的libsvm.dll檔案拷貝到windows\system32資料夾下,現在的這些編譯版本網上說基本是64位的了,所以直接複製過去就行,

不過我下載的這個版本,在README檔案中,說這個libsvm.dll檔案還是32位的,如果說Python是32位的,檢視python是否為32位的輸入:

import sys

sys.version

即可

如果是32位的python可以把原始碼編譯下,vs編譯就行。

如果嫌棄編譯太麻煩,可以這樣做:

把這個libsvm.dll檔案放在當前目錄的:

../windows/libsvm.dll這個路徑就可以了,注意哦,上面可是兩個dot,如果這個都不知道什麼意思,看看libsvm的目錄結構中windows資料夾在哪就知道了。

我們在libsvm\python資料夾下面新建一個檔案:1.py

這裡面為什麼我們在python資料夾下建這個1.py檔案,是因為這個資料夾下面有兩個.py檔案,這兩個檔案是我們這裡的依賴檔案,所以,這個必須得有,如果你想把這個指令碼整體轉移到其他目錄中,不要忘記了,你需要把上面windows資料夾轉移了,或者放在系統的windows\system32目錄中,同時,別忘了這兩個Py檔案,當然,你也可以放在python安裝目錄中,不過,不太建議這樣,總感覺這樣做耦合關係有點兒大。


程式碼:

from svmutil import *
y, x = svm_read_problem('../heart_scale')
a=y[:60]
b=x[:60]
#print b
m = svm_train(a,b)
p_label1, p_acc, p_val = svm_predict(a,b, m)
a = y[61:121]
b = x[61:121]
p_label2, p_acc, p_val = svm_predict(a,b, m)
print(p_label1)
print(p_label2)
#svm_save_model("sss.txt",m)
if p_label1==p_label2:
    print("true")



這段程式碼有用的就三句:

y, x = svm_read_problem('../heart_scale')

讀檔案,y和x代表什麼.print出來,然後對照../heart_scale檔案就知道了。

m = svm_train(a,b)

訓練函式,

p_label2, p_acc, p_val = svm_predict(a,b, m)

測試訓練結果,主要顯示精度,精度與c g 引數有關,可以通過svm_scale,tools/easy.py等來提高精度。方法網上太多,不多說了。

說一句關鍵的,訓練好支援向量之後怎麼用?

這裡的svm_predict函式可以充當決策函式的作用,返回值p_label中的1和-1即代表了兩類資料集。所以那裡面的a引數只要保證維數與b相同即可。

上面的程式碼仔細看懂即可理解這個關係。