R 中的空间数据:多 class SVM 的绘图决策区域
Spatial data in R: plot decision regions of multi-class SVM
我有一个 data.frame
包含 x
和 y
列,还有一个 class
列给出了每个点的 class 化现有的多 class SVM 模型。下面是一些示例代码:
library(rgdal)
library(rgeos)
library(e1071) # for svm()
library(sp)
library(raster)
library(maptools)
library(plyr)
## Create a mask of the data region, as a data frame of x/y points.
covering <- function(data, xlen=150, ylen=150) {
# Convex hulls of each class's data points:
polys <- dlply(data, .(class), function(x) Polygon(x[chull(x[-3]), -3]))
# Union of the hulls:
bbs <- unionSpatialPolygons(SpatialPolygons(list(Polygons(polys, 1))), 1)
# Pixels that are inside the union polygon:
grid <- expand.grid(x=seq(min(data$x), max(data$x), length.out=xlen),
y=seq(min(data$y), max(data$y), length.out=ylen))
grid[!is.na(over(SpatialPoints(grid), bbs)), ]
}
set.seed(123)
data <- rbind(data.frame(x=rnorm(1000, 5*runif(1)), y=rnorm(1000, 5*runif(1)), class='A'),
data.frame(x=rnorm(1000, 5*runif(1)), y=rnorm(1000, 5*runif(1)), class='B'),
data.frame(x=rnorm(1000, 5*runif(1)), y=rnorm(1000, 5*runif(1)), class='C'))
m <- svm(class ~ x+y, data)
grid <- covering(data)
par(mfrow=c(1,2))
plot(y ~ x, data, col=data$class)
plot(y ~ x, grid, col=predict(m, grid), pch=20)
我接下来要做的是将此结果转换为某种类型的 SpatialPolygons
对象,每个因子级别有一个 Polygons
对象,用于导出到 GeoJSON,以便它可以用于地图应用程序。这样做的好方法是什么?我是否需要自己编写例程来跟踪图像(作为矩阵)并找到区域之间的边界?
我查看了 rasterToPolygons()
的文档,但我不知道如何将它应用到我的情况中,所以我欢迎一些帮助。
最后,我的数据 是 具有真实 latitude/longitude 信息的地理空间数据,但我想先尝试这个更简单的案例。
您需要将第二张图像转换为光栅图像(参见 here)。
sp.grid <- cbind(grid, col = predict(m, grid))
coordinates(sp.grid) <- ~ x + y
gridded(sp.grid) <- TRUE
sp.grid <- raster(sp.grid)
那么你的尝试成功了。
grid.pols <- rasterToPolygons(sp.grid, n = 16, dissolve = TRUE)
plot(grid.pols)
class : SpatialPolygonsDataFrame
features : 3
extent : -1.842044, 7.259169, -2.298892, 5.512507 (xmin, xmax, ymin, ymax)
coord. ref. : NA
variables : 1
names : col
min values : 1
max values : 3
我有一个 data.frame
包含 x
和 y
列,还有一个 class
列给出了每个点的 class 化现有的多 class SVM 模型。下面是一些示例代码:
library(rgdal)
library(rgeos)
library(e1071) # for svm()
library(sp)
library(raster)
library(maptools)
library(plyr)
## Create a mask of the data region, as a data frame of x/y points.
covering <- function(data, xlen=150, ylen=150) {
# Convex hulls of each class's data points:
polys <- dlply(data, .(class), function(x) Polygon(x[chull(x[-3]), -3]))
# Union of the hulls:
bbs <- unionSpatialPolygons(SpatialPolygons(list(Polygons(polys, 1))), 1)
# Pixels that are inside the union polygon:
grid <- expand.grid(x=seq(min(data$x), max(data$x), length.out=xlen),
y=seq(min(data$y), max(data$y), length.out=ylen))
grid[!is.na(over(SpatialPoints(grid), bbs)), ]
}
set.seed(123)
data <- rbind(data.frame(x=rnorm(1000, 5*runif(1)), y=rnorm(1000, 5*runif(1)), class='A'),
data.frame(x=rnorm(1000, 5*runif(1)), y=rnorm(1000, 5*runif(1)), class='B'),
data.frame(x=rnorm(1000, 5*runif(1)), y=rnorm(1000, 5*runif(1)), class='C'))
m <- svm(class ~ x+y, data)
grid <- covering(data)
par(mfrow=c(1,2))
plot(y ~ x, data, col=data$class)
plot(y ~ x, grid, col=predict(m, grid), pch=20)
我接下来要做的是将此结果转换为某种类型的 SpatialPolygons
对象,每个因子级别有一个 Polygons
对象,用于导出到 GeoJSON,以便它可以用于地图应用程序。这样做的好方法是什么?我是否需要自己编写例程来跟踪图像(作为矩阵)并找到区域之间的边界?
我查看了 rasterToPolygons()
的文档,但我不知道如何将它应用到我的情况中,所以我欢迎一些帮助。
最后,我的数据 是 具有真实 latitude/longitude 信息的地理空间数据,但我想先尝试这个更简单的案例。
您需要将第二张图像转换为光栅图像(参见 here)。
sp.grid <- cbind(grid, col = predict(m, grid))
coordinates(sp.grid) <- ~ x + y
gridded(sp.grid) <- TRUE
sp.grid <- raster(sp.grid)
那么你的尝试成功了。
grid.pols <- rasterToPolygons(sp.grid, n = 16, dissolve = TRUE)
plot(grid.pols)
class : SpatialPolygonsDataFrame
features : 3
extent : -1.842044, 7.259169, -2.298892, 5.512507 (xmin, xmax, ymin, ymax)
coord. ref. : NA
variables : 1
names : col
min values : 1
max values : 3