11

在下面的代码中,我尝试将 K 最近邻与单个预测器一起使用。据我所知,示例的数量无需与 中的示例数量相train.X匹配test.X,但R似乎没有正确解析我的输入。

library(ISLR)
library(class)

train=(Weekly$Year<2009)
train.X = Weekly$Lag2[train]
test.X = Weekly$Lag2[!train]
train.Direction = Weekly$Direction[train]
knn.pred = knn(train.X, test.X, train.Direction, k=1)

当上面的代码运行时,它得到了错误

   Error in knn(train.X, test.X, train.Direction, k = 1) :   
      dims of 'test' and 'train' differ                       

如何修复train.Xtest.X正确R解析它们?

4

2 回答 2

18

knn函数将矩阵或数据帧作为训练和测试集的参数。你传入一个向量,它被解释为一个矩阵,但不是你想要的方式。具体来说,您传入的数据被解释为具有表示特征的不同值的单个数据点。这意味着训练和测试的特征数量不同,如错误消息所示。

要修复,只需显式转换,例如

knn.pred = knn(data.frame(train.X), data.frame(test.X), train.Direction, k=1)
于 2013-10-16T08:07:10.530 回答
3

这是因为 R 在设置矩阵、数组或数据框的子集时会自动尝试强制使用最少的维数。为了防止删除数据框的维度,您可以使用默认为drop=FALSE.

train.X <- subset(Weekly[train],select="Lag2")

您还可以使用逻辑表达式作为参数来指示要保留的行或元素:

train.X <- subset(Weekly,Year<2009,select="Lag2")

子集函数还保持列名完整,让您train.X$Lag2用作有效列。按照另一个答案中的建议使用 data.frame 或 as.data.frame 将丢失原始名称信息。

> names(train.X)
[1] "Lag2"
于 2015-03-16T06:22:51.987 回答