老师要求svm输出概率值,然后发现libsvm已经自带了这个函数,网络上没有看到有说明,于是看了看相关文献自己写了一个。
首先附参考文献:
1.Probabilistic Outputsfor Support Vector Machines and Comparisons to Regularized Likelihood Methods
2.A Note on Platt’s Probabilistic Outputs for Support VectorMachines
Vector Machine。
主要参考文献是1,libsvm里采用的是论文1的思路输出的概率值。下面先列出一些基础知识。
1基础知识:
1.1 sigmoid函数
sigmoid函数是一个良好的阈值函数,连续,光滑,严格单调。
可以将实轴上的数值投射到[0,1]上,即将一个输出实值抓化为一个概率值。比如一个分类器的分界线为0,大于0标为+1,小于0标为-1;如果使用上图的sigmoid函数套一下输出值。我们就可以说,输出为0时标为+1的概率为0.5;输出为2时标为+1的概率为0.8等。
1.2后验估计
从极大似然估计到极大后验估计。基础知识在此不再详述。
下面是做N次独立重复实验的后验估计。
对上面第四点得到的后验估计求均值。参数的后验估计值为(X+1)/(N+2)
(有时后验估计取峰值,有时取均值,这个还不太明白。)
2 支持向量机输出概率值的方法。
首先输出的概率值的式子为:
、
同样采取一个sigmoid函数将支持向量机的输出值映射到[0,1]之间。我们知道支持向量机的决策函数为:
这个括弧里面的量是一个与分界面的距离成正比的量。这种算法的思想是离分界面越近的点认为分对的可能性越小;离分界面越远的点认为分对的可能性越大。
有两个参数A和B来调整映射值的大小,我们姑且叫它们位置参量(B)和尺度参量(A)。
然后这两个参数A和B是未知参数,需要估计。可能会想到用这式子来估计A和B的值:
论文中是这样写的
negative log likelihood of the training data, which is a cross-entropy error function
关于负log似然函数和交叉熵损失方程。这里有更详细的说明:
http://blog.youkuaiyun.com/u012162613/article/details/44239919
但是很直观可以看出,当y只能取+1或者-1时,这个式子就退化成一个极大似然估计函数。
使用这种方法是从全部的数据中估计A和B的值,Platt认为这种方法存在过拟合的风险,因此他假设存在一些out-of-sample的数据来修正的值,也就是不取1和0了
他采取了我们上文基础知识二所讲的贝叶斯方法:
取
这个式子和1.2中推倒的结果是一致的。
由此我们获得了最后的计算流程:
我对那个交叉熵还蛮感兴趣,准备研究一下。看完再补
转载自:https://i-blog.csdnimg.cn/blog_migrate/f5fb82a1cf97b5c8c5f8fec44c598ba3.png