在R中实现SVM图像分类时遭遇‘下标过长’错误求助
解决SVM预测时的"logical subscript too long"错误
这个错误的根源很明确:你在训练SVM模型时不小心把无关的ID列包含进了特征变量里,导致模型期望的输入特征数量和你预测时提供的数据不匹配。
问题分析
看你训练模型的代码:
SVM<-svm(x=training_S[ ,c(1:(length(training_S)-1))], y=training_S$Class, gamma = 0.1, cost = 10)
这里1:(length(training_S)-1)会取training_S的第1到第3列(因为training_S有4列,减1后是3),而第1列就是ID——这是一个完全不参与分类的标识列,不应该作为特征输入模型。
而你用来预测的S1_images_df只有2个特征列(VH和VV),模型训练时记录的scaled属性对应了3个特征的缩放状态,用这个去索引只有2列的新数据,自然就会抛出"logical subscript too long"的错误。
解决方案
只需要重新训练模型,排除ID列,只保留真正的特征变量(也就是VH和VV这两列):
步骤1:重新构建正确的SVM模型
# 明确指定使用特征列,排除ID SVM <- svm(x = training_S[, c("X20180415_VH", "X20180415_VV")], y = training_S$Class, gamma = 0.1, cost = 10)
你也可以用索引的方式(第2、3列):training_S[, 2:3],不过用列名更清晰,避免后续列顺序变化出问题。
步骤2:执行预测
现在模型的输入特征数量和预测数据完全匹配了,你可以直接对RasterStack进行预测:
LC <- predict(S1_images, model = SVM, na.rm = TRUE)
或者用dataframe预测后再转回栅格:
S1_images_df <- data.frame(getValues(S1_images)) names(S1_images_df) <- c("X20180415_VH", "X20180415_VV") # 预测 LC_pred <- predict(SVM, S1_images_df) # 将预测结果转换为栅格(用原栅格的模板) LC_raster <- setValues(S1_images[[1]], LC_pred)
验证小技巧
训练模型前,可以先检查一下输入的特征列:
# 确认训练用的特征列 colnames(training_S[, c("X20180415_VH", "X20180415_VV")]) # 和预测数据的列名对比 colnames(S1_images_df)
确保两者的列名、数量完全一致,就能避免这类匹配错误。
内容的提问来源于stack exchange,提问作者GCGM
相关产品推荐
相关产品推荐

