2015-07-11 35 views
3

我想通过使用scikit-learn的交叉验证为自定义内核SVM执行网格搜索。更确切地说以下this example 我想定义就像在scikit-learn中交叉验证自定义内核SVM

def my_kernel(x, y): 
""" 
We create a custom kernel: 
k(x, y) = x * M *y.T   
""" 
return np.dot(np.dot(x, M), y.T) 

其中M为内核的参数(如高斯内核伽马)内核功能。

我想通过GridSearchCV养活这个参数M,以类似

parameters = {'kernel':('my_kernel'), 'C':[1, 10], 'M':[M1,M2]} 
svr = svm.SVC() 
clf = grid_search.GridSearchCV(svr, parameters) 

所以我的问题是:如何定义my_kernel使M个变量将由GridSearchCV给予?

回答

0

您可能需要制作一个包装类。例如:

class MySVC(BaseEstimator,ClassifierMixin): 
    def __init__(self, 
       # all the SVC attributes 
       M): 
     self.M = M 
     # etc... 

    def fit(self, X, y): 
     kernel = lambda x,y : np.dot(np.dot(x,M),y.T) 
     self.svc_ = SVC(kernel=kernel, # the other parameters) 
     return self.svc_.fit(X, y) 
    def predict(self, X): 
     return self.svc_.predict(X) 
    # et cetera