我在使用Libsvm进行异常检测(通过Java),但我需要的是概率估计,而不仅仅是标签。我追踪了代码,发现这并不可行。特别是在函数svm_predict_values(..)中,我看到了以下代码:
if(model.param.svm_type == svm_parameter.ONE_CLASS) return (sum>0)?1:-1;else return sum;
我理解一类支持向量机试图根据“正常”类的样本或数据点来估计某个概率分布的支持。给定一个新的数据点,并且假设模型已经学会了正常类分布的支持,我能否得到一个新的数据点是“正常”还是异常的概率估计?似乎这是不可能的,这就是为什么Libsvm会对上述总和进行阈值处理并仅返回一个成员标签,但我不知道为什么。如果可以从一类支持向量机中获得概率估计,我在花了很多时间阅读代码后,并不明白如何在Libsvm中实现这一点。
我选择这条路的原因是我认为在高维设置中,核密度估计可能不会很好地工作,但也许支持向量机也会面临同样的问题。
回答:
我理解一类支持向量机试图根据“正常”类的样本或数据点来估计某个概率分布的支持
问题是这句话对于支持向量机来说是错误的。一般来说,是的,这将是一种构建分类器的不错的概率方法,被逻辑回归、神经网络和许多其他模型所采用。然而,支持向量机并不属于这一类,它没有适当的概率解释,它并不真正构建概率分布,而是直接寻找一个好的决策规则。有更多概率替代方案,如相关向量机(RVM),然而,它们是非凸的。唯一的原因是二元支持向量机可以为您提供概率估计,是因为在许多实现中有一个小的“作弊”,由Platt首创,您只需在支持向量机之上拟合另一个概率模型 – 通常是在支持向量机投影之上进行逻辑回归。
那么,您能做什么呢?您可以选择其他更具概率性的模型,或者使用类似的“作弊”方法,先通过支持向量机投影您的数据(这就是代码中提供的“sum”),然后在其上拟合逻辑回归,这将是您的概率估计。