雖然網絡上已經有了很多的類似的東西了吧。但是呢,我自己還是要寫一寫的。
安裝:
對於 libsvm工具包,我們可以去官方網站下載,網址為:http://www.csie.ntu.edu.tw/~cjlin/libsvm/,這上面有很好的介紹。
我下載的版本為 libsvm-3.22。下載完了以后,可以查看到文件夾里面的內容。(其中,的一個heart_scale的matlab格式的文件是我自己在網上下載的)
里面的 matlab文件夾里的內容就是我們要用到的內容(里面有的文件我已經編譯好了,即 .mexw64的相關文件)。里面有一個README 的文件,可以讀讀,作出了相關的介紹。
雖然在windows文件夾下有給出了 .mexw64的文件,但是我償試過,沒有辦法用,所以呢,對於用c++下的 svmtrain.c、svmpredict、libsvmread.c、libsvmwrite.c(這四個文件是主要的)文件我們要把它編譯成matlab可以使用的以.mexw64的文件。。(注意,在64位下是以.mexw64結尾,在32位下應該是以.mexw32結尾).
以上簡單說了一下 文件夾內的東西,現在正式說說安裝過程吧。
1. 下載工具包;(可以在官網下載,我同時也提供了我下載的並且我編譯過的工具包,http://pan.baidu.com/s/1hsmR1li)
2. 我們把工具包里的 matlab 文件夾下的的.c文件編譯為matlab軟件可以使用的.mexw64文件.
我們要做的是在matlab里編譯c++文件,我們要配置matlab的編譯器,matlab自身好像自代了一個 lcc的編譯器,不過我的沒有。如果你的電腦安裝了其它的編譯器,我們就可以使用它。(注意一點,matlab支持的編譯器必須低於當前的matlab的版本,例如我的matlab為2012b版本,它就不支持vs2012版本,我又安裝了vs2010版本,它就支持了,通過https://cn.mathworks.com/support/sysreq/previous_releases.html可以自己查看下自己的版本以及支持的編譯器)。如何配置:
1)在matlab中輸入:
mex –setup再選擇 y, 會出現這樣的:
然后選擇一個默認的編譯器就可以了,我這里只有 visual c++ 2010,也只能選擇它了。
2)配置完默認的編譯器,我們就編譯我們的在matlab文件夾下的 .c 文件吧。。讓我們把當前目錄切換到 matlab文件夾下,里面有一個 make.m 的文件,里面的內容就是編譯的指令,我們直接運行它就可以(你可以選中文件右擊選擇run,也可以在命令窗口直接輸入make 回車)。運行完了以后呢,就生成了 .mexw64的文件了。
3. 對於要不要設置matlab的搜索路經的問題,可以設置,也可以直接把matlab文件夾作用當前目錄使用 svmtrain等函數。 我使用的后者。(另外注意一點,在matlab的自代工具箱里面也有一個svmtrain的函數,如果你設置了路經,記得把我們下載的工具箱的路經設在第一位置了,要不會調用錯的)
4. 驗證一下能否使用。
在下載的工具箱文件夾里面有一個 heart_scale的文件,這個是c++能打開的文件,我們直接使用load搞不定的。把這個文件復制到matlab文件夾下,使用 libsvmread 載入;方法為:
[label_vector, instance_matrix] = libsvmread('filename')
另個有我的文件包里面也包含了 heart_scale.mat文件,可以直接用load 載入的,下圖為直接load 載入:
有了數據集,我們就那建立模型,用於分類預測:
model = svmtrain(heart_scale_label, heart_scale_inst); [predict_label] = svmpredict(heart_scale_label, heart_scale_inst, model);
下圖為輸出:
5 ,搞定。
工具箱的簡單使用:
http://blog.csdn.net/bryan__/article/details/51506801
多分類問題怎么解決呢?通常把多分類問題分解為一系列SVM可直接求解的兩分類問題。在此思想上,通常有以下方法:
1. 一類對余類法,聽這個名字就知道是什么意思,如果一共有K類,那么最后訓練一共有K個SVM。 判別時,輸入信號分別經過k個分類機共得到k個輸出值fi(x)=sgn(gi(x)),若只有一個+1出現,則其對應類別為輸入信號類別;若輸出不只一個+1(不只一類聲稱它屬於自己),或者沒有一個輸出為+1(即沒有一個類聲稱它屬於自己),則比較g(x)輸出值,最大者對應類別為輸入的類別。
2. 一對一分類法。。如果一共有K類的話,那么最終得到的SVM為P=k(k-1)/2個。 判別時,將輸入信號X分別送到P個判別函數f(x),若f(x)=+1,判X為i類,i類獲得一票,否則判為j類,j類獲得一票。分別統計k個類別在P個判別函數結果中的得票數,得票數最多的類別就是最終判定類別。
上面為最簡單的最常用的方法, 另外還有其它方法,不介紹了。
建模時用到的參數:(來自http://www.matlabsky.com/thread-12380-1-1.html)
Options:可用的選項即表示的涵義如下 -s svm類型:SVM設置類型(默認0) 0 -- C-SVC 1 --v-SVC 2 – 一類SVM 3 -- e -SVR 4 -- v-SVR -t 核函數類型:核函數設置類型(默認2) 0 – 線性:u'v 1 – 多項式:(r*u'v + coef0)^degree 2 – RBF函數:exp(-gamma|u-v|^2) 3 –sigmoid:tanh(r*u'v + coef0) -d degree:核函數中的degree設置(針對多項式核函數)(默認3) -g r(gama):核函數中的gamma函數設置(針對多項式/rbf/sigmoid核函數)(默認1/ k) -r coef0:核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0) -c cost:設置C-SVC,e -SVR和v-SVR的參數(損失函數)(默認1) -n nu:設置v-SVC,一類SVM和v- SVR的參數(默認0.5) -p p:設置e -SVR 中損失函數p的值(默認0.1) -m cachesize:設置cache內存大小,以MB為單位(默認40) -e eps:設置允許的終止判據(默認0.001) -h shrinking:是否使用啟發式,0或1(默認1) -wi weight:設置第幾類的參數C為weight*C(C-SVC中的C)(默認1) -v n: n-fold交互檢驗模式,n為fold的個數,必須大於等於2
其中-g選項中的k是指輸入數據中的屬性數。option -v 隨機地將數據剖分為n部分並計算交互檢驗准確度和均方根誤差。以上這些參數設置可以按照SVM的類型和核函數所支持的參數進行任意組合,如果設置的參數在函數或SVM類型中沒有也不會產生影
響,程序不會接受該參數;如果應有的參數設置不正確,參數將采用默認值。
http://blog.csdn.net/bryan__/article/details/51506801寫的也很好。
其中寫到:SVM模型有兩個非常重要的參數C與gamma。其中 C是懲罰系數,即對誤差的寬容度。c越高,說明越不能容忍出現誤差,容易過擬合。C越小,容易欠擬合。C過大或過小,泛化能力變差
gamma是選擇RBF函數作為kernel后,該函數自帶的一個參數。隱含地決定了數據映射到新的特征空間后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的個數影響訓練與預測的速度。
這里有一個用於參數c與g選擇的相關知識:http://www.ilovematlab.cn/thread-47819-1-1.html
C越大,相當於懲罰松弛變量,希望松弛變量接近0,即對誤分類的懲罰增大,趨向於對訓練集全分對的情況,這樣對訓練集測試時准確率很高,但泛化能力弱。C值小,對誤分類的懲罰減小,允許容錯,將他們當成噪聲點,泛化能力較強。
http://www.cnblogs.com/zhizhan/p/4412343.html也寫的很好的啊。
比如:寫到了為什么要選擇RBF??
通常而言,RBF核是合理的首選。這個核函數將樣本非線性地映射到一個更高維的空間,與線性核不同,它能夠處理分類標注和屬性的非線性關系。並且,線性核是RBF的一個特例(Keerthi and Lin 2003),因此,使用一個懲罰因子C的線性核與某些參數(C,γ)的RBF核具有相同的性能。同時,Sigmoid核的表現很像一定參數的RBF核(Lin and Link 2003)。
第二個原因,超參數(hyperparameter)的數量會影響到模型選擇的復雜度(因為參數只能靠試驗呀!)。多項式核比RBF核有更多的超參數。
最后,RBF核有更少的數值復雜度(numerical difficulties)。一個關鍵點0<Kij<=1對比多項式核,后者關鍵值需要 infinity(rxiTxj+r>1)或者zero(rxiTxj+r<1),這是高階運算。此外,我們必須指出sigmoid核在某些參數下不是合法的 (例如,不是兩個向量的內積)。(Vapnik 1995)。