2015-06-02 25 views
3

我有一个data.framexy列,以及一个class列,给出了现有多类SVM模型下每个点的分类。下面是一些示例代码:R中的空间数据:多类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) 

plot results

我想接下来做的就是这个结果转换成某种形式的SpatialPolygons对象,每个因子水平一个Polygons对象,出口到GeoJSON的,因此可以用在地图绘制应用程序中。什么是这样做的好方法?我是否需要自己编写例程来跟踪图像(作为矩阵)并找出区域之间的边界?

我查看了rasterToPolygons()的文档,但我无法弄清楚如何将其应用于我的情况,所以我希望有一些帮助。

最后,我的数据将成为具有真实纬度/经度信息的地理空间,但我想先尝试这个更简单的情况。

回答

1

您需要将第二张图像转换为栅格(请参阅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