1. 程式人生 > >機器學習:林智仁libsvm 工具箱 在matlab下的應用總結

機器學習:林智仁libsvm 工具箱 在matlab下的應用總結

  1. 簡單介紹一下機器學習中的libsvm
  2. libsvm工具箱在matlab下的安裝
  3. libsvm工具箱在matlab下的應用
  4. libsvm的實際應用
  5. 小結

一、機器學習中的libsvm介紹

支援向量機(SUPPORT VECTOR MACHINE),是非常強大且流行的演算法,在一些情況下,能面向一些複雜的非線性問題提供比邏輯迴歸或神經網路要更加簡潔的解決方案。 
下面具體講一下SVM 
這裡寫圖片描述 
這裡寫圖片描述這裡寫圖片描述 
這裡寫圖片描述

LIBSVM是臺灣大學林智仁(Lin Chih-Jen)教授等開發設計的一個簡單、易於使用和快速有效的SVM模式識別與迴歸的軟體包,他不但提供了編譯好的可在Windows系列系統的執行檔案,還提供了原始碼,方便改進、修改以及在其它作業系統上應用;該軟體對SVM所涉及的引數調節相對比較少,提供了很多的預設引數,利用這些預設引數可以解決很多問題;並提供了互動檢驗(Cross Validation)的功能。該軟體可以解決C-SVM、ν-SVM、ε-SVR和ν-SVR等問題,包括基於一對一演算法的多類模式識別問題。

下面一個網站裡面是大牛寫的關於libsvm的一些東西,可以看看 關於libsvm的那點破事

二、libsvm在matlab下的安裝

1、首先下載libsvm工具箱

2、接著是將下載的工具箱安裝

  1. 將libsvm-mat所在工具箱新增到matlab工作搜尋目錄 
    (File ——》 
    Set Path… ——》 
    Add with Subfolders…);
  2. 選擇編譯器(mex -setup);
  3. 編譯檔案(make)。

詳細的步驟講解請看 LIBSVM 在matlab下的安裝 
這裡我只說我遇到的問題,在選擇編譯器的時候不管是 y還是n 都找不到自己所安裝的編譯器,有可能是安裝順序的問題,我所解決的方法是,講編譯器和matlab解除安裝,然後重新安裝,重安裝的時候注意先安裝編譯器,再安裝matlab

在編譯檔案make的時候出現找不到檔案,需要進入到libsvm-master>matlab 中再make就可以了

三、 libsvm工具箱在matlab下的應用

<code class="hljs delphi has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//%獲取traindata、trainlabel,testdata、testlabel</span>
traindata =[ train( : , <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> ), train( : , <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> ), train( : , <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span> ), train( : , <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span> )];
trainlabel = train( : , <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">14</span> );

testdata = [ test( :  , <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> ), test( :  , <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> ), test( :  , <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span> ), test( :  , <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span> ) ];
testlabel = test(  : , <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">14</span> );

 <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//%用traindata和trainlabel來訓練出一個模型,引號裡面引數的詳細解釋看上述網址的詳解</span>
model = svmtrain(trainlabel ,traindata,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'-s 0 -t 2 -c 4 -g 1.2 -b 1'</span>);
save model model

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//%用testdata、testlabel和訓練出的模型進行做預測</span>
[plabel, accuracy, dec_values] = svmpredict(testlabel,testdata,model,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'-b 1'</span>);
save <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">label</span>.txt  plabel -ascii

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//%evaluate training results evaluate是自己寫的一個評估函式</span>
[TP,FN,FP,TN,POD,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FAR</span>,CSI,AUC,P,R,F] = Evaluate(plabel,testlabel);
save result P R F AUC CSI POD <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FAR</span> TP FN FP TN  dec_values
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>

四、 libsvm的實際應用

1、獲取原始資料

獲取所需要的特徵值和標籤

2、將資料進行預處理

差分、歸一化 
(1)差分 
由於氣象中的特徵,差分後的特徵值會包含一些有用的資訊,所以需要差分。新的特徵值=原始特徵值+差分(差分用的是向前差分d(t)=data(t)-data(t-1)) 
(2)歸一化 
現在的歸一化方法有兩種max_min歸一化和mu_sigma歸一化。公式如下: 
new—data=(data-min)/(max-min) 
new—data=(data-mu)/sigma

經對比結果發現第一種歸一化方法更適用於我們的應用。

3、訓練、預測

這裡的訓練、預測如‘三、libsvm工具箱在matlab下的應用’中的程式碼

4、評估

對評估結果分析發現POD、CSI、FAR達不到要求,分析可能是由於正例置信度為0.5,即:當某一個樣例的概率大於50%,預測此樣例為正樣例。如果想要提高各項預測值,需要獲得每個樣本的預測概率以此來修改置信度。 
具體解決方法如下 
這裡寫圖片描述

如上圖橢圓框出來的,在訓練 svmtrain和預測 svmpredict的時候都加上引數‘-b 1’會得到 dec_values。 在我們的實驗中(二分,label 有1和-1)dec_values分為2列,第一列為樣例預測為-1的概率,第二列為樣例預測為1的概率。這樣我們就可以根據dec_values來調整閾值(正例置信度),以達到提高精確度的效果。

五、小結

通過這一階段的學習我發現,不能怕遇到問題,遇到問題後不能急仔細查詢各種解決的方法。要仔細分析。。。心細。。。