我想用多项式内核svm计算原始变量w,但要做到这一点,我需要计算clf.coef_ * clf.support_vectors_。在线性以外的所有内核类型上访问都被限制为.coef_ - 这是否有原因,在这种情况下是否有另一种方法来派生w?
答案 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
我们因此断言,上面计算的边际对应于点云之间的最小距离。