R对象不是矩阵

Posted

技术标签:

【中文标题】R对象不是矩阵【英文标题】:R object is not a matrix 【发布时间】:2017-02-03 00:23:29 【问题描述】:

我是 R 新手,正在尝试将我的 svm 模型保存在 R 中并阅读了文档,但仍然不明白出了什么问题。

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

我的数据定义为:

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

最后一行是我的标签

我正在尝试将我的模型定义为:

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

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

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

# 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

【问题讨论】:

很难说没有可重现的例子。 svm 函数(来自哪个包?)是否期望“数据”参数是一个矩阵?如果是这样,那是你的问题。 read.table 将数据导入为 data.frame 对象,这是更高级别的构造。试试data = as.matrix(trainSet) @jdobres 这是来自 e1071 包。我添加了我当前的代码。我的数据集非常大,但我给出了一个示例行。我的数据集实际上每个样本都有大约 3,000 个特征,所以我在这里进行了简化。 您在使用model.matrix() 或更多类似sparse.model.matrix() 时遇到错误(因为您的数据量较大)。在svm() 之前使用sparse.model.matrix() 时的一个提示确实标准化代码中的数据。 【参考方案1】:

这里,trainSet 是一个数据框,但在 svm.model 函数中,它期望 data 是一个矩阵(您在其中分配trainSet 到数据)。因此,设置 data = as.matrix(trainSet)。这应该可以正常工作。

【讨论】:

这是有道理的,但它也不起作用 model.frame.default 中的错误(formula = type ~ ., data = list(V1 = c(21.933418, : object is not a matrix跨度> 【参考方案2】:

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

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

【讨论】:

以上是关于R对象不是矩阵的主要内容,如果未能解决你的问题,请参考以下文章

R中是不是有像bigmemory这样的包可以处理大型列表对象?

R语言基础之第一部分 5种数据对象类型

测试 TCL 中是不是存在矩阵对象

在 R Shiny 中,当链中的对象被隐藏时,如何维护反应链?

将列表附加到 R 中的列表列表

即使更改模型视图矩阵,使用顶点缓冲区对象是不是有意义?