我正在尝试使用auto foo = std::cbegin(arr);
进行图像分类,但是遇到一个错误,即虽然已经在该论坛上进行了报道,但解决方案不适合我的情况。
我要分类的数据是两层的const
:
svm
我的训练数据是使用多边形作为参考并提取这些位置的像素值得到的:
raster stack
和
> S1_images
class : RasterStack
dimensions : 1000, 1414, 1414000, 2 (nrow, ncol, ncell, nlayers)
resolution : 10, 10 (x, y)
extent : 670860, 685000, 6163420, 6173420 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0
names : X20180415_VH, X20180415_VV
min values : 1.621079e-05, 1.929869e-04
max values : 24.6396, 159.7452
在training_S<-raster::extract(S_images_t, training, df=TRUE)
training_S$Class<-factor(training_S$Class)
> head(training_S)
ID X20180415_VH X20180415_VV Class
1 1 0.006463605 0.05813200 1
2 1 0.006663103 0.06266786 1
3 1 0.007048910 0.06308612 1
4 1 0.006351015 0.04774158 1
5 1 0.006822301 0.05248845 1
6 1 0.007194918 0.05911565 1
为最佳参数选择之后,我创建了模型(到目前为止,很好)
> str(training_S)
'data.frame': 33239 obs. of 4 variables:
$ ID : num 1 1 1 1 1 1 1 1 1 1 ...
$ X20180415_VH: num 0.00646 0.00666 0.00705 0.00635 0.00682 ...
$ X20180415_VV: num 0.0581 0.0627 0.0631 0.0477 0.0525 ...
$ Class : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
接下来,我尝试使用tune.svm
对输入数据进行分类:
SVM<-svm(x=training_S[ ,c(1:(length(training_S)-1))], y=training_S$Class, gamma = 0.1, cost = 10)
这是我的错误:
predict
按照R Bloggers的示例,我将LC<-predict(S1_images, model=SVM, na.rm=TRUE)
转换为数据框,并正确重命名了列:
> LC<-predict(S1_images, model=SVM, na.rm=TRUE)
Error in newdata[, object$scaled, drop = FALSE] :
(subscript) logical subscript too long
当尝试再次运行分类时:
raster stack
关于我的数据的一些额外信息:
S1_images_df <- data.frame(getValues(S1_images))
names(S1_images_df) <- c("X20180415_VH", "X20180415_VV")
我一直在检查这两个较早的帖子,但不确定如何在我的情况下实现该解决方案:
答案 0 :(得分:1)
在训练模型时,您似乎将ID
作为协变量。如果ID
有意义,并且您想将其包括在模型中,则需要向ID
添加一个相应的S1_images_df
字段。更可能的是,在将训练数据传递到svm
时应该排除它:
SVM<-svm(x=training_S[, -c(1, ncol(training_S))], y=training_S$Class, gamma = 0.1, cost = 10)