在 Sci-kit Learn 中将参数解析为 SVM 的自定义核函数

Posted

技术标签:

【中文标题】在 Sci-kit Learn 中将参数解析为 SVM 的自定义核函数【英文标题】:Parse parameter to custom kernel function of SVM in Sci-kit Learn 【发布时间】:2015-03-28 05:09:13 【问题描述】:

我按照教程 SVM with custom kernel 并尝试在 SVM 中使用自定义内核。比如我实现多项式核函数如下:

   def poly_kernel(x, y):
       degree = 3
       return np.dot(x, y.T) ** 3

然后结果似乎与度数为 3 的原始“多边形”非常相似。但是它带来了一个问题,我不知道如何将 度数 解析为内核函数的参数.

例如,我构建Support Vector Regression如下:

    # X is some data
    # y is some target
    svr = SVR(kernel=poly_kernel, C=1e3, degree=4)
    y = svr.fit(X, y).predict(X)

它似乎没有正确地将参数解析到内核。我还尝试了内核函数中的命名参数

    def poly_kernel(x, y, **kwargs):
        degree = 3
        try:
            degree = kwargs.get('degree')
        except:
            pass
        return np.dot(x, y.T) ** 3

但它不起作用。

那么在这种情况下有什么办法可以正确解析参数吗?

提前致谢。

【问题讨论】:

【参考方案1】:

在这种情况下可以动态构造核函数。我们可以使用 lambda 获取匿名函数作为变量。

例如:

    def linear_kernel(c = 0):
        return lambda x, y: np.dot(x, y.T) + c

当我们想使用它时,我们就这样做:

    lkf = linear_kernel(c=20)
    svr_linear = SVR(kernel=lkf)
    y_linear = svr_linear.fit(X, y).predict(X)

当我调用 SVR() 时,我只是忽略了参数。

但是我不确定这是否是一种肮脏的方式,但至少它有效。

【讨论】:

以上是关于在 Sci-kit Learn 中将参数解析为 SVM 的自定义核函数的主要内容,如果未能解决你的问题,请参考以下文章

如何用sci-kit learn识别误分类文本文件的ID/名称/标题

如何在 scikit learn 中将特定课程与我的词袋配对

如何在 Sci-Kit Learn / Tensorflow 中检测对象大小?

使用 Sci-kit Learn SVM 时预测始终相同

Sci-kit Learn Confusion Matrix:发现样本数量不一致的输入变量

如何将个人 PNG 数据集放入 Sci-Kit Learn 进行图像识别?