分析svm的cost和gamma的关系,(NAs are not allowed)错误信息
Analyzing the relationship between cost and gamma for the svm, (NAs are not allowed) error message
我一直在尝试使用 ksvm 包 (kernlab) 分析成本参数 c 和 gamma 参数之间的关系。我写的程序如下:
函数(数据)
{
图书馆(核心实验室)
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
}
我得到的错误是:
投票矩阵错误[i, ret < 0] <- 投票矩阵[i, ret < 0] + 1 :
下标作业中不允许使用 NA
我试图检查 Whosebug 的解决方案,但我能找到的最佳答案是 data.frame 需要在缺少值时出现在 cbind 之前。我一直在用 iris 数据集测试这个函数,没有缺失值。我想绘制结果并分析输出矩阵内容的模式;那应该很简单。问题是获取用于绘图的结果 table。
如有任何帮助,我们将不胜感激。
expand grid 生成的 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)
我一直在尝试使用 ksvm 包 (kernlab) 分析成本参数 c 和 gamma 参数之间的关系。我写的程序如下:
函数(数据) { 图书馆(核心实验室)
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
}
我得到的错误是:
投票矩阵错误[i, ret < 0] <- 投票矩阵[i, ret < 0] + 1 : 下标作业中不允许使用 NA
我试图检查 Whosebug 的解决方案,但我能找到的最佳答案是 data.frame 需要在缺少值时出现在 cbind 之前。我一直在用 iris 数据集测试这个函数,没有缺失值。我想绘制结果并分析输出矩阵内容的模式;那应该很简单。问题是获取用于绘图的结果 table。
如有任何帮助,我们将不胜感激。
expand grid 生成的 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)