python下使用libsvm:計算點到超平面的距離

最近在看的資料裏涉及到計算 點到支持向量機分類超平面的距離 這一點內容,我使用的svm是libsvm。python

因爲是新手,雖然看了一些資料,但中英轉換偏差等等緣由致使常常出現理解錯誤,所以對libsvm的瞭解是磕磕絆絆。在摸索libsvm各類返回值的意義和運用它產生的結果文件過程當中繞了很多彎。函數

最開始接觸這個問題的解答是在libsvm自己的faq中:測試

Q: How do I get the distance between a point and the hyperplane?
spa

The distance is |decision_value| / |w|. We have |w|^2 = w^Tw = alpha^T Q alpha = 2*(dual_obj + sum alpha_i). Thus in svm.cpp please find the place where we calculate the dual objective value (i.e., the subroutine Solve()) and add a statement to print w^Tw..net

這裏Q不知道是什麼東西,不過至少能夠知道  blog

distance=|decision_value|/|w|=|decision_value|/sqr(2*(dual_obj+sum(αi))ci

可是,decision_value究竟是神馬!dual_obj和sum(αi)到底在哪兒!!初學者博主很想咆哮有木有!!!get

那咱們先來看看從libsvm的返回值和結果文件中都能獲得什麼東西。it

首先,在訓練模型的時候(就是用svm_train()這個函數的時候),能在終端獲得這些返回值(我寫python程序都是在終端運行):io

    #iter:迭代次數

    nu:選擇的核函數類型的參數

    obj:svm文件轉換成的二次規劃求解獲得的最小值(這裏混入了奇怪的東西是否是,沒錯!隱藏的這麼深的就是obj,看看上面的距離公式)

    rho:決策函數的偏置項b(決策函數f(x)=w^T*x+b)

    nSV:標準支持向量的個數(0<αi<c)

    nBSV:邊界上的支持向量的個數(αi=c)

    Total nSV:支持向量的總個數(二分類的話就等於nSV,多分類的話就是多個分界面上nSV的和)

我纔不會告訴你剛纔這些返回值的解讀是來自這裏:http://blog.163.com/shuangchenyue_8/blog/static/399543662010328101618513/

接下來再看訓練模型所生成的model文件,其中的信息包括:

    svm_type c_svc           (svm的種類,取的默認值)

    kernel_type rbf           (核函數的類型,這裏取的默認值)

    gamma 0.0117647    (參數γ)

    nr_class 2              (幾分類,我這裏作的是2分類)

    total_sv 1684

    rho -0.956377

    label 0 1               (兩種類別的標識)

    nr_sv 1338 346    (全部支持向量中兩種類別各自佔了多少)

    SV               (哦哦,如下就是真正的支持向量啦,看看長什麼樣)

    0.536449657223129 1:39 2:2 3:3 。。。。

    0.3766245470441405 1:11 3:3 4:3 。。。。

    數據格式都是 前面一個數+空格+向量

    前面這個數是什麼捏?它就是咱們苦苦尋找的α啊!!  後面的向量不用多說,就是支持向量本尊嘍,這裏跟訓練數據不一樣的是它的存儲格式,稀疏向量存儲的方式,把值爲0的剔掉不記錄,好比這裏

    1:11 3:3 4:3。。。。

實際上是  1:11 2:0 3:3 4:3。。。。

    到如今爲止咱們的objα都出現啦,如今就剩decision_value啦。其實這個時候咱們就能夠算出分類超平面的值了:

    f(x)=w^T*x+b

    w=∑αi*yi*αi 後面這個綠色標註的表明向量(這裏的表達式參見這位寫的svm資料,不錯哦http://blog.csdn.net/v_july_v/article/details/7624837),這樣α知道了,b知道了(就是上面的rho),分類超平面方程就獲得了,根據空間中點到面的距離d=|f(x)|/|w|,把要考察的點x帶入,是否是!!計算出來啦!!!

   不過有時候想偷懶,不想本身計算|f(x)|怎麼辦?

   不要緊!libsvm在手,天下我有!(原諒博主瘋瘋癲癲,快半夜了有點興奮)

   來看看svm_predict()這個函數給咱們返回了什麼信息:

   通常不是這樣寫的嘛 p_labels,p_acc,p_vals=svm_predict(......)

   p_labels就是模型對這些測試數據預測的label

   p_acc就是分類準確率啦,均方差啦還有squared correlation coefficient(相關係數平方?)

   p_vals:在libsvm python interface 中這樣說,a list of decision values or probability estimates(if '-b 1'is specified)這不就是咱們要找的決策值嗎!!%>_<%

好啦好啦,到此爲止這個問題就算解決啦!

相關文章
相關標籤/搜索