使用python中的scikit包在SVM中获得负的alpha值

los*_*_19 5 python machine-learning convex-optimization svm scikit-learn

我在python中使用scikit包实现SVM.我在解释plot_separating_hyperplane.py中的"alpha i"值时遇到了困难

import numpy as np
import pylab as pl
from sklearn import svm

# we create 40 separable points
np.random.seed(0)
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
Y = [0] * 20 + [1] * 20

# fit the model
clf = svm.SVC(kernel='linear')
clf.fit(X, Y)
print clf.support_vectors_
#support_vectors_ prints the support vectors
print clf.dual_coef_
#dual_coef_ gives us the "alpha i, y i" value for all support vectors
Run Code Online (Sandbox Code Playgroud)

样本输出

Dual_coef_ = [[ 0.04825885  0.56891844 -0.61717729]]
Support Vectors = 
[[-1.02126202  0.2408932 ]
 [-0.46722079 -0.53064123]
 [ 0.95144703  0.57998206]]
Run Code Online (Sandbox Code Playgroud)

Dual_coef_为我们提供了"alpha i*y i"值.我们可以确认"alpha i*y i"的总和= 0(0.04825885 + 0.56891844 - 0.61717729 = 0)

我想找出"alpha i"值.它应该很容易,因为我们有"alpha i*y i"值.但我得到的所有"alpha i"都是消极的.例如,点(0.95144703,0.57998206)位于该线上方(参见链接).所以y = +1.如果y = +1,则alpha为-0.61717729.类似地,点(-1.02126202,0.2408932)位于该线下方.所以y = -1,因此alpha = -0.04825885.

为什么我将alpha值设为负值? 我的解释错了吗?任何帮助将不胜感激.


供你参考,

对于支持向量分类器(SVC),

给定训练向量,i = 1,...,n,在两个类中,以及一个向量,SVC解决了以下原始问题:

在此输入图像描述

它的双重性是

在此输入图像描述

其中'e'是所有1的向量,C> 0是上界,Q是n乘n正半定矩阵, 在此输入图像描述在此输入图像描述是内核.这里训练矢量被函数映射到更高(可能是无限的)维空间.

And*_*ler 4

我认为你只是错误地解释了 y 。我猜线上方是 y=-1,线下方是 y=+1。

为什么你认为事情恰恰相反?

对于二类问题,我认为是“一类”。即数字最小的一个为+1,另一个为-1。这是 LibSVM 约定。

  • 这可能是 LibSVM 约定,但它不符合 scikit-learn 约定。我们总是按照类标签的 Python/NumPy 顺序对类进行排序。 (2认同)