无法在序列中读取SVM中的svmPoly或无法预测R中的功能(对大栅格进行分类)

时间:2019-04-11 20:28:56

标签: r svm r-caret r-raster

我正在尝试使用支持向量机对大型栅格堆栈进行分类。我正在尝试两种方法: 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分类器的任何解决方案或任何其他替代方案,我将不胜感激。

0 个答案:

没有答案