R中的空间聚类(简单示例)

Mat*_*ath 8 r hierarchical-clustering spatial geospatial

我有这么简单 data.frame

 lat<-c(1,2,3,10,11,12,20,21,22,23)
 lon<-c(5,6,7,30,31,32,50,51,52,53)
 data=data.frame(lat,lon)
Run Code Online (Sandbox Code Playgroud)

想法是基于距离找到空间聚类

首先,我绘制地图(lon,lat):

plot(data$lon,data$lat)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

很明显我有三个基于点位置之间距离的聚类.

为此目的,我在R中尝试了这个代码:

d= as.matrix(dist(cbind(data$lon,data$lat))) #Creat distance matrix
d=ifelse(d<5,d,0) #keep only distance < 5
d=as.dist(d)
hc<-hclust(d) # hierarchical clustering
plot(hc)
data$clust <- cutree(hc,k=3) # cut the dendrogram to generate 3 clusters
Run Code Online (Sandbox Code Playgroud)

这给出了:

在此输入图像描述

现在我尝试使用簇中的颜色绘制相同的点

plot(data$x,data$y, col=c("red","blue","green")[data$clust],pch=19)
Run Code Online (Sandbox Code Playgroud)

结果如下

在此输入图像描述

这不是我想要的.

实际上,我想找到像这样的情节

在此输入图像描述

谢谢你的帮助.

joh*_*nes 10

这样的事情怎么样:

lat<-c(1,2,3,10,11,12,20,21,22,23)
lon<-c(5,6,7,30,31,32,50,51,52,53)

km <- kmeans(cbind(lat, lon), centers = 3)
plot(lon, lat, col = km$cluster, pch = 20)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Omr*_*374 7

这是一种不同的方法.首先,它假设坐标是WGS-84而不是UTM(平坦).然后,它使用层次聚类(使用method = single,采用"朋友的朋友"聚类策略)将给定半径内的所有邻居聚类到同一群集.

为了计算距离矩阵,我正在使用rdist.earth包中的方法fields.此软件包的默认地球半径为6378.388(赤道半径),可能不是人们想要的,所以我将其更改为6371.有关详细信息,请参阅此文章.

library(fields)
lon = c(31.621785, 31.641773, 31.617269, 31.583895, 31.603284)
lat = c(30.901118, 31.245008, 31.163886, 30.25058, 30.262378)
threshold.in.km <- 40
coors <- data.frame(lon,lat)

#distance matrix
dist.in.km.matrix <- rdist.earth(coors,miles = F,R=6371)

#clustering
fit <- hclust(as.dist(dist.in.km.matrix), method = "single")
clusters <- cutree(fit,h = threshold.in.km)

plot(lon, lat, col = clusters, pch = 20)
Run Code Online (Sandbox Code Playgroud)

如果您不知道簇的数量(如k-means选项),这可能是一个很好的解决方案,并且与minPts = 1的dbscan选项有些相关.

- -编辑 - -

用原始数据:

lat<-c(1,2,3,10,11,12,20,21,22,23)
lon<-c(5,6,7,30,31,32,50,51,52,53)
data=data.frame(lat,lon)

dist <- rdist.earth(data,miles = F,R=6371) #dist <- dist(data) if data is UTM
fit <- hclust(as.dist(dist), method = "single")
clusters <- cutree(fit,h = 1000) #h = 2 if data is UTM
plot(lon, lat, col = clusters, pch = 20)
Run Code Online (Sandbox Code Playgroud)


Aks*_*ngh 5

由于您有一个要集群的空间数据,因此DBSCAN最适合您的数据.您可以使用dbscan()fpc(R包)提供的功能来执行此群集 .

library(fpc)

lat<-c(1,2,3,10,11,12,20,21,22,23)
lon<-c(5,6,7,30,31,32,50,51,52,53)

DBSCAN <- dbscan(cbind(lat, lon), eps = 1.5, MinPts = 3)
plot(lon, lat, col = DBSCAN$cluster, pch = 20)
Run Code Online (Sandbox Code Playgroud)

DBSCAN聚类图