我应该如何修改 SVM 方法的测试数据,以便能够毫无错误地使用"预先计算"的内核函数?



我正在使用sklearn.svm.SVR进行"回归任务",我想使用我的"自定义内核方法"。下面是数据集示例和代码:

index   density     speed        label
0         14      58.844020    77.179139
1         29      67.624946    78.367394
2         44      77.679100    79.143744
3         59      79.361877    70.048869
4         74      72.529289    74.499239
.... and so on
from sklearn import svm
import pandas as pd
import numpy as np
density = np.random.randint(0,100, size=(3000, 1))
speed   = np.random.randint(20,80, size=(3000, 1)) + np.random.random(size=(3000, 1))
label   = np.random.randint(20,80, size=(3000, 1)) + np.random.random(size=(3000, 1))
d    = np.hstack((a,b,c))
data = pd.DataFrame(d, columns=['density', 'speed', 'label'])
data.density = data.density.astype(dtype=np.int32)
def my_kernel(X,Y):
return np.dot(X,X.T)
svr = svm.SVR(kernel=my_kernel)
x = data[['density', 'speed']].iloc[:2000]
y = data['label'].iloc[:2000]
x_t = data[['density', 'speed']].iloc[2000:3000]
y_t = data['label'].iloc[2000:3000]
svr.fit(x,y)
y_preds = svr.predict(x_t)

问题发生在最后一行svm.predict,上面写着:

X.shape[1] = 1000 should be equal to 2000, the number of samples at training time

我在网上搜索以找到解决问题的方法,但许多问题(如{1},{2}{3})都没有答案。

实际上,我已经将SVM方法与rbfsigmoid,...之前代码工作正常,但这是我第一次使用自定义内核,我怀疑这一定是发生此错误的原因。

因此,经过一些研究和阅读文档,我发现在使用precomputed内核时,SVR.predict()矩阵的形状必须与[n_samples_test, n_samples_train]形状相似。

我想知道如何修改x_test以获得预测,并且一切正常,没有问题,就像我们不使用自定义内核一样?

如果可能,请描述"为什么svm.predict内核中的输入与其他内核不同precomputed"。

我真的希望与这个问题有关的未回答的问题可以分别得到回答。

问题出在您的内核函数中,它无法完成这项工作。

正如文档 https://scikit-learn.org/stable/modules/svm.html#using-python-functions-as-kernels 所说,"你的内核必须将形状(n_samples_1, n_features)的两个矩阵作为参数,(n_samples_2, n_features)并返回形状(n_samples_1, n_samples_2)的核矩阵。同一页面上的示例内核满足以下条件:

def my_kernel(X, Y):
return np.dot(X, Y.T)

在您的函数中,dot的第二个参数是X.T的,因此输出将具有形状(n_samples_1, n_samples_1)这不是预期的。

形状不匹配意味着测试数据和训练数据的形状不相等,请始终考虑 numpy 中的矩阵或数组。如果你在做任何算术运算,你总是需要一个类似的形状。这就是我们检查array.shape的原因。 [n_samples_test,n_samples_train]您可以修改形状,但这不是最好的主意。

array.shape,reshape,resize用于

相关内容

最新更新