最近在看的資料裏涉及到計算 點到支持向量機分類超平面的距離 這一點內容,我使用的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)這不就是咱們要找的決策值嗎!!%>_<%
好啦好啦,到此爲止這個問題就算解決啦!