最近在看的资料里涉及到计算 点到支持向量机分类超平面的距离 这一点内容,我使用的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)这不就是咱们要找的决策值吗!!%>_<%
好啦好啦,到此为止这个问题就算解决啦!