2017-04-12 78 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