sklearn SVM自定义核函数

3 投票
2 回答
4204 浏览
提问于 2025-04-18 00:20

我需要在 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 核已经有现成的实现,但我需要手动实现,因为我需要添加一些参数)

2 个回答

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并没有传递到我的函数里。

3

你的函数看起来不错。只需要使用

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

这里有一个和你应用相关的例子

撰写回答