Я пытаюсь классифицировать большой растровый стек с помощью Векторной машины поддержки.Я пробую два подхода: 1) преобразовать все как матрицу, однако, поскольку растр слишком большой, в R не хватает памяти, поэтому я не могу преобразовать свой растр в матрицу.2) с функцией каретки.
Мой код выглядит так:
image <- stack() ## this is a stack with 13 bands it is quite big
Изображение выглядит так:
class : RasterStack
dimensions : 22547, 22932, 517047804, 13 (nrow, ncol, ncell, nlayers)
resolution : 8.983153e-05, 8.983153e-05 (x, y)
extent : 112.7111, 114.7711, -3.180485, -1.155054 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +no_defs
names : blue, green, red, re1, re2, re3, nir, nir2, swir1, swir2, temp, NDVI, NBR
min values : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5052, -7670
max values : 4982, 5182, 5648, 5325, 3932, 5134, 6820, 6265, 7395, 13265, 13145, 8660, 9985
training_data <- readOGR("xxx.shp")
это данные тренировки
class : SpatialPolygonsDataFrame
features : 10
extent : 112.7161, 114.6713, -3.14763, -0.9813859 (xmin, xmax, ymin,ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84+towgs84=0,0,0
variables : 6
names : Classname, Classvalue, RED, GREEN, BLUE, Count
min values : Agriculture, 1, 0, 0, 0, 10937
max values : Water, 9, 76, 76, 67, 58904
Создание 250 выборок точек из многоугольников
ptsamp <- spsample(training_data, 250, type = 'stratified')
Добавление информации о классе к выборкам точек из многоугольников
ptsamp$Classvalue <- over(ptsamp, training_data)$Classvalue
извлечение значений с точками
df <- extract(image, ptsamp)
объединение информации о классе с извлеченными значениями
sampdata <- data.frame(classvalue = ptsamp$Classvalue, df)
Разделение обучающих данных на подмножество поездови тестовое подмножество
train <- sample(nrow(sampdata), round((nrow(sampdata) - 1) / 2, 0))
test <- c(1:nrow(sampdata))[!(c(1:nrow(sampdata)) %in% train)]
trainset.df <- sampdata[train,]
testset.df <- sampdata[test,]
Подгонка наилучшего SVM с использованием настройки
svm.fit <- best.svm(classvalue~., data = sampdata, gamma = 10^(-6:-1),
cost = 10^(-1:1))
Подготовка карты изображений для предсказаний
image.df <- data.frame(getValues(image))
Здесь я получаю ошибку памяти;Я пробовал в качестве матрицы и получаю то же самое, что мне хотелось бы получить, чтобы перейти к этой части:
image.pred <- predict(svm.fit, image)
Второй подход заключается в следующем:
library(caret)
library(kernlab)
model <- "svmPoly"
подготовка ДФ для обучения и занятий как фактор
trainx <- as.data.frame(df)
trainy <- sampdata[,1]
вПакет Theory Caret имеет опцию "svmPoly", однако он не работает ###, и я обнаружил, что он не работает:
test_class_cv_model <- train(trainx, trainy, method = "svmPoly",
metric = ifelse(is.factor(trainy), "Accuracy", "RMSE"),
trControl = trainControl(), tuneGrid = NULL,
tuneLength = 3)
primage1 <- predict(image, trainData = training_data, responseCol =
"Classvalue", model= test_class_cv_model,tuneLength = 1, trainPartition =
0.7)
plot(primage1$map, col = classcolor, legend = FALSE, axes = FALSE, box =
`enter code here`FALSE)
legend(1,1, legend = levels(training_data$Classvalue), fill = colors ,
title = "Classes", horiz = TRUE, bty = "n")
Я бы ожидал запустить SVM в большом растровом стеке с данными обучения в качестве шейп-файла,Я был бы очень признателен, если у кого-то есть решение или какие-либо другие альтернативы для запуска классификатора SVM в большом растровом стеке.