我遇到了类似的问题,但原因不同。
我的目标是不使用内置的SVC.predict 来计算推理。
假设:
import numpy as np
from sklearn.svm import SVC
X = np.array([[3, 4], [1, 4], [2, 3], [6, -1], [7, -1], [5, -3]])
y = np.array([-1, -1, -1, 1, 1, 1])
clf = SVC(C=1e5, kernel='linear')
clf.fit(X, y)
我想仅使用代数计算训练模型的预测。
现在线性推理的公式很简单:
统称为权重。让事情变得超级简单的是clf.coef_ 为您提供权重。
所以:
w = clf.coef_
b = clf.intercept_
assert np.sign(w.dot(X[0]) + b)[0] == clf.predict(X[0].reshape((1, 2)))
旁注:乘法之和正是dot 对两个向量所做的,输入向量的reshape 需要符合预期的predict 输入形状。
当然,对于其他内核来说,比这更复杂,从这个公式
和之前的答案,我们无法预先计算权重,因为 都绑定在一起。
现在,在我得到朋友的帮助之前,这就是我遇到的问题。
谁发现了这个documentation page。它说 在 scikit 学习术语中是 clf.dual_coef_。
一旦你知道这个等式也变得简单了。
我们现在知道 的值。剩下要做的一件事是计算内核函数,这取决于内核的类型,用于 3 次多项式内核(这是 scikit 中 poly SVM 的默认次数) 大致转换为 np.power(clf.support_vectors_.dot(X), clf.degree)。 **
现在让我们将我们学到的所有内容结合到这段代码 sn-p 中:
import numpy as np
from sklearn.svm import SVC
X = np.array([[3, 4], [1, 4], [2, 3], [6, -1], [7, -1], [5, -3]])
y = np.array([-1, -1, -1, 1, 1, 1])
clf = SVC(kernel='poly', gamma=1)
clf.fit(X, y)
print('b = ', clf.intercept_)
print('Indices of support vectors = ', clf.support_)
print('Support vectors = ', clf.support_vectors_)
print('Number of support vectors for each class = ', clf.n_support_)
print('Coefficients of the support vector in the decision function = ', np.abs(clf.dual_coef_))
negative_prediction = clf.dual_coef_.dot(np.power(clf.gamma * clf.support_vectors_.dot(X[0]), clf.degree)) + clf.intercept_
positive_prediction = clf.dual_coef_.dot(np.power(clf.gamma * clf.support_vectors_.dot(X[4]), clf.degree)) + clf.intercept_
print('Compare both results')
print(negative_prediction, clf.decision_function(X[0].reshape((1, 2))))
print(positive_prediction, clf.decision_function(X[4].reshape((1, 2))))
assert np.sign(negative_prediction) == clf.predict(X[0].reshape((1, 2)))
assert np.sign(positive_prediction) == clf.predict(X[4].reshape((1, 2)))
如果你运行它,你会看到断言通过了,哇哦!我们现在可以预测不使用predict 的结果,我希望它可以帮助解决所提出的问题。从现在开始,您可以像调整权重一样调整对偶系数。
** 但是请注意,如果你不使用 gamma,也要将其从“手动计算”中删除,否则它只会中断。此外,它是多项式内核的推理示例,对于其他内核,推理功能应相应调整。 See documentation