You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行R语言神经网络代码时遇“subscript out of bounds”下标越界报错求助

解决R语言neuralnet模型报错:subscript out of bounds

报错核心原因

这个错误本质是预测用的数据集和训练模型的数据集不匹配,你的代码里存在几个关键问题:

  • 变量名混乱:混用data2、d2、d1但未明确三者关系,导致采样索引、训练/测试集的维度、变量完全不对应
  • compute()传入的d1[,c(1:5)],和训练模型时用的d2特征列数/列名不一致,模型找不到对应变量触发下标越界
  • RMSE计算逻辑错误:用全量data2$quality和基于d1的预测结果做计算,两者行数不匹配

具体修复步骤

1. 统一数据集命名与结构

先明确数据集关系,假设data2是包含目标列quality的完整数据集,统一用一套命名避免混乱:

# 拆分特征与目标变量(如果还没做)
features <- data2[, !names(data2) %in% "quality"]
target <- data2$quality

2. 修正训练/测试集采样逻辑

确保采样索引和数据集行数严格对应,避免跨数据集采样导致维度错误:

for(j in 10:65){
  for(i in 1:k){
    # 从完整数据集采样j行作为训练集索引
    index <- sample(1:nrow(data2), j)
    
    train_data <- data2[index, ]  # 训练集(含特征+目标)
    test_data <- data2[-index, ]  # 测试集(含特征+目标)
    test_features <- test_data[, !names(test_data) %in% "quality"]  # 测试集特征

3. 匹配训练与预测的数据集

训练模型时用采样后的训练集,而非全量d2;预测时传入和训练集特征完全一致的测试集特征:

# 用训练集训练模型
    NN <- neuralnet(quality~., data = train_data, hidden=10, linear.output = TRUE)
    # 传入测试集特征做预测(列数/列名和训练集完全匹配)
    predict_testNN <- compute(NN, test_features)

4. 修正RMSE计算的维度匹配

用测试集的真实目标值和对应预测结果计算RMSE,而非全量数据集的目标值:

# 反归一化(保持和原代码逻辑一致,用全量数据集的极值)
    predict_testNN <- (predict_testNN$net.result*(max(target)-min(target)))+min(target)
    
    # 计算测试集的RMSE
    RMSE.NN[i] <- sqrt(sum((test_data$quality - predict_testNN)^2)/nrow(test_data))
  }
  List[[j]] <- RMSE.NN
}

5. 补全依赖包加载

你的代码里未安装/加载neuralnet包,这是运行模型的必要依赖,需补充:

install.packages("neuralnet")
library(neuralnet)

完整修正后的代码

install.packages("boot")
install.packages("plyr")
install.packages("neuralnet")

library(boot)
library(plyr)
library(neuralnet)

set.seed(50)
k <- 10
RMSE.NN <- NULL
List <- list()

# 假设data2是包含quality列的完整数据集,统一命名避免混乱
d2 <- data2
d1 <- d2[, !names(d2) %in% "quality"]

for(j in 10:65){
  for(i in 1:k){
    index <- sample(1:nrow(d2), j)
    
    trainNN <- d2[index, ]
    testNN <- d2[-index, ]
    test_features <- testNN[, !names(testNN) %in% "quality"]
    
    NN <- neuralnet(quality~., data = trainNN, hidden=10, linear.output = TRUE)
    predict_testNN <- compute(NN, test_features)
    
    predict_testNN <- (predict_testNN$net.result*(max(d2$quality)-min(d2$quality)))+min(d2$quality)
    
    RMSE.NN[i] <- sqrt(sum((testNN$quality - predict_testNN)^2)/nrow(testNN))
  }
  List[[j]] <- RMSE.NN
}

matrixRMSE <- do.call(cbind, List)
matrixRMSE

内容的提问来源于stack exchange,提问作者linta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:55:31