在R中运行Knn函数报错:train与class长度不一致的解决方法
解决KNN算法中train与class长度不一致的问题
错误根源
knn函数硬性要求训练集(train)的行数必须和类别标签参数(cl)的长度完全匹配。你的代码出现该错误,主要有两个可能:
0.9*nrow(Knn_data)计算结果可能为非整数,sample函数会自动向下取整,但后续索引操作可能引发隐性长度不匹配;Knn_data[ran,8]返回的是数据框列而非向量,结构上的差异也会导致函数判定长度不一致。
调整方案
将训练集大小转为整数
先通过取整函数明确训练集的行数,避免浮点运算带来的误差:# 计算整数型训练集规模 train_size <- floor(0.9 * nrow(Knn_data)) ran <- sample(1:nrow(Knn_data), train_size)确保类别标签为向量格式
提取类别标签时添加drop=TRUE参数,强制返回向量而非数据框列:Knn_target_category <- Knn_data[ran, 8, drop=TRUE]
修正后的完整代码
# 确定整数训练集大小 train_size <- floor(0.9 * nrow(Knn_data)) ran <- sample(1:nrow(Knn_data), train_size) # 数据归一化处理 nor <- function(x) { (x-min(x))/(max(x)-min(x))} Knn_data_norm <- as.data.frame(lapply(Knn_data[,c(1,2,3,4,5,6,7)], nor)) summary(Knn_data_norm) # 划分训练集与测试集 Knn_train <- Knn_data_norm[ran,] Knn_test <- Knn_data_norm[-ran,] Knn_target_category <- Knn_data[ran,8, drop=TRUE] Knn_test_category <- Knn_data[-ran,8, drop=TRUE] # 执行KNN算法 library(class) pr <- knn(Knn_train, Knn_test, cl=Knn_target_category, k=3)
内容的提问来源于stack exchange,提问作者ano273
相关产品推荐
相关产品推荐

