scikit-learn中的SVM自定义核函数

3
我需要在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,但我需要手动实现它,因为我需要添加一些参数)


你漏掉了 gamma 前面的减号。请查看正态分布方程。 - lejlot
尝试过了,问题依旧。 - Igor Cruz
2
此外,核函数应该使用矩阵X和矩阵Y,并返回核值的矩阵(Gram矩阵),而不仅仅是一个元素。 - lejlot
但是没有起作用。为了更好地帮助,我们需要知道什么没有起作用——它没有执行,没有产生预期的行为,预期的行为是什么。正如@lennon310所提到的——文档中有一个很好的例子。你试过了吗?什么没有起作用? - danodonovan
2个回答

3
您的函数看起来不错。只需使用

即可。
clf = svm.SVC(kernel=my_kernel)
clf.fit(X, Y)

这里有一个与您的应用相关的示例


2
我已经实现了类似这样的东西。
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.gamma,我想要调整它,但是在初始化svm时定义的gamma没有传递到我的函数中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接