kernlab
R包进行支持向量机(SVM)操作。在我的简单示例中,我有两个训练数据A和B。(A和B是类型为
matrix
的邻接矩阵图表)因此,我编写了一个函数,它将A+B作为输入并生成一个核矩阵。
> km
[,1] [,2]
[1,] 14.33333 18.47368
[2,] 18.47368 38.96053
现在我使用
kernlab
的ksvm
函数来生成我的预测模型。现在,我只是试图让这个东西正常工作 - 我不担心训练误差等问题。因此,问题1:我是否正确生成了我的模型?合理吗?
# y are my classes. In this case, A is in class "1" and B is in class "-1"
> y
[1] 1 -1
> model2 = ksvm(km, y, type="C-svc", kernel = "matrix");
> model2
Support Vector Machine object of class "ksvm"
SV type: C-svc (classification)
parameter : cost C = 1
[1] " Kernel matrix used as input."
Number of Support Vectors : 2
Objective Function Value : -0.1224
Training error : 0
到目前为止,一切都很顺利。我们创建了自定义的核矩阵,然后使用该矩阵创建了一个ksvm模型。我们的训练数据标记为“1”和“-1”。
现在来进行预测:
> A
[,1] [,2] [,3]
[1,] 0 1 1
[2,] 1 0 1
[3,] 0 0 0
> predict(model2, A)
Error in as.matrix(Z) : object 'Z' not found
哎呀,没事。这有点意料之中。"预测"需要某种类型的向量,而不是矩阵。
那么让我们尝试一些东西:
> predict(model2, c(1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, c(1,1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, c(1,1,1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, c(1,1,1,1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, km)
Error in as.matrix(Z) : object 'Z' not found
一些上述测试是毫无意义的,但这正是我的观点:无论我做什么,我都不能让predict()查看我的数据并进行预测。标量不起作用,向量也不起作用。2x2矩阵不起作用,3x3矩阵也不起作用。
我在这里做错了什么?
(一旦我弄清楚ksvm想要什么,那么我就可以确保我的测试数据以一个合理/可行/数学上正确的方式符合该格式。)
kernlab
有非常特定的方法... 但是我不清楚是否应该包括响应变量 y 来计算核矩阵?是否有任何方法可以在有新数据时“更新”核矩阵而无需重新计算它?再次感谢。 - nopevay
;(2)这是可能的,但你可能需要自己编写代码来解决问题。核矩阵为每对示例(行、列)提供了核值。你需要创建一个“更新”的核矩阵来尊重这一点。 - Steve Lianoglou