我正在尝试使用支持向量机对大型栅格堆栈进行分类。我正在尝试两种方法: 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"
准备df以获取培训和课程作为要素
trainx <- as.data.frame(df)
trainy <- sampdata[,1]
从理论上讲,插入符号包可以选择“ 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")
我希望在训练数据作为shapefile的大栅格堆栈中运行SVM。如果有人具有在大型栅格堆栈中运行SVM分类器的任何解决方案或任何其他替代方案,我将不胜感激。