2013-01-25 38 views
0

我需要一些幫助來管理R中的幾個SVM模型。我有大約100個數據文件,我想讀取每個文件,然後使用e1071軟件包爲該文件訓練一個模型。所有文件的名稱都包含在一個文件中,因此更容易跟蹤每個文件。我使用了下面的代碼,但無法達到解決方案。R中的多個SVM模型

x<-read.table("data.dat", header=F) 
x=as.vector(t(x)) 
vectory <- vector(mode="list", length=length(x)) 
vectorz <- vector(mode="list", length=length(x)) 

for (i in 1:length(x)) 
{ 
x[i] <- substr(x[i], 3, 100) 
#assign(gsub("-", "_", x[i]), read.table(x[i], header=T, #sep=",")) 
val <- gsub("-", "_", x[i]) 
vectory[[val]] <- read.table(x[i], header=T, sep=",") 
data(vectory[[val]]) 
valmodel <- x[i] 
paste(valmodel, "_model", sep="") 
vectorz[[valmodel]] <- ksvm(label ~ ., data=vectory[[val]]) 
} 

我很困惑,在調用ksvm函數時,我需要爲數據函數調用和數據參數做些什麼。

問候

+0

如果您可以用R隨附的虛擬數據集替換您的真實數據集,那麼我們可以更好地複製該問題。 – sckott

+0

'e1071'沒有叫做'ksvm'的功能。你的意思是'svm'或者它是你自己的功能之一嗎? –

回答

0

正如Scott所說,你的例子是不可重現(和quetsion不會使你的問題是,它不清楚是什麼)。我重寫了你的代碼,以免混淆。它沒有經過測試,所以你可能需要調整它。

file_names <- read.table("data.dat")[[1]] 
file_names <- substring(file_names, 3) 
file_names <- gsub("-", "_", file_names) 
training_data <- lapply(
    file_names, 
    read.table, 
    header = TRUE, 
    sep = ", " 
) 
svm_models <- lapply(
    training_data, 
    function(data) 
    { 
    ksvm(label ~ ., data = data) 
    } 
) 

一般原則:

名稱的變量有意義。調用文件名稱file_names,而不是x

如果您遍歷清單(或載體),使用(從plyrllplylapply,而不是使用for循環,因爲這涉及到額外的樣板代碼和創建虛擬變量。注意你不再需要vectoryvectorz

將用於讀取數據的代碼與用於運行模型的代碼分開。他們是不同的任務,混淆代碼會混淆你的想法。 (另外,當一個模型失敗時,您不希望再次讀取您的數據。)