我正在尝试复制scikit-learn的svm.svr.predict(X),但不知道如何正确执行。
我想做的是,因为在用RBF内核训练SVM之后,我想在另一种编程语言(Java)上实现预测,并且我需要能够导出模型的参数,以便能够执行未知情况的预测。
在scikit的文档页面上,我看到有'support_和'support_vectors_属性,但不知道如何复制.prdict(X)方法。
y_pred=f(X,svm.svr.support_,svm.svr.support_vectors_,etc,…)形式的解决方案是我正在寻找的。
提前谢谢!
编辑:它的SVM用于回归,而不是分类!
编辑:这是我现在正在尝试的代码,从手动计算SVM的决策函数没有成功。。。
from sklearn import svm
import math
import numpy as np
X = [[0, 0], [1, 1], [1,2], [1,2]]
y = [0, 1, 1, 1]
clf = svm.SVR(gamma=1e-3)
clf.fit(X, y)
Xtest = [0,0]
print 'clf.decision_function:'
print clf.decision_function(Xtest)
sup_vecs = clf.support_vectors_
dual_coefs = clf.dual_coef_
gamma = clf.gamma
intercept = clf.intercept_
diff = sup_vecs - Xtest
# Vectorized method
norm2 = np.array([np.linalg.norm(diff[n, :]) for n in range(np.shape(sup_vecs)[0])])
dec_func_vec = -1 * (dual_coefs.dot(np.exp(-gamma*(norm2**2))) - intercept)
print 'decision_function replication:'
print dec_func_vec
两种方法的结果都不一样,为什么??
clf.decision_function:
[[ 0.89500898]]
decision_function replication:
[ 0.89900498]
由于B@rmaley.exe的贡献,我找到了手动复制SVM的方法。我不得不更换
dec_func_vec = -1 * (dual_coefs.dot(np.exp(-gamma*(norm2**2))) - intercept)
带有
dec_func_vec = (dual_coefs.dot(np.exp(-gamma*(norm2**2))) + intercept)
因此,完全矢量化的方法是:
# Vectorized method
norm2 = np.array([np.linalg.norm(diff[n, :]) for n in range(np.shape(sup_vecs)[0])])
dec_func_vec = -1 * (dual_coefs.dot(np.exp(-gamma*(norm2**2))) - intercept)