如何获取scikit-learn SVM分类器的所有alpha值?

PJ.*_*des 4 python machine-learning svm scikit-learn

在使用scikit-learn训练SVM分类器之后,我需要alpha值,这是SVM双重问题的拉格朗日乘数.根据该文件,似乎scikit-learn仅提供svm.dual_coef_,这是拉格朗日乘数α和数据点标签的乘积.

我试图通过除以svm.dual_coef_数据标签的元素手动计算alpha值,但由于svm.dual_coef_只存储支持向量的系数,我不确定是否迭代这个数组,支持向量的顺序是相同的作为原始训练数据中的顺序.

那么有一种可靠的方法来获得支持向量的alpha值吗?

lej*_*lot 9

由于alpha值的定义是正面的,你可以通过abs的dual_coefs得到它:

alphas = np.abs(svm.dual_coef_)
Run Code Online (Sandbox Code Playgroud)

威尔是事实的直接后果

svm.dual_coef_[i] = labels[i] * alphas[i]
Run Code Online (Sandbox Code Playgroud)

其中,labels[i]要么是-1+1alphas[i]始终为正.此外,您还可以获得每个标签

labels = np.sign(svm.dual_coef_)
Run Code Online (Sandbox Code Playgroud)

使用相同的观察.这也是为什么scikit-learn不存储alphas的原因 - 它们由dual_coefs_以及标签唯一地表示.

一旦分析了所有可能的情况,就很容易理解它:

  • labels[i] == -1alphas[i] > 0=> dual_coef_[i] < 0dual_coef_[i] == -alphas[i] == labels[i] * alphas[i]
  • labels[i] == -1alphas[i] < 0=> 不可能(alphas是非负的)
  • labels[i] == -1alphas[i]== 0=> 它不是支持向量
  • labels[i] == +1alphas[i] > 0=> dual_coef_[i] > 0dual_coef_[i] == alphas[i] == labels[i] * alphas[i]
  • labels[i] == +1alphas[i] < 0=> 不可能(alphas是非负的)
  • labels[i] == +1alphas[i]== 0=> 它不是支持向量

因此,如果dual_coef_[i]是正alphas[i]数,则它是系数,它属于正类,如果是负数,alphas[i] == -dual_coef_[i]则它属于负类.