2017-04-05 138 views
0

我正在尝试实现自定义rbf内核函数。但是,我收到以下错误。我不确定为什么需要一定数量的数据点?发生在这行代码 错误:输入维度错误

rbf_y = rbf_kernel.predict(X_test) 

代码

def myKernel(x,y): 
    pairwise_dists = squareform(pdist(x, 'euclidean')) 
    K = scip.exp(-pairwise_dists ** 2/.08 ** 2) 
    return K 

rbf_kernel = svm.SVC(kernel=myKernel, C=1).fit(X_train, Y_train.ravel()) 
rbf_y = rbf_kernel.predict(X_test) 
rbf_accuracy = accuracy_score(Y_test, rbf_y) 

错误:

ValueError: X.shape[1] = 15510 should be equal to 31488, the number of samples at training time 

数据式样

X_train shape: (31488, 128) 
X_test shape: (15510, 128) 
Y_train shape: (31488, 1) 
Y_test shape: (15510, 1) 

返回从内核

形状
myKernel(X_train, X_train).shape = (31488, 31488) 
+0

你可以请发布完整的堆栈跟踪。 –

回答

0

定制内核kernel(X, Y)应计算的相似性度量矩阵X和基质Y之间,并且输出应该是形状[X.shape[0], Y.shape[0]]的。你的内核函数忽略Y,并返回一个形状为[X.shape[0], X.shape[0]]的矩阵,这会导致你所看到的错误。

要解决此问题,请实施计算正确形状的内核矩阵的内核函数。 Scikit-learn的custom kernels documentation有一些简单的例子说明这可能如何工作。

对于您的特定内核,您可以尝试使用cdist(x, y)来代替squareform(pdist(x))