从sklearn训练中预测python中的RBF-SVM

时间:2017-04-17 05:34:14

标签: python machine-learning scikit-learn svm libsvm

我用sklearn的SVC.fit()训练了一个分类器,现在我已经训练好了模型。我可以使用predict()方法来预测类,但我想在python中实现它。 (我正在研究一些我需要能够计算SVM渐变的东西。第一步是运行python实现。)

例如,使用以下代码我可以训练SVM模型:

import sklearn.svm
import numpy as np

svm = sklearn.svm.SVC(probability=True, gamma=1)
f = svm.fit([[-3, -2], [0, 1], [.5,.5], [2, 1]], [0, 1, 0, 1])

然后沿着一条线计算一堆预测:

ar = np.arange(-5,6,.01)
r = [f.predict_proba([[i, i]])[0,0] for i in ar]

现在我尝试在python中实现RBF-SVM方法并以这种方式计算预测:

A = 1; B = 0; C = 1;
def pred(vectors, coefs, x):
    dists = np.sum((vectors-x)**2,axis=1)
    probs = (np.exp(-dists*A+B))+C
    probs *= np.reshape(coefs,[-1])
    probs /= np.sum(np.abs(probs))
    return np.sum(probs)+.5

s = [pred(svm.support_vectors_, svm.dual_coef_, [i, i]) for i in ar]

当我绘制它时,我得到以下情节

plot of sklearn svm.predict vs python predict

它看起来大多是正确,但一切都没有完美排列。为什么不?我的实施有什么问题? (另外:为什么有一些平坦的区域是随机的?sklearn是否随机变为0.5?)我尝试了(A,B,C)的可能值的梯度下降,发现最好的发生在(A = 1.13; B = 0.31; C = .88;)但这并不是那么有启发性。

我试过浏览sklearn源代码,但是直接调用了libsvm二进制文件,所以我不知道那里发生了什么。

0 个答案:

没有答案
相关问题