SVM中决策距离(函数)计算

原创 2016年05月30日 16:10:57

sklearn中的SVM算法使用了liblinear和libsvm两个包,而且模型参数略有区别。

在sklearn中,SVM有SVC和SVR之分,且有四种核函数如下,所以在SVM的参数中有些模型需要,有些模型不需要。

  • linear: \langle x, x'\rangle.
  • polynomial: (\gamma \langle x, x'\rangle + r)^dd is specified by keyword degreer by coef0.
  • rbf: \exp(-\gamma |x-x'|^2)\gamma is specified by keyword gamma, must be greater than 0.
  • sigmoid (\tanh(\gamma \langle x,x'\rangle + r)), where r is specified by coef0.
sklearn中SVM模型的参数(函数)很多,以svm.SVC.linear为例,有如下这些:

linear.C(正则项惩罚因子)                        linear.degree  (polynomial独有,默认为3次多项式)

linear.max_iter(最大跌打次数)                 linear.random_state

linear.cache_size(运行内存大小)               linear.dual_coef_  (对偶函数的系数,在计算sigmoid概率时用)

linear.n_support_  (支持向量个数)             linear.score
linear.class_weight             linear.epsilon                  linear.nu                       linear.set_params
linear.class_weight_            linear.fit(函数,用于模型训练)                      l

inear.predict  (函数,用于模型预测)                linear.shape_fit_
linear.classes_                 linear.fit_status_              linear.predict_log_proba(log概率值预测)        linear.shrinking
linear.coef0  (polynomial/sigmoid使用)                  linear.gamma                    

linear.predict_proba(概率值预测)            linear.support_(支持向量index)
linear.coef_   (各个特征权重,即预测的w)                 linear.get_params               

linear.probA_                   linear.probB_  linear.support_vectors_
linear.decision_function(函数,计算决策值)        linear.intercept_  (截距,即预测的b,libsvm中为rho)                      

linear.tol(模型训练的容错值)linear.decision_function_shape  linear.kernel(kernel类型)                   

linear.probability(True/False,是否设置可以计算概率值,略微会影响速度)              linear.verbose

决策函数的计算linear.decision_function

因为线性核函数最终预测的法平面为y=linear.coef_  * X + linear.intercept_  , 而点X到法平面的距离为

|linear.coef_  * X + linear.intercept_| / ||linear.coef_||,决策函数并没有采用距离计算,而是,直接:

decision_function = linear.coef_  * X + linear.intercept_,其若大于0则label预测为1,否则预测为0。

根据SKLearn中决策函数的定义:


之所以可以直接使用 linear.coef_  * X + linear.intercept_计算,是因为linear.coef_ 为linear.dual_coef_ (为一个n维向量,n为选取的支持向量的个数)和linear.support_vectors_(二位向量[支持向量个数,特征个数])的内积,最终的内积linear.coef_为大小等于特征个数的向量。


关于libsvm可以参考如下:

http://my.oschina.net/u/1461744/blog/209104

最近在看的资料里涉及到计算 点到支持向量机分类超平面的距离 这一点内容,我使用的svm是libsvm。

由于是新手,虽然看了一些资料,但中英转换误差等等原因导致经常出现理解错误,因此对libsvm的了解是磕磕绊绊。在摸索libsvm各种返回值的意义和运用它产生的结果文件过程中绕了不少弯。

最开始接触这个问题的解答是在libsvm本身的faq中:

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

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.

这里Q不知道是什么东西,不过至少可以知道  

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

但是,decision_value到底是神马!dual_obj和sum(αi)到底在哪儿!!初学者博主很想咆哮有木有!!!

那我们先来看看从libsvm的返回值和结果文件中都能得到什么东西。

首先,在训练模型的时候(就是用svm_train()这个函数的时候),能在终端得到这些返回值(我写python程序都是在终端运行):

    #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)这不就是我们要找的决策值吗!!%>_<%

好啦好啦,到此为止这个问题就算解决啦!

手把手教你实现SVM算法(一)

什么是机器学习 (Machine Learning)       机器学习是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能的...
  • alvine008
  • alvine008
  • 2013年06月14日 18:09
  • 159311

支持向量机SVM推导及求解过程

支持向量机是属于原创性(非组合)的具有明显直观几何意义的分类算法,具有较高的准确率。        使用SVM算法的思路:(1)简单情况,线性可分情况,把问题转化为一个凸优化问题,可以用拉格朗日乘子法...
  • American199062
  • American199062
  • 2016年05月05日 14:42
  • 11585

SVM

与感知机模型很相似的SVM的介绍!
  • tjy1220646144
  • tjy1220646144
  • 2015年04月28日 20:54
  • 1024

svm核函数的理解和选择

特征空间的隐式映射:核函数     咱们首先给出核函数的来头:在上文中,我们已经了解到了SVM处理线性可分的情况,而对于非线性的情况,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) ,通过将数据映...
  • Leonis_v
  • Leonis_v
  • 2016年02月18日 22:52
  • 30398

python sklearn decision_function、predict_proba、predict

import matplotlib.pyplot as plt import numpy as np from sklearn.svm import SVC X = np.array([[-1,-1]...
  • o1101574955
  • o1101574955
  • 2017年04月17日 15:37
  • 4703

scikit-learn学习之SVM算法

分隔超平面:将数据集分割开来的直线叫做分隔超平面。 超平面:如果数据集是N维的,那么就需要N-1维的某对象来对数据进行分割。该对象叫做超平面,也就是分类的决策边界。 间隔: 一个点到分割面的距离,称为...
  • Gamer_gyt
  • Gamer_gyt
  • 2016年05月04日 21:12
  • 26993

SVM分割超平面的绘制与SVC.decision_function( )的功能

在李航老师的《统计学习方法》— 支持向量机那张有个例题: 样本点x1=(3,3),x2=(4,3),x3=(1,1),labels=(1,1,−1)x_1 = (3,3),x_2=(4,3),x_3...
  • qq_33039859
  • qq_33039859
  • 2017年04月09日 14:17
  • 3602

点到超平面的距离

这是高中时候的基础数学,然而也是比较重要的一个知识点,在很多地方都会用到,在基于超平面分类算法中,向量空间中任意一点到超平面的距离也是一个基础知识点 平面的一般式方程 Ax +By +Cz...
  • u011954647
  • u011954647
  • 2017年02月20日 09:58
  • 2347

数据挖掘(机器学习)面试--SVM面试常考问题

应聘数据挖掘工程师或机器学习工程师,面试官经常会考量面试者对SVM的理解。 以下是我自己在准备面试过程中,基于个人理解,总结的一些SVM面试常考问题(想到会再更新),如有错漏,请批评指正。(大神请忽视...
  • szlcw1
  • szlcw1
  • 2016年08月20日 10:15
  • 10404

关于libSVM的一些总结

libsvm相关参数
  • sherry_gp
  • sherry_gp
  • 2016年07月04日 20:44
  • 9984
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SVM中决策距离(函数)计算
举报原因:
原因补充:

(最多只允许输入30个字)