在使用scikit-learn训练了SVM分类器之后,我需要alpha值,这是SVM对偶问题的拉格朗日乘数。根据该文档,似乎scikit-learn仅提供svm.dual_coef_
,它是Lagrange乘数alpha与数据点标签的乘积。
我尝试通过将svm.dual_coef_
的元素除以数据标签来手动计算alpha值,但是由于svm.dual_coef_
仅存储支持向量的系数,因此我不确定是否对这个数组进行迭代,因此支持向量的顺序为与原始训练数据中的顺序相同。
那么,有没有一种可靠的方法来获取支持向量的alpha值?
最佳答案
由于alpha值按定义是正数,因此您可以通过使用double_coefs来获取它:
alphas = np.abs(svm.dual_coef_)
这是以下事实的直接结果:
svm.dual_coef_[i] = labels[i] * alphas[i]
其中
labels[i]
是-1
或+1
和alphas[i]
始终为正。此外,您还可以通过labels = np.sign(svm.dual_coef_)
使用相同的观察结果。这也是scikit-learn不存储alpha的原因-它们由dual_coefs_以及标签唯一表示。
分析所有可能的情况后,很容易理解它:
labels[i] == -1
和alphas[i] > 0
=> dual_coef_[i] < 0
和dual_coef_[i] == -alphas[i] == labels[i] * alphas[i]
labels[i] == -1
和alphas[i] < 0
=> 不可能(字母为非负数) labels[i] == -1
和alphas[i]== 0
=> 这不是支持向量 labels[i] == +1
和alphas[i] > 0
=> dual_coef_[i] > 0
和dual_coef_[i] == alphas[i] == labels[i] * alphas[i]
labels[i] == +1
和alphas[i] < 0
=> 不可能(字母为非负数) labels[i] == +1
和alphas[i]== 0
=> 这不是支持向量 因此,如果
dual_coef_[i]
为正,则它是alphas[i]
系数,属于正类;如果为负,则alphas[i] == -dual_coef_[i]
属于负类。关于python - 如何获取scikit-learning SVM分类器的所有alpha值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33860938/