具有线性内核的sklearn svc提供了奇怪的支持向量

时间:2014-05-17 19:10:58

标签: python machine-learning scikit-learn svm

代码:

from sklearn import svm

def testsvm():
    t_d = [[1,1], [1,-1], [-1,-1], [-1, 1], [-0.0001, 0.0001], [0,0], [-1, -1.0001]]
    y = [1,-1,1,1, 1, 1, -1]

    clf = svm.SVC(kernel='linear', C=1)
    clf.fit(t_d, y)

    print clf.support_vectors_
    print clf

结果是:

[[ 1.     -1.    ]  
 [-1.     -1.0001]  
 [-1.     -1.    ]  
 [ 0.      0. ]]

但据我所知,支持向量应为:

[[1,1]
 [0,0]
 [-1,-1]
 [-1.     -1.0001]]
如果边距彼此平行,

不应该忽略[1,-1]吗?

我的代码有什么问题吗?如果是的话,请指出我。 非常感谢提前

1 个答案:

答案 0 :(得分:2)

你使用的C太小,只是你没有得到你正在考虑的“硬边缘SVM”,而是一个“软”版本,它有更多的支持向量(不完全是“保证金边界”)。

设置clf = svm.SVC(kernel='linear', C=100000000),一切都应该没问题

[[ 1.     -1.    ]
 [-1.     -1.0001]
 [-1.     -1.    ]]

您可以使用http://scikit-learn.org/stable/auto_examples/svm/plot_svm_margin.html中的代码来调查分离超平面和边距大小的确切位置。