Не в состоянии реализовать SVM в R - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь запустить классификацию изображений, используя 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

Я проверял эти два старых сообщения, но не уверен, как реализовать решение в моем случае:

Здесь и Здесь

1 Ответ

0 голосов
/ 16 января 2019

Похоже, вы включаете 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...