在 R 中使用 SVM 预测栅格文件

  • 本文关键字:文件 SVM r svm r-raster
  • 更新时间 :
  • 英文 :


我是R的新手。而且我已经在 R 中有一个 SVM 模型。现在,我有两个光栅图像,一个是高程,另一个是坡度。高程和坡度将用作 SVM 的预测变量。我还想将结果绘制成地图。

现在我的代码如下,但两个光栅图像输入的预测返回全部 0。它应为 0 或 1。有什么不对吗?

library("e1071")
tornado=read.csv(file="~/Desktop/new.csv",header=TRUE,sep=",")
err<- rep(0,5)
m<-0
for (i in c(1:5)) {
 #split the data sets into testing and training
 training.indices <- sample(nrow(tornado), 1800)
 training <- rep(FALSE, nrow(tornado))
 training[training.indices] <- TRUE
 tornado.input<- tornado[training,]
 tornado.input=data.frame(tornado.input)
 tornado=data.frame(tornado)
 tornado$Sig <- factor(tornado$Sig)
 model <- svm(Sig~slope+elevation, data=tornado.input)
 pred<- predict(model, tornado[!training,] )
 ConfM1<- table(tornado$Sig[!training], pred=pred)
 err[i]<-(sum(ConfM1)-sum(diag(ConfM1)))/sum(ConfM1)
}
library("raster")
library("rgdal")
elevation <- raster("~/Desktop/elevation.tif")
slope<- raster("~/Desktop/slope.tif")
#plot(elevation)
#plot(slope)
logo <- brick(elevation, slope)
r1 <- predict(logo,model)
plot(r1)

也许回答这个问题有点晚了,但我遇到了同样的问题。raster::p redict 函数似乎不提供与 stats:predict 相同的输出。我的替代解决方案只是从预测器栅格(坡度和高程)中提取值,然后使用 ggplot 在空间上投影结果。

####Convert raster into dataframe
logo_df <- as.data.frame(values(logo))
logo_df[c("x","y")] <- coordinates(logo)
logo_df <- logo_df[complete.cases(logo_df),] # in case you had holes in your raster
#### predict to this new data
pred <- predict(model, logo_df, probability = T)
logo_df$svm.fit <- attr(pred, "probabilities")[,2]
###map the predictions
ggplot(logo_df, aes(x,y,fill=svm.fit)) + 
  geom_tile() + 
  scale_fill_gradientn(colours = rev(colorRamps::matlab.like(100))) +
  coord_fixed()

我遇到了这个问题,发现当我将 RasterStack 的图层重命名为它们的变量名称并添加类型选项时,它起作用了!

例如

names(logo)<-c("elevation","slope")
r1<-predict(logo,model,type="response")

最新更新