【发布时间】:2015-10-14 11:34:50
【问题描述】:
我在scikit-learn中自己定义内核时遇到问题。 我自己定义了高斯核,能够拟合 SVM,但不能用它来进行预测。
更准确地说,我有以下代码
from sklearn.datasets import load_digits
from sklearn.svm import SVC
from sklearn.utils import shuffle
import scipy.sparse as sparse
import numpy as np
digits = load_digits(2)
X, y = shuffle(digits.data, digits.target)
gamma = 1.0
X_train, X_test = X[:100, :], X[100:, :]
y_train, y_test = y[:100], y[100:]
m1 = SVC(kernel='rbf',gamma=1)
m1.fit(X_train, y_train)
m1.predict(X_test)
def my_kernel(x,y):
d = x - y
c = np.dot(d,d.T)
return np.exp(-gamma*c)
m2 = SVC(kernel=my_kernel)
m2.fit(X_train, y_train)
m2.predict(X_test)
m1 和 m2 应该是一样的,但是 m2.predict(X_test) 返回错误:
操作数不能与形状一起广播 (260,64) (100,64)
我不明白这个问题。
此外,如果 x 是一个数据点,则 m1.predict(x) 给出 +1/-1 结果,正如预期的那样,但 m2.predict(x) 给出 +1/-1 数组... 不知道为什么。
【问题讨论】:
-
你的内核函数错误。
-
更精确吗?我要使用的核函数是K(x,y) = exp(- gamma * || x-y||^2),有什么问题?
-
我的意思是您对
my_kernel的实现是错误的,如答案所示。
标签: python-2.7 machine-learning scikit-learn svm libsvm