【问题标题】:Unusual "(list) object cannot be coerced to type 'double'" error when conductin KNN alogrithm执行 KNN 算法时出现异常的“(列表)对象无法强制键入 'double'”错误
【发布时间】:2019-06-22 12:21:42
【问题描述】:

我正在对 R 进行 KNN 算法。我有三个数据集。我一直在处理我的代码,这就是我所拥有的:

library(stats)
library(class)

#load up train and testing files
train1<-read.table("train1.txt",header=FALSE) 
test1<-read.table("test1.txt",header=FALSE)

#convert inputs into matrix
train = matrix(train1, byrow = T, ncol=3)
test = matrix(test1, byrow = T, ncol=3)

#load the classes in the training data
cl1a<-read.table("classes1.txt",header = FALSE)
clas=matrix(cl1a,byrow=T,ncol=1)

#set k 
kk = 2

#run knn
kn1 = knn(train, test, clas, k=kk, prob=TRUE)

运行最后一行后,我收到错误消息:

knn(train, test, clas, k = kk, prob = TRUE) 中的错误: (list) 对象不能被强制输入'double'

我在其他地方读到,可以通过将表格转换为矩阵来解决此问题,但如您所见,我已在代码中修复了该问题。

感谢任何帮助!

【问题讨论】:

  • 也许可以尝试使用数据框而不是矩阵。实在看不出有什么问题。 traceback() 呼叫点在哪里?
  • 还有,为什么不用as.matrix
  • 使用回溯时我得到:&gt; traceback() 1: knn(train, test, clas, k = kk, prob = TRUE)
  • 谢谢!我使用 as.matrix 并且它有效。我知道,as.matrix 和 matrix 有什么区别?我把一个换成另一个,它起作用了。这是我的新代码:[... ]#convert inputs into matrix train = as.matrix(train1, byrow = T, ncol=3) test = as.matrix(test1, byrow = T, ncol=3) #load the classes in the training data cl1a&lt;-read.table("classes1.txt",header = FALSE) clas=as.matrix(cl1a,byrow=T,ncol=1) #set k kk = 1 #run knn kn1 = knn(train, test, clas, k=kk, prob=TRUE)
  • as.matrix 为您进行必要的转换,而不会删除任何值。这只是一个答案,您可以通过?matrix?as.matrix 了解更多信息。

标签: r


【解决方案1】:

您需要使用我在上面的 cmets 中建议的 as.matrix。原因如下:

str(matrix(iris,byrow=T,ncol=5))

如您所见,这会生成一个列表。

List of 5
 $ : num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ : num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, "dim")= int [1:2] 1 5

as.matrix 另一方面会产生一个矩阵。 现在为什么还是会出现错误??knn 我们可以看到它接受矩阵或数据帧:

火车
训练集案例的矩阵或数据框。 测试
测试集用例的矩阵或数据框。 向量将被解释为单个案例的行向量

这解释了为什么我们会出现错误:

knn(train, test, clas, k = kk, prob = TRUE) 中的错误:(列表)对象不能被强制输入'double'

安全的做法是使用as.data.frameas.matrix

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2016-05-22
    • 2016-09-30
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多