分析svm的成本和gamma之间的关系(不允许NA)错误消息

时间:2017-09-25 08:20:54

标签: r for-loop dataframe svm cbind

我一直在尝试使用ksvm软件包(kernlab)分析成本参数c和gamma参数之间的关系。我写的程序如下:

功能(数据) {     库(kernlab)

p<-ncol(data)
y<-data[,p]
x<-data[,-p]

Rad.gamma<-matrix(seq(exp(-10),exp(1),length=20))
Con.c<-matrix(c(0.1,0.5,1.5),nrow=1)
mat<-expand.grid(Rad.gamma,Con.c)
Output<-data.frame(0,nrow=80,ncol=2)

for(i in 1:80)
{
    Gamma<-mat[i,1]
    CC<-mat[i,2]
    Svm<-ksvm(y~.,data=as.data.frame(x),
              kernel="rbfdot",kpar=list(sigma=Gamma),
              cross=5, C=CC, type='C-svc',prod.model=FALSE)

    Output[i,1]<-error(Svm)
    Output[i,2]<-cross(svm)
    Output[i,3]<-nSV(svm)/nrow(data)
}
Output<-data.frame(Output)

results<-cbind(mat,Output)
colnames(results)<-c("C","Train","Cross","SVs")

results

}

我获得的错误是:

votematrix [i,ret&lt; 0]&lt; - votematrix [i,ret&lt; 0] + 1:   订阅作业中不允许使用NA

我试图检查stackoverflow的解决方案,但我能找到的最佳答案是,当缺少值时,data.frame需要在cbind之前。我一直在用虹膜数据集测试这个函数,并且没有缺失值。我想绘制结果并分析输出矩阵内容的模式;这应该很简单。问题是将结果表用于绘图。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

展开网格生成的mat有60行,您尝试查找最多80行的索引。这应该有效:

data(iris)
library(kernlab)
p<-ncol(iris)
y<-iris[,p]
x<-iris[,-p]

Rad.gamma<-matrix(seq(exp(-10),exp(1),length=20))
Con.c<-matrix(c(0.1,0.5,1.5),nrow=1)
mat<-expand.grid(Rad.gamma,Con.c)
Output<-data.frame(0,nrow=60,ncol=2)

for(i in 1:60){
  Gamma<-mat[i,1]
  CC<-mat[i,2]
  Svm<-ksvm(y~.,data=as.data.frame(x),
            kernel="rbfdot",kpar=list(sigma=Gamma),
            cross=5, C=CC, type='C-svc',prod.model=FALSE)

  Output[i,1]<-error(Svm)
  Output[i,2]<-cross(Svm)
  Output[i,3]<-nSV(Svm)/nrow(iris)
}
Output<-data.frame(Output)

results<-cbind(mat,Output)
colnames(results)<-c("C","Train","Cross","SVs")

results

另外,结果有5列,也许是

colnames(results)<-c("gamma", "C","Train", "Cross","SVs")

我建议使用apply而不是for循环。在这种情况下,人们不必担心存储结果的位置:

out = apply(mat, 1, function(p){
  Gamma<-p[1]
  CC<-p[2]
  Svm<-ksvm(y~.,data=as.data.frame(x),
            kernel="rbfdot",kpar=list(sigma=Gamma),
            cross=5, C=CC, type='C-svc',prod.model=FALSE)

  out = data.frame(error(Svm), cross(Svm), nSV(Svm)/nrow(iris))
  colnames(out) = c("train", "Cross","SVs")
  return(out)
})

out = do.call(rbind, out)
out = data.frame(mat, out)