我一直在使用kernlab
软件包,并且在预先计算的内核中使用ksvm
/ predict
函数时遇到了问题。
我收到的错误信息是:
> ksvm.mod <- ksvm(trainingset.outer, traininglabels.outer, kernel = "matrix",type="C-svc", C = 60, prob.model = TRUE)
> temp <- predict(ksvm.mod, test.kernel.outer)
Error in .local(object, ...) : test vector does not match model !
我查看了错误位置的源代码,发现它是由于列的差异而导致的
newnrows <- nrow(newdata)
newncols <- ncol(newdata)
if(!is(newdata,"kernelMatrix") && !is.null(xmatrix(object))){
if(is(xmatrix(object),"list") && is(xmatrix(object)[[1]],"matrix")) oldco <- ncol(xmatrix(object)[[1]])
if(is(xmatrix(object),"matrix")) oldco <- ncol(xmatrix(object))
if (oldco != newncols) stop ("test vector does not match model !")
}
但是,我使用的对象具有相同的列
> ncol(trainingset.outer)
[1] 1498
> ncol(test.kernel.outer)
[1] 1498
然后,我查看了根据模型存储的列,并找到了以下内容:
> ncol(xmatrix(ksvm.mod)[[1]])
Error in xmatrix(ksvm.mod)[[1]] : subscript out of bounds
> xmatrix(ksvm.mod)[[1]]
Error in xmatrix(ksvm.mod)[[1]] : subscript out of bounds
> xmatrix(ksvm.mod)
<0 x 0 matrix>
> ?xmatrix
> ksvm.mod
Support Vector Machine object of class "ksvm"
SV type: C-svc (classification)
parameter : cost C = 60
[1] " Kernel matrix used as input."
Number of Support Vectors : 831
Objective Function Value : -211534.1
Training error : 0.257677
Probability model included.
> ncol(xmatrix(gene)[[1]]) # for dataframes used without precomputed kernels
[1] 172
我猜模型没有存储任何物体,我理解正确吗?由于Web中没有使用预先计算内核的包的好例子,我正在写信给你。
PS:如果需要,我会尝试提供测试数据。
答案 0 :(得分:0)
你正在做正确的一半。预测对象只需要newdata和支持向量之间的内核距离,但它本身并不提取它们,你必须自己传递它们。
试试这个:
ksvm.mod <- ksvm(trainingset.outer, traininglabels.outer, kernel = "matrix",type="C-svc", C = 60, prob.model = TRUE)
temp <- predict(ksvm.mod, test.kernel.outer[, SVindex(ksvm.mod))
我在这里假设test.kernel.outer
是kernelMatrix
,用于衡量测试数据(行)和列车数据(列)之间的内核距离。