對於學習SVM人來講,要判斷SVM效果,以圖形的方式輸出的分解線是最直觀的。LibSVM自帶了一個可視化的程序svm-toy,用來輸出類之間的分界線。他是先把樣本文件載入,而後進行訓練,經過對每一個像素點的座標進行判斷,看屬於哪一類,就附上那類的顏色,從而使類與類之間造成分割線。咱們這一節不討論svm-toy怎麼使用,由於這個是「傻瓜」式的,沒什麼好討論的。這一節咱們主要探討怎麼結合訓練結果文件,本身編程輸出分界線。web
爲何說是分界線呢,其實嚴格說來是分解超平面,可是咱們爲了能直觀用繪圖工具繪(好比matlab)出圖來只能輸出具備二維(也就是特徵數是2)的樣本分界,所以也就成了線了。好了,閒話少說,進入正題。要繪分界線,就要用到訓練結果,咱們在第二節和第三節都討論了,訓練結果(或訓練模型)文件怎麼輸出,可是,沒怎麼詳細說明怎麼使用訓練結果,如今具體說明。下面是兩個模型文件: 編程
圖5.1 兩類模型文件 圖5.2 三類模型文件網絡
從圖5.1和5.2比較能夠看出,兩類只存在一個分類器,所以每一個支持向量對應的係數α(也就是SV的第一排),也只有 1個(固然,截距rho也只有一個)。這種狀況最簡單,只要把相應的支持向量和α的值帶入方程: 數據結構
(5.1)工具
找到爲0的解,就是分界點了。(式中,有些文獻是+b,libSVM採用的是-b)學習
對於三類或多類時,狀況就比較複雜。咱們原來討論過,對於類數k>2的狀況,分類器個數爲k×(k-1)/2個,那麼對應的b值(也就是rho)應該也是k×(k-1)/2個。那麼每一個支持向量對應的係數α是多少呢?是k-1個,由於每一個支持向量(sv)與其餘每一個類都有一個係數相對應。固然,和有的類對應時可能不是標準支持向量(0<alpha[i]<C),可是至少和其中一個類對應是標準的。咱們先看一下圖5.2的SV的數據結構: 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(label爲0) 中間9個 |
類1 - V - 類0 |
類1 - V - 類2 |
1:3.621706 |
2:1.263636 |
-0.6580578158072528 |
0.7036762846823739 |
|||
類2(label爲1) 後8個 |
類2 - V - 類0 |
類2 - V - 類1 |
1:8.296066 |
2:7.225341 |
-0.7056286598529473 |
-0.6494097661702236 |
從表中,能夠看出,每一個支持向量(SV)都有相應的k-1(這裏的k爲3)個α,後面就是向量的數據。所以,輸出分界線時,只要認清係數的位置就能夠了。如要輸出類0和類2之間的分界線,就要帶入類0的第二列和類2的第1列中的α。
這裏須要重點說明的是:文件輸出的不是單純的α,其實是αiyi(這裏的yi是在訓練時的+1或-1,而不是原始樣本的label),所以在帶入5.1式時,不須要判斷yi的值了。
瞭解了數據結構之後,就是求解方程。5.1式是個多元方程(這和x的維數有關,這裏討論的是2維的,所以是二元方程),而只有一個等式,所以要對其中一個參數作定常處理。先求出其中一個參數的範圍,不妨設爲x[0](在繪圖時至關於x座標軸)x_max和x_min,而後分紅100等分,對每個節點處
x[0]i = i×(x_max- x_min)/100+ x_min
這樣,x[0]就至關於固定了,而後代入5.1式求x[1](也就是y)。這就轉化成了一元方程,能夠採用傳統的數學解法,這裏,我採用的是網絡遍歷法。也就是對x[1]也分紅100分進行遍歷,把節點處的x[1]:
x[1]j = 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( )
cout << X[0] << 「 「 << X[1] <<endl;
}
分界點座標輸出之後,就能夠用matlab把分界線繪製出來了。