是否有理由 scikit-learn 只允许使用线性 svm 访问clf.coef_



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

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

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

对计算保证金的评论的回答:

根据维基百科关于支持向量机的条目,边距宽度由 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

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

相关内容

  • 没有找到相关文章