sklearn SVM 自定义内核

Posted

技术标签:

【中文标题】sklearn SVM 自定义内核【英文标题】:sklearn SVM custom kernel 【发布时间】:2014-05-08 02:01:28 【问题描述】:

我需要在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 之前缺少减号。查看正态分布方程。 试过了,同样的问题 另外,内核函数应该使用 MATRIX X 和 MATRIX Y 并返回内核值的 MATRIX(gram 矩阵),而不仅仅是一个元素。 “但是没有用。”为了获得更多帮助,我们必须知道 what 没有工作 - 它没有执行,没有产生预期的行为,预期的行为是什么。正如@lennon310 提到的——文档中有一个很好的例子。你试过吗?什么不起作用? 【参考方案1】:

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

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

有an example与您的应用程序相关。

【讨论】:

【参考方案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 没有传递给我的函数。

【讨论】:

以上是关于sklearn SVM 自定义内核的主要内容,如果未能解决你的问题,请参考以下文章

sklearn SVM自定义内核引发ValueError:X.shape [0]应该等于X.shape [1]

如何使用自定义 SVM 内核?

SVM 的自定义内核,何时应用它们?

在 R 中为 svm 编写自定义内核

R:使用自定义内核(用户定义内核)的 SVM 性能在 kernlab 中不起作用

SVM 自定义 RBF 内核 IndexError