LibSVM學習(五)——分界線的輸出

 對於學習SVM人來講,要判斷SVM效果,以圖形的方式輸出的分解線是最直觀的。LibSVM自帶了一個可視化的程序svm-toy,用來輸出類之間的分界線。他是先把樣本文件載入,而後進行訓練,經過對每一個像素點的座標進行判斷,看屬於哪一類,就附上那類的顏色,從而使類與類之間造成分割線。咱們這一節不討論svm-toy怎麼使用,由於這個是「傻瓜」式的,沒什麼好討論的。這一節咱們主要探討怎麼結合訓練結果文件,本身編程輸出分界線。web

       爲何說是分界線呢,其實嚴格說來是分解超平面,可是咱們爲了能直觀用繪圖工具繪(好比matlab)出圖來只能輸出具備二維(也就是特徵數是2)的樣本分界,所以也就成了線了。好了,閒話少說,進入正題。要繪分界線,就要用到訓練結果,咱們在第二節和第三節都討論了,訓練結果(或訓練模型)文件怎麼輸出,可是,沒怎麼詳細說明怎麼使用訓練結果,如今具體說明。下面是兩個模型文件: 編程

                  5.1               5.2

                          圖5.1 兩類模型文件                                 5.2 三類模型文件網絡

 

     從圖5.15.2比較能夠看出,兩類只存在一個分類器,所以每一個支持向量對應的係數α(也就是SV的第一排),也只有 1個(固然,截距rho也只有一個)。這種狀況最簡單,只要把相應的支持向量和α的值帶入方程: 數據結構

 5.3                                (5.1)工具

 

     找到爲0的解,就是分界點了。(式中,有些文獻是+blibSVM採用的是-b學習

    對於三類或多類時,狀況就比較複雜。咱們原來討論過,對於類數k>2的狀況,分類器個數爲k×(k-1)/2個,那麼對應的b值(也就是rho)應該也是k×(k-1)/2個。那麼每一個支持向量對應的係數α是多少呢?是k-1個,由於每一個支持向量(sv)與其餘每一個類都有一個係數相對應。固然,和有的類對應時可能不是標準支持向量(0<alpha[i]<C),可是至少和其中一個類對應是標準的。咱們先看一下圖5.2SV的數據結構: spa

 

nSV對應的αiyiorm

特徵1ci

特徵2數學

0(label-1)

13

0 - V - 1

0 - V - 2

 

1:0.297595

 

2:1.197805

0.4800095239454689

0.2016577869168293

1(label0)

中間9

1 - V - 0

1 - V - 2

 

1:3.621706

 

2:1.263636

-0.6580578158072528

0.7036762846823739

2(label1)

8

2 - V - 0

2 - V - 1

 

1:8.296066

 

2:7.225341

-0.7056286598529473

-0.6494097661702236

    從表中,能夠看出,每一個支持向量(SV)都有相應的k-1(這裏的k3)個α,後面就是向量的數據。所以,輸出分界線時,只要認清係數的位置就能夠了。如要輸出類0和類2之間的分界線,就要帶入類0的第二列和類2的第1列中的α 

   這裏須要重點說明的是:文件輸出的不是單純的α,其實是αiyi(這裏的yi是在訓練時的+1-1,而不是原始樣本的label),所以在帶入5.1式時,不須要判斷yi的值了。

      瞭解了數據結構之後,就是求解方程。5.1式是個多元方程(這和x的維數有關,這裏討論的是2維的,所以是二元方程),而只有一個等式,所以要對其中一個參數作定常處理。先求出其中一個參數的範圍,不妨設爲x[0](在繪圖時至關於x座標軸)x_maxx_min,而後分紅100等分,對每個節點處

      x[0]= i×(x_max- x_min)/100+ x_min

      這樣,x[0]就至關於固定了,而後代入5.1式求x[1](也就是y)。這就轉化成了一元方程,能夠採用傳統的數學解法,這裏,我採用的是網絡遍歷法。也就是對x[1]也分紅100分進行遍歷,把節點處的x[1]:

       x[1]= j×(y_max- y_min)/100+ y_min

     代入5.1式,看是否接近於0,若是接近0,說明此點是邊界點,而後輸出座標就能夠了。

                                                 for(i = 0; i < 100; i ++)

                                                        for(j = 0; j < 100; j ++)

                                                        {

                                                               X[0] = x[0]i;

                                                               X[1] = x[1]j;

                                                             if( 5.4)

 

                                                              cout << X[0] << 「 「 <<  X[1] <<endl;

                                                        }

 

    分界點座標輸出之後,就能夠用matlab把分界線繪製出來了。

相關文章
相關標籤/搜索