我有一堆经度和纬度的数据点。我想使用R根据它们的距离对它们进行聚类。

我已经看过此页面并尝试过clustTool软件包。但是我不确定clustTool中的clust函数是否将数据点(纬度,经度)视为空间数据并使用适当的公式来计算它们之间的距离。

我的意思是我看不到它们如何区分空间数据和序数数据。我相信地图(空间)上的两个点与两个法线之间的距离计算是不同的。 (不是吗?)

如果我想在集群中考虑第三个参数怎么办?

比如说我是否有(lat,lon)和另一个参数。

距离是如何计算的?

clustTool的另一个问题是考虑到GUI的设计。我不知道如何跳过库中的GUI开销,因为我不需要它。

我在R中有哪些选项可以对空间数据进行聚类分析?

评论

cran.r-project.org/web/packages/cluster/cluster.pdf

tnx Whuber。我有个问题。 R中是否有用于空间聚类的特定程序包?我的意思是,据我所知,对于空间数据,应该以不同的方式计算距离。这是正确的吗?

我遇到的几乎所有通用群集程序包(包括R's Cluster)都将接受相异性或距离矩阵作为输入。只要您可以自己计算距离,这将使它们完全通用并适用于球面上的聚类,这很简单。

我长期面临着一个非常类似的问题,但是找不到一个好的解决方案,您可以看看我在stack-exchange中的文章。我有一组每月的海面温度数据(lon,lat,sst)。您是否找到了找到此类空间数据聚类的方法?我找不到合适的R包/功能。在此先感谢Paco

您是否考虑过使用SatScan?

#1 楼

这是一个基于基于距离的点的聚类查找规则的解决方案,但是使用distm软件包中的geosphere函数:

library(sp)
library(rgdal)
library(geosphere)

# example data from the thread
x <- c(-1.482156, -1.482318, -1.482129, -1.482880, -1.485735, -1.485770, -1.485913, -1.484275, -1.485866)
y <- c(54.90083, 54.90078, 54.90077, 54.90011, 54.89936, 54.89935, 54.89935, 54.89879, 54.89902)

# convert data to a SpatialPointsDataFrame object
xy <- SpatialPointsDataFrame(
      matrix(c(x,y), ncol=2), data.frame(ID=seq(1:length(x))),
      proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))

# use the distm function to generate a geodesic distance matrix in meters
mdist <- distm(xy)

# cluster all points using a hierarchical clustering approach
hc <- hclust(as.dist(mdist), method="complete")

# define the distance threshold, in this case 40 m
d=40

# define clusters based on a tree "height" cutoff "d" and add them to the SpDataFrame
xy$clust <- cutree(hc, h=d)


您应该得到类似的信息:

        coordinates ID clust
1 (-1.482156, 54.90083)  1     1
2 (-1.482318, 54.90078)  2     1
3 (-1.482129, 54.90077)  3     1
4  (-1.48288, 54.90011)  4     2
5 (-1.485735, 54.89936)  5     3
6  (-1.48577, 54.89935)  6     3
7 (-1.485913, 54.89935)  7     3
8 (-1.484275, 54.89879)  8     4
9 (-1.485866, 54.89902)  9     3


这些后续步骤仅用于可视化:

library(dismo)
library(rgeos)

# expand the extent of plotting frame
xy@bbox[] <- as.matrix(extend(extent(xy),0.001))

# get the centroid coords for each cluster
cent <- matrix(ncol=2, nrow=max(xy$clust))
for (i in 1:max(xy$clust))
    # gCentroid from the rgeos package
    cent[i,] <- gCentroid(subset(xy, clust == i))@coords

# compute circles around the centroid coords using a 40m radius
# from the dismo package
ci <- circles(cent, d=d, lonlat=T)

# plot
plot(ci@polygons, axes=T)
plot(xy, col=rainbow(4)[factor(xy$clust)], add=T)




评论


我对此有疑问:我有距离矩阵,并且找到每个项目的最大距离:对于(i在1:186中){print(paste(i,min(distance [i,c(1:(i-1) ,(i + 1):187)])))}需要4,但是当我应用x <-cutree(hc,h = 5)时,我得到了187个簇中的101个。逻辑上应该是1。怎么了?

– Peter.k
19年7月13日在15:38

嗨,我不确定如何在这里为您提供帮助。我做了一个小例子,它很好用:x = as.dist(matrix(runif(100),ncol = 10)); hc = hclust(x,method =“ complete”);美眉(hc,h = max(x))。正如您所期望的,这将为您提供一个群集。尝试使用以下命令绘制聚类模型:plot(hc),然后查看最大值。

–ssanch
19-09-10在19:31



@ssanch很好的解决方案。您知道如何在两组之间对点进行聚类吗?如何确定组2中组1的最近点。

–Herman牙刷
19/12/31在17:36

@HermanToothrot谢谢!您是说它们在空间上重叠吗?对于这种类型的问题,更好的解决方案可能是K近邻(knn)算法。虽然不确定。

