Sklearn SVM 自定义 rbf 核函数
Sklearn SVM custom rbf kernel function
我正在为 sklearn 的 SVC class 创建自定义 rbf 函数,如下所示:
def rbf_kernel(x, y, gamma):
dis = np.sqrt(((x.reshape(-1, 1)) - y.reshape(1, -1)) ** 2)
return np.exp(-(gamma*dis)**2)
def eval_kernel(kernel):
model = SVC(kernel=kernel, C=C, gamma=gamma, degree=degree, coef0=coef0)
model.fit(X_train, y_train)
X_test_predict = model.predict(X_test)
acc = (X_test_predict == y_test).sum() / y_test.shape[0]
return acc
for k1, k2 in [('rbf', lambda x, y: rbf_kernel(x, y, gamma))]:
acc1 = eval_kernel(k1)
acc2 = eval_kernel(k2)
assert(abs(acc1 - acc2) < eps)
X_train的形状是(396, 10),y_train是(396, 10),X_test是(132, 10)。
但是,当我尝试 运行 它时,我收到一条错误消息:
ValueError: X.shape[1] = 3960 should be equal to 396, the number of samples at training time
看来错误是由于X_test和X_train的维度不同造成的,但是有什么办法可以解决这个错误吗?
提前致谢!
你的 rbf 内核写错了。您需要 return 一个矩阵,即 (n_samples, n_samples)。在您的代码中,您基本上解开了所有内容,因此出现了错误。您可以参考 actual code for rbf_kernel used by sklearn ,如果我们插入它将起作用:
from sklearn.datasets import make_classification
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
X,y = make_classification(528)
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.25)
def my_kernel(X, Y, gamma=0.1):
K = euclidean_distances(X, Y, squared=True)
K *= -gamma
np.exp(K, K) # exponentiate K in-place
return K
def eval_kernel(kernel):
model = SVC(kernel=kernel,gamma=0.1)
model.fit(X_train, y_train)
X_test_predict = model.predict(X_test)
acc = (X_test_predict == y_test).sum() / y_test.shape[0]
return acc
eval_kernel('rbf')
0.8409090909090909
eval_kernel(my_kernel)
0.8409090909090909
我正在为 sklearn 的 SVC class 创建自定义 rbf 函数,如下所示:
def rbf_kernel(x, y, gamma):
dis = np.sqrt(((x.reshape(-1, 1)) - y.reshape(1, -1)) ** 2)
return np.exp(-(gamma*dis)**2)
def eval_kernel(kernel):
model = SVC(kernel=kernel, C=C, gamma=gamma, degree=degree, coef0=coef0)
model.fit(X_train, y_train)
X_test_predict = model.predict(X_test)
acc = (X_test_predict == y_test).sum() / y_test.shape[0]
return acc
for k1, k2 in [('rbf', lambda x, y: rbf_kernel(x, y, gamma))]:
acc1 = eval_kernel(k1)
acc2 = eval_kernel(k2)
assert(abs(acc1 - acc2) < eps)
X_train的形状是(396, 10),y_train是(396, 10),X_test是(132, 10)。 但是,当我尝试 运行 它时,我收到一条错误消息:
ValueError: X.shape[1] = 3960 should be equal to 396, the number of samples at training time
看来错误是由于X_test和X_train的维度不同造成的,但是有什么办法可以解决这个错误吗?
提前致谢!
你的 rbf 内核写错了。您需要 return 一个矩阵,即 (n_samples, n_samples)。在您的代码中,您基本上解开了所有内容,因此出现了错误。您可以参考 actual code for rbf_kernel used by sklearn ,如果我们插入它将起作用:
from sklearn.datasets import make_classification
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
X,y = make_classification(528)
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.25)
def my_kernel(X, Y, gamma=0.1):
K = euclidean_distances(X, Y, squared=True)
K *= -gamma
np.exp(K, K) # exponentiate K in-place
return K
def eval_kernel(kernel):
model = SVC(kernel=kernel,gamma=0.1)
model.fit(X_train, y_train)
X_test_predict = model.predict(X_test)
acc = (X_test_predict == y_test).sum() / y_test.shape[0]
return acc
eval_kernel('rbf')
0.8409090909090909
eval_kernel(my_kernel)
0.8409090909090909