2016-09-25 110 views
2

我是R新手,试图在R中保存我的svm模型并阅读了文档,但仍然不明白是什么错误。R对象不是矩阵

我得到错误“对象不是矩阵”这似乎意味着我的数据不是矩阵,但它是...所以缺少一些东西。

我的数据被定义为:

data = read.table("data.csv") 
trainSet = as.data.frame(data[,1:(ncol(data)-1)]) 

当最后一行是我的标签

我想确定我的模型为:

​​

这似乎是它应该是正确,但我无法找到其他示例。

这里是到目前为止我的代码:

# load libraries 
require(e1071) 
require(pracma) 
require(kernlab) 
options(warn=-1) 

# load dataset 
SVMtimes = 1 
KERNEL="polynomial" 
DEGREE = 2 
data = read.table("head.csv") 
results10foldAll=c() 

# Cross Fold for training and validation datasets 
for(timesRun in 1:SVMtimes) { 
    cat("Running SVM = ",timesRun," result = ") 

    trainSet = as.data.frame(data[,1:(ncol(data)-1)]) 
    trainClasses = as.factor(data[,ncol(data)]) 
    model = svm(trainSet, trainClasses, type="C-classification", 
       kernel = KERNEL, degree = DEGREE, coef0=1, cost=1, 
       cachesize = 10000, cross = 10) 
    accAll = model$accuracies 
    cat(mean(accAll), "/", sd(accAll),"\n") 

    results10foldAll = rbind(results10foldAll, c(mean(accAll),sd(accAll))) 
} 


# create model 

svm.model <- svm(type ~ ., data = trainSet, type='C-classification', kernel='polynomial',scale=FALSE) 

我的样品中的一个的一个例子是:

10.135338 7.214543 5.758917 6.361316 0.000000 18.455875 14.082668 31 
+0

很难说没有一个可重复的例子。 'svm'函数(来自哪个包?)期望“data”参数是一个矩阵?如果是这样,那就是你的问题。 'read.table'将数据作为data.frame对象导入,这是更高级的构造。试试'data = as.matrix(trainSet)'。 – jdobres

+0

@jdobres这是来自e1071包。我添加了当前的代码。我的数据集非常大,但我给出了一个示例行。我的数据集实际上每个样本都有大约3000个特征,所以我在这里简化了。 – badner

+0

当你使用'model.matrix()'或更像'sparse.model.matrix()'时(因为你的数据量较大),你会得到错误。在svm()之前使用'sparse.model.matrix()'的时候,一个提示是将代码中的数据标准化。 – abhiieor

回答

1

这里,车组是一个数据帧,但在SVM。模型函数它期望数据是一个矩阵(您正在分配trainSet到数据)。因此,设置data = as.matrix(trainSet)。这应该很好。

+0

这是有道理的,但它没有工作任何错误model.frame.default(公式=类型〜。,数据=列表(V1 = C(21.933418,: 对象不是矩阵 – badner

1

确实如@ user5196900指出的那样,您需要一个矩阵来运行svm()。但要注意,矩阵对象意味着所有列都具有相同的数据类型,所有数字或所有分类/因素。如果这对于您的数据as.matrix()可能没有问题。

在实践中,经常有人想要model.matrix()sparse.model.matrix()(来自包Matrix),它为分类变量提供虚拟列,同时为数值变量提供单列。但确实是一个矩阵。