–ssanch
20-2-27在22:52

#2 楼

有一些函数可以计算R中球形地球上的真实距离,因此也许您可以使用这些函数并使用距离矩阵而不是坐标来调用聚类函数。我永远不记得这些名称或相关软件包。有关线索,请参见R空间任务视图。

另一个选择是将点转换为参考系统,以使距离成为欧几里得。在英国,我可以使用OSGrid参考系统:

 data = spTransform(data,CRS("+epsg:27700"))


使用软件包“ rgdal”(或也许是maptools)中的spTransform。找到适合您的数据的网格系统(相关的UTM区域可能会做),并且您将以米为单位来计算距离没有问题。

这仅在数据较小的区域时才有用-如果您具有全局数据,则确实需要计算球面距离,并且该距离在R空间任务视图中讨论的一个或多个程序包中的某个位置:

http:// cran。 r-project.org/web/views/Spatial.html

看起来像您想要打包“ geosphere”,但请务必阅读空间任务视图!

#3 楼

我来看看Spatstat软件包。整个软件包专用于分析空间点模式(原文如此)。 CSIRO的Adrian Baddeley教授撰写了一本非常出色的电子书,其中包含详细的文档,操作方法和整个软件包的示例。请看第19章的“点模式的距离方法”。具有一致的x和y值的东西-可能尝试使用rgdal(GDAL和OGR的R库)。

评论


tnx。那是一本很棒的电子书。但是我不确定使用Spatstat如何完成集群,因为我看不到任何特定的集群功能。你能解释一下吗?

–卡普坦
2011年12月7日,0:53

实际上,说句公道话,再看一遍,我将看一下DCluster程序包,该程序包也是Bivand撰写的用于分析疾病集群的程序包。另外,很抱歉等待回复!

–om_henners
2011-12-20 13:05



#4 楼

也许这个答案来得太晚了2年,但是无论如何。

据我所知,空间聚类至少在开始时就需要一个限定的邻域,聚类受其约束。 SpatialEpi程序包中的kulldorf函数允许基于聚集的邻域进行空间聚类。类似的讨论:https://stats.stackexchange.com/questions/9739/clustering-spatial-data-in-r

,这里是有关最近的集群算法(例如CHAMAELEON)的有趣论文:http ://www.cs.uiuc.edu/homes/hanj/pdf/gkdbk01.pdf

评论


Han等人的论文“数据挖掘中的空间聚类方法:调查”现在可以在以下位置找到:hanj.cs.illinois.edu/pdf/gkdbk01.pdf

–knb
15年5月11日在12:25



#5 楼

虽然不是R软件包,但是geoda可能是一个有趣的程序,因为它是由Luc Anselin撰写的,他为空间聚类理论做出了贡献,我相信它可以实现一些聚类(尽管自从我探索它以来已经有一段时间了)。

spdep是一个很棒的R软件包。它包括skater函数,用于通过“树边缘去除”进行空间“ K”光泽分析。它还带来了其他用于空间分析的功能,包括空间自相关以及使用Local Moran和其他空间统计信息检测局部聚类的功能。它的描述如下:


一组函数,这些函数用于根据多边形连续性,点距,距离和细分来创建空间权重矩阵对象
,以进行汇总这些对象,并允许它们在空间数据分析中使用,包括通过最小生成树进行区域聚合;空间自相关测试的集合,包括全局Moran的I,APLE,Geary的C,Hubert / Mantel通用乘积统计,Empireical Bayes估计和Assunção/ Reis指数,Getis / Ord G和多色联接
统计统计数据,局部Moran的I和Getis / Ord G,鞍点
以及对全局和局部Moran的I的精确测试;和
函数来估计空间同时自回归(SAR)滞后和误差模型,滞后模型的影响度量,加权和未加权SAR和CAR空间回归模型,半参数和
Moran特征向量空间滤波,GM SAR误差模型和
广义空间两阶段最小二乘模型。


您至少可以测试您的点是否在空间上随机分布(考虑空间距离时可能是有用的测试预聚类),但是它还可以生成其他有用的度量,您可以将其输入到聚类算法中。最后,也许您可​​能会在https://stats.stackexchange.com/上找到有关空间聚类问题的有用问题(尽管更多是从理论角度来看)。

评论


这个答案是确定许多相同类型的功能,分析spatstat库中可用的空间模式或点模式的自相关。在有趣的地方,这与聚类问题并不完全相关。我全都进行假设检验和探索性分析,但也应直接解决眼前的问题。使用spdep进行聚类的方法是基于空间权重矩阵[Wij],该权重矩阵使用k个最近邻,偶发性或距离。

–杰弗里·埃文斯(Jeffrey Evans)
16-10-3在17:50

#6 楼

尝试使用R中的LeaderCluster packacge。与许多其他群集算法不同,它不需要用户指定群集数量,而是需要群集的近似半径作为其主要调整参数。

#7 楼

检查地球包裹距离函数或化石度距函数。您具有度数数据,并且需要在进行聚类之前将其转换为米或英尺。