sklearn SVC线性核提供奇怪的支持向量

1 投票
1 回答
750 浏览
提问于 2025-04-18 06:52

代码:

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 个回答

2

你使用的 C 值太小了,实际上你得到的并不是你想要的“硬间隔支持向量机”,而是一个“软间隔”的版本,这种版本有更多的支持向量(并不完全在“间隔边界”上)。

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 的代码,来查看你分隔超平面的位置和间隔大小。

撰写回答