scikit.svm.SRV.predict(X) 的复制

Posted

技术标签:

【中文标题】scikit.svm.SRV.predict(X) 的复制【英文标题】:Replication of scikit.svm.SRV.predict(X) 【发布时间】:2015-04-20 01:09:56 【问题描述】:

我正在尝试复制 scikit-learn 的 svm.svr.predict(X),但不知道如何正确操作。

我想做的是,因为在使用 RBF 内核训练 SVM 后,我想在另一种编程语言 (Java) 上实现预测,并且我需要能够导出模型的参数才能执行预测未知病例。

在 scikit 的文档页面上,我看到有 'support_ 和 'support_vectors_ 属性,但不明白如何复制 .predict(X) 方法。

我正在寻找 y_pred = f(X,svm.svr.support_, svm.svr.support_vectors_,etc,...) 形式的解决方案。

提前谢谢你!

编辑: 它的 SVM 用于回归,而不是分类!

编辑: 这是我现在正在尝试的代码,来自Calculating decision function of SVM manually,但没有成功...

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]

【问题讨论】:

看看这个答案:***.com/questions/28503932/… 谢谢@AndreasMueller,但那篇文章是关于分类器的,我这里说的是回归,是不是一样的计算? 是的。只是损失不同。 嗨,再次感谢@AndreasMueller 的帮助。我复制了您告诉我的帖子中的矢量化代码,并且能够复制分类示例,但回归失败。 (两者中的代码相同,但clf = svm.SVR() 而不是svm.SVC())我正在使用您链接的帖子的@user1182556 中的矢量化方法。非常感谢您的帮助,谢谢! 错误/问题是什么? 【参考方案1】:

感谢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)

【讨论】:

以上是关于scikit.svm.SRV.predict(X) 的复制的主要内容,如果未能解决你的问题,请参考以下文章

x=x+=x-=x-x;

为啥 ('x',) 中的 'x' 比 'x' == 'x' 快?

是∃x(P(x))是∃x(x∈S∧P(x))还是∃x(x∈S→P(x))的缩写?

python视频b'\x1aE\xdf\xa3\x01\x00\x00\x00\x00\x00\x00\

二进制数组在 C# 中将映射缩减为矩形

springboot redistemplate值有 x00数据