Я пытаюсь запустить классификацию изображений, используя svm
, но я сталкиваюсь с ошибкой, что, хотя об этом уже сообщалось на этом форуме, решения не соответствуют моему случаю.
Данные, которые я хочу классифицировать, представляют собой raster stack
из 2 слоев:
> 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
для классификации моих входных данных:
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
Следуя примеру R Bloggers , я преобразовал свой raster stack
в кадр данных и правильно переименовал столбцы:
S1_images_df <- data.frame(getValues(S1_images))
names(S1_images_df) <- c("X20180415_VH", "X20180415_VV")
При повторном запуске классификации:
LC<-predict(SVM, S1_images_df)
> LC<-predict(SVM, S1_images_df)
Error in newdata[, object$scaled, drop = FALSE] :
(subscript) logical subscript too long
Дополнительная информация о моих данных:
> 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
> str(S1_images_df)
'data.frame': 1414000 obs. of 2 variables:
$ X20180415_VH: num 0.005 0.00531 0.00514 0.0048 0.00461 ...
$ X20180415_VV: num 0.0954 0.0947 0.0933 0.0952 0.0951 ...
> dim(training_S)
[1] 33239 4
> dim(S1_images_df)
[1] 1414000 2
Я проверял эти два старых сообщения, но не уверен, как реализовать решение в моем случае:
Здесь и Здесь