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值吗?
由于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或+1和alphas[i]始终为正.此外,您还可以获得每个标签
labels = np.sign(svm.dual_coef_)
Run Code Online (Sandbox Code Playgroud)
使用相同的观察.这也是为什么scikit-learn不存储alphas的原因 - 它们由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=> 不可能(alphas是非负的)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=> 不可能(alphas是非负的)labels[i] == +1和alphas[i]== 0=> 它不是支持向量因此,如果dual_coef_[i]是正alphas[i]数,则它是系数,它属于正类,如果是负数,alphas[i] == -dual_coef_[i]则它属于负类.