2017-04-12 115 views
1

我必须错在这里做简单的东西,但我无法弄清楚。SVM线性分类 - 奇怪的行为

from sklearn import svm 
clf = svm.SVC(kernel='linear') 
y = [False, True, True] 
X = [[1.0], [2.0], [3.0]] 
clf.fit(X, y) 
clf.predict(1.4) 

Out[324]: array([False], dtype=bool) 

行为与预期...可是...

X = [[0.1], [0.2], [0.3]] 
clf.fit(X, y) 
clf.predict(0.14) 

Out[325]: array([True], dtype=bool) 

回答

1

这样做的原因行为是SVM的是sklearn实现包括调整参数。让我们看看这是如何影响结果的。

首先,在你的第二个例子clf.predict(0.14)True。事实上,即使clf.predict(0.1)给人True,这似乎违反直觉的,因为在你的训练例子中,你把它归类为False

的差异的两个例子之间的是,在第二个例子中,从不同的类的点是比第一个更接近彼此。因此,在第二个例子中,分离超平面的边界要小得多。现在

,SVM(无规则化)试图找到分离超平面与最大可能的利润,这将是你的第二个例子相当小。边距公式为​​3210(请参阅第7页here的顶部)。因此,小利润意味着大型||w||。 SVM将最小化0.5||w||^2(在某些限制下,请参阅第7页here)。

但是,当您添加正则化参数C时,SVM将尝试最小化0.5||w||^2+C*penalty(请参阅第19页底部的here)。所以它可能导致减少||w||,同时增加惩罚。这可能会增加分类错误率。

在sklearn实现SVM的默认正则是C=1。如果你改为C=1000,那么clf.predict(0.14)会给你False