雖然網絡上已經有了很多的類似的東西了吧。但是呢,我自己還是要寫一寫的。
安裝:
對于 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中輸入:
再選擇 y, 會出現這樣的:mex –setup
![]()
matlab下使用svmlib工具包 然後選擇一個預設的編譯器就可以了,我這裡隻有 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)。