我按照教程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
但它不起作用。
在这种情况下,有没有办法正确解析参数?
提前致谢。
答案 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()时忽略参数。
但是我不确定它是否是一种肮脏的方式,但至少可以起作用。