2017-09-25 50 views
0

我一直試圖使用ksvm包(kernlab)分析成本參數c和gamma參數之間的關係。我已寫入的程序如下:分析svm的成本和gamma之間的關係(不允許使用NAs)錯誤消息

功能(數據) { 庫(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 < 0] < - votematrix [i,ret < 0] + 1: NAs不允許用於下標分配

我試圖檢查一個解決方案的計算器,但我能找到的最佳答案是data.frame需要在cbind之前缺少值。我一直在用虹膜數據集測試這個函數,並且沒有缺失值。我想繪製結果並分析輸出矩陣內容的模式;這應該很簡單。問題是獲得結果表用於繪圖。

任何幫助將不勝感激。

回答

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) 
相關問題