scikit-learn是否只允许使用线性svms访问clf.coef?

时间:2014-11-20 21:38:39

标签: python machine-learning scikit-learn svm

我想用多项式内核svm计算原始变量w,但要做到这一点,我需要计算clf.coef_ * clf.support_vectors_。在线性以外的所有内核类型上访问都被限制为.coef_ - 这是否有原因,在这种情况下是否有另一种方法来派生w?

2 个答案:

答案 0 :(得分:5)

对于非线性的内核,它们根本不存在:内核SVM在双空间中求解,因此通常只能访问双系数。

在线性情况下,这可以转换为原始特征空间系数。在一般情况下,这些系数必须存在于所选内核所跨越的特征空间中,这可以是无限维的。

答案 1 :(得分:2)

关于计算保证金的评论的答案:

根据the wikipedia entry on support vector machines,边距宽度由2 / ||w||计算。让我们验证那篇文章中的其他一些公式。

我们在2D中使用两个完全可分离的方点云

import numpy as np
rng = np.random.RandomState(42)

n_samples = 100
neg_samples = rng.rand(n_samples // 2, 2)
pos_samples = rng.rand(n_samples // 2, 2) + np.array([3, 3])

X = np.vstack([neg_samples, pos_samples])
y = np.concatenate([-np.ones(n_samples // 2), np.ones(n_samples // 2)])

from sklearn.svm import SVC
svc = SVC(kernel="linear")

svc.fit(X, y)

观察

svc.dual_coef_ == np.array([0.1999464, -0.1999464])

因此总和为零。我们可以暂时得出结论:svc.dual_coef_对应于维基百科文章中的alpha * y

现在让我们计算决策向量和边距

w = svc.dual_coef_.dot(svc.support_vectors_)
margin = 2 / np.sqrt((w ** 2).sum())

from sklearn.metrics import euclidean_distances
distances = euclidean_distances(neg_samples, pos_samples)

assert np.abs(margin - distances.min()) < 1e-6

我们因此断言,上面计算的边际对应于点云之间的最小距离。