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

时间:2015-01-29 04:08:56

标签: python numpy scipy scikit-learn svm

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

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

然后结果看起来非常类似于原来的' poly'但是它有一个问题,我不知道如何将解析为内核函数的参数。

例如,我按如下方式构建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 个答案:

答案 0 :(得分:0)

在这种情况下,可以动态构造内核函数。我们可以使用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()时忽略参数。

但是我不确定它是否是一种肮脏的方式,但至少可以起作用。