我用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]
当我绘制它时,我得到以下情节
它看起来大多是正确,但一切都没有完美排列。为什么不?我的实施有什么问题? (另外:为什么有一些平坦的区域是随机的?sklearn是否随机变为0.5?)我尝试了(A,B,C)的可能值的梯度下降,发现最好的发生在(A = 1.13; B = 0.31; C = .88;)但这并不是那么有启发性。
我试过浏览sklearn源代码,但是直接调用了libsvm二进制文件,所以我不知道那里发生了什么。