我想调整,但在初始化svm时定义的gamma没有传递到我的函数。
我需要在sklearn
中实现自定义内核。
这将是一个自定义线性内核:
def my_kernel(x, y):
return np.dot(x, y.T)
但我有麻烦做一些像RBF内核。有可能在sklearn自定义内核中做到这一点吗?
我已经试过了:
def my_kernel(x, y):
gamma = 0.01
return np.exp((gamma* np.power(np.linalg.norm(x-y),2)))`
但不工作。
(我知道有一个预实现的RBF,但我需要手动实现它,因为我需要添加一些参数)
你的函数看起来不错。只需使用
clf = svm.SVC(kernel=my_kernel)
clf.fit(X, Y)
有一个与您的应用程序相关的示例
我已经实现了这样的东西
import numpy as np
from sklearn.metrics.pairwise import euclidean_distances
def gaussian_kernel(X, Y):
kernel = euclidean_distances(X, Y) ** 2
kernel = kernel*(-1/(self.gamma**2))
kernel = np.exp(kernel)
return kernel
然后用我定义的核调用SVM
from sklearn import svm
clf = svm.SVC(kernel=gaussian_kernel, max_iter = 10000)
clf.fit(X_train, y_train)
这似乎工作良好。我唯一没有做到的是将一个超参数从svm传递到我的内核实现,所以我开始全局定义超参数,而不是作为一种解决方案。
如你所见,我已经定义了一个self。