我应该如何修改SVM方法的测试数据,以便能够使用“预计算”的核函数而不会出错?

2024-04-25 15:08:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我将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})没有得到回答。你知道吗

实际上,我使用了支持向量机的方法rbfsigmoid。。。以前,代码运行得很好,但这是我第一次使用自定义内核,我怀疑这一定是发生此错误的原因。你知道吗

因此,经过一点研究和阅读文档后,我发现当使用precomputed内核时,SVR.predict()的矩阵的形状必须类似于[n_samples_test, n_samples_train]的形状。你知道吗

我想知道如何修改x_test以获得预测,并且一切都正常工作,没有任何问题,比如当我们不使用定制内核时?你知道吗

如果可能,请描述“为什么precomputed内核中svm.predict函数的输入与其他内核不同的原因”。你知道吗

我真的希望与这个问题有关的未回答的问题能够分别得到回答。你知道吗


Tags: 方法importdatasizenprandomdensity内核
2条回答

问题出在你的内核函数里,它不起作用。你知道吗

正如文档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中考虑矩阵或数组。如果你做任何算术运算,你总是需要一个类似的形状。所以我们才查数组.shape. [n\u samples\u test,n\u samples\u train]您可以修改形状,但这不是最好的主意。你知道吗

数组.shape,重塑,调整大小 是用来做这个的

相关问题 更多 >