15

这是我的代码:

train_points <- read.table("kaggle_train_points.txt", sep="\t")
train_labels <- read.table("kaggle_train_labels.txt", sep="\t")
test_points <- read.table("kaggle_test_points.txt", sep="\t")

#uses package 'class'
library(class)
knn(train_points, test_points, train_labels, k = 5);

dim(train_points)是 42000 x 784
dim(train_labels)是 42000 x 1

我没有看到问题,但我收到了错误:

knn(train_points, test_points, train_labels, k = 5) 中的错误:
“train”和“class”的长度不同。

有什么问题?

4

7 回答 7

18

如果无法访问数据,真的很难提供帮助。但是,我怀疑这train_labels应该是一个向量。所以试试

cl = train_labels[,1]
knn(train_points, test_points, cl, k = 5)

还要仔细检查:

dim(train_points)
dim(test_points)
length(cl)
于 2013-04-29T10:48:58.560 回答
3

我最近遇到了一个非常相似的问题。我只想给出一列作为预测变量。在这种情况下,选择一列,您必须记住drop参数并将其设置为FALSE。该knn()函数仅接受矩阵或数据帧作为训练和测试参数。不是向量。

knn(train = trainSet[, 2, drop = FALSE], test = testSet[, 2, drop = FALSE], cl = trainSet$Direction, k = 5)

于 2015-12-21T17:50:39.937 回答
3

尝试使用 as.dataframe() 将数据转换为数据帧。我遇到了同样的问题,之后它工作正常:

train_pointsdf <- as.data.frame(train_points)
train_labelsdf <- as.data.frame(train_labels)
test_pointsdf <- as.data.frame(test_points)
于 2018-10-16T21:50:43.383 回答
3

我在尝试从威斯康星州数据集中将 knn 应用于乳腺癌诊断时遇到了同样的问题我发现这个问题与 cl 参数需要成为向量因子的事实有关(我的错误是写 cl=labels ,我认为这是要预测的向量实际上是一列的数据框)所以解决方案是使用以下语法:knn(train,test,cl=labels$diagnosis,k=21)诊断是一列的标题数据框标签,它运行良好希望这有帮助!

于 2019-08-14T12:08:31.153 回答
1

drop = TRUE当您从数据框中排除 cl 时,只需设置它,它会导致从只有一个级别的数组中删除维度:

cl = train_labels[,1, drop = TRUE]
knn(train_points, test_points, cl, k = 5)
于 2018-04-17T08:35:28.490 回答
0

当我阅读 tibble (read_csv) 时,我遇到了类似的错误,当我切换到 read.csv 时,代码有效。

于 2021-01-06T01:40:22.703 回答
-1

卸载 R 以前的版本并安装 R 版本 > 4.0。它会起作用的。

于 2021-02-11T15:37:53.630 回答