简体   繁体   中英

sklearn SVM custom kernel

I need to implement a custom kernel in sklearn .

This would be a custom linear kernel:

def my_kernel(x, y):
    return np.dot(x, y.T)

But I am having trouble doing something like RBF kernel. Is it possible to do that in sklearn a custom kernel?

I have tried this:

def my_kernel(x, y):
    gamma = 0.01
    return np.exp((gamma* np.power(np.linalg.norm(x-y),2)))`

But did not work.

(I know that there is a pre-implementation of RBF, but I need to manually implement it, because I need to add some parameters)

Your function looks good. Just use

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

There is an example related to your application.

I have implemented somthing like this

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

and then have called svm with my defined kernel

from sklearn import svm
clf = svm.SVC(kernel=gaussian_kernel, max_iter = 10000)
clf.fit(X_train, y_train)

this seemed to work fine. The only this that I failed to do was pass a hyperparameter from svm to my implementation of kernel, so I started defining the hyper-parameter globally instead as a work around.

As you would see I have defined a self.gamma which I wanted to tune but the gamma defining while initializing svm was not passing to my function.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM