【发布时间】:2013-12-05 11:09:18
【问题描述】:
我试图了解 decision_function 和 predict 之间的关系,它们是 SVC 的实例方法 (http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html)。到目前为止,我已经收集到决策函数返回类之间的成对分数。我的印象是 predict 选择了最大化其成对分数的类,但我对此进行了测试并得到了不同的结果。这是我用来尝试理解两者之间关系的代码。首先我生成了成对分数矩阵,然后我打印出了与 clf.predict 预测的类不同的最大成对分数的类。
result = clf.decision_function(vector)[0]
counter = 0
num_classes = len(clf.classes_)
pairwise_scores = np.zeros((num_classes, num_classes))
for r in xrange(num_classes):
for j in xrange(r + 1, num_classes):
pairwise_scores[r][j] = result[counter]
pairwise_scores[j][r] = -result[counter]
counter += 1
index = np.argmax(pairwise_scores)
class = index_star / num_classes
print class
print clf.predict(vector)[0]
有人知道这些 predict 和 decision_function 之间的关系吗?
【问题讨论】:
-
“决策函数返回类之间的成对分数”不正确。它应该是“每个类的分数”,因为它在
decision_function部分的文档页面中编写:“样本 X 到分离超平面的距离。” -
@justhalf:不,OP 是正确的。
sklearn.svm.SVC默认使用成对(一对一)分解,并返回每个样本到所有 n(n-1)/2 个超平面的距离。 -
哎呀,是的,我记得在某处读过它。但被文档误导了。对不起!
-
尝试回答后,我认为bcorso的回答应该是那个。这种关系实际上是基于他从 C++ 实现中翻译的代码:
decision = decision_function(params, sv, nv, a, b, X); votes = [(i if decision[p] > 0 else j) for p,(i,j) in enumerate((i,j) for i in range(len(cs)) for j in range(i+1,len(cs)))]。votes的最高票数基本上是predict所做的。
标签: python numpy svm scikit-learn