0

我需要一些帮助来管理 R 中的多个 SVM 模型。我有大约 100 个数据文件,我想读取每个文件,然后使用 e1071 包为该文件训练一个模型。所有文件的名称都包含在一个文件中,因此更容易跟踪每个文件。我使用了以下代码,但无法找到解决方案。

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 函数时,我对数据函数调用和数据参数到底需要做什么感到困惑。

问候

4

1 回答 1

0

正如斯科特所提到的,您的示例不可重现(并且问题并没有说明您的问题是什么)。我重写了您的代码,以减少混乱。它未经测试,因此您可能需要对其进行调整。

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.

如果您在列表(或向量)上循环,请使用lapply(或llplyfrom plyr),而不是使用for循环,因为这涉及额外的样板代码和创建虚拟变量。注意你是如何不需要vectoryvectorz不再需要的。

将读取数据的代码与运行模型的代码分开。它们是不同的任务,把代码混在一起会混淆你的思维。(此外,当一个模型失败时,您不希望再次读取数据。)

于 2013-01-25T08:47:24.933 回答