在 python 中使用 scikit 包在 SVM 中获取负 alpha 值
Posted
技术标签:
【中文标题】在 python 中使用 scikit 包在 SVM 中获取负 alpha 值【英文标题】:Getting negative alpha value in SVM using scikit package in python 【发布时间】:2012-09-26 15:39:45 【问题描述】:我在 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
样本输出
Dual_coef_ = [[ 0.04825885 0.56891844 -0.61717729]]
Support Vectors =
[[-1.02126202 0.2408932 ]
[-0.46722079 -0.53064123]
[ 0.95144703 0.57998206]]
Dual_coef_ 为我们提供“alpha i * y i”值。我们可以确认“alpha i * y i”的总和 = 0 (0.04825885 + 0.56891844 - 0.61717729 = 0)
我想找出“alpha i”值。这应该很容易,因为我们有“alpha i * y i”值。但我让所有的“阿尔法我”都是负面的。 例如,点 (0.95144703, 0.57998206) 位于线 (see link) 的上方。所以 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半正定矩阵,和是内核。在这里,训练向量通过函数映射到更高(可能是无限)维空间。
【问题讨论】:
【参考方案1】:我认为您只是错误地解释了 y。我猜在线上方是 y=-1,下方是 y=+1。
为什么你认为是相反的?
对于一个两级问题,我认为是“第一级”。即数字最小的一个是+1,另一个是-1。 这是一个 LibSVM 约定。
【讨论】:
这可能是 LibSVM 约定,但它不符合 scikit-learn 约定。我们总是按照 Python/NumPy 的标签排序来对类进行排序。 我也不完全确定;)我在某个时候做了一些符号交换... lostboy_19:您使用的是哪个版本的 sklearn? 我可以在最近的master
上重现这个。
@AndreasMueller 感谢您的回复。我使用的是 0.11 版本。我几个月前下载了它。而且我真的怀疑 y=-1 是否位于该线之上。我认为根据数学推导,w.x+b=+1 位于线的上方,而 w.x+b=-1 位于线的下方。
我在图像平面的意义上使用“上方”。该图像没有说明 w 指向哪个方向。我建议它指向下方。以上是关于在 python 中使用 scikit 包在 SVM 中获取负 alpha 值的主要内容,如果未能解决你的问题,请参考以下文章
Scikit-learn 和 Yellowbrick 给出不同的分数
python使用textwrap包在已经生成的长字符串中嵌入回车符实战
在 python 中使用 scikit-learn 线性回归模型时出错