sklearn SVM自定义内核

时间:2014-03-28 14:31:27

标签: kernel scikit-learn svm svc

我需要在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 个答案:

答案 0 :(得分:2)

你的功能很好看。只需使用

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

an example与您的申请相关。

答案 1 :(得分:0)

我已经实现了这样的事情

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不会传递给我的函数。