r - 如何聚类点和绘图

标签 r plot cluster-analysis

我正在尝试在 R 中使用聚类。我是一个菜鸟,并没有太多地使用 R。

我将地理位置点作为纬度和经度值。我要做的是使用这些数据找出热点。

我希望创建相距 600 英尺的 4 个或更多点的集群。

我想获得这些簇的质心并绘制它们。

数据如下所示:

LATITUDE    LONGITUD
32.70132    -85.52518
34.74251    -86.88351
32.55205    -87.34777
32.64144    -85.35430
34.92803    -87.81506
32.38016    -86.29790
32.42127    -87.08690
...

structure(list(LATITUDE = c(32.70132, 34.74251, 32.55205, 32.64144, 
34.92803, 32.38016, 32.42127, 32.9095, 33.58092, 32.51617, 33.5726, 
33.83251, 34.65639, 34.27694, 33.73851, 33.95132, 31.35445, 34.05263, 
33.37959, 30.50248, 32.31561, 32.66919, 31.75039, 33.56986, 33.27091, 
33.93598, 32.30964, 31.09773, 32.26711, 33.54263, 34.72014, 34.78548, 
30.65705, 31.25939, 31.27647, 30.54322, 31.22416, 33.38549, 33.18338, 
31.16811, 32.38368, 32.36253, 31.14464), LONGITUD = c(-85.52518, 
-86.88351, -87.34777, -85.3543, -87.81506, -86.2979, -87.0869, 
-85.75888, -86.27647, -86.21179, -86.65275, -87.2696, -85.72738, 
-87.71489, -86.48934, -86.29693, -88.22943, -87.55328, -85.31454, 
-87.79342, -86.88108, -86.26669, -88.04425, -86.44631, -87.74383, 
-87.72403, -86.28067, -85.4449, -87.62541, -86.56251, -86.48971, 
-85.59656, -88.24491, -86.60828, -86.18112, -88.22778, -85.63784, 
-86.03297, -87.55456, -85.37719, -86.38047, -86.21579, -86.86606
)), .Names = c("LATITUDE", "LONGITUD"), class = "data.frame", row.names = c(NA, 
-43L))

上述数据框中有 30,800 个条目(地理位置)。我在上面给出了一个样本。

我不能使用 K 手段,因为它创建了否。指定的集群数量,但这里并非如此。集群应该由 4 个或更多点组成,这些点在大约 600 英尺的距离内。

作为第一步,我尝试绘制所有纬度和经度点,并了解可视化的外观。这样我就可以用它来检查集群图是否形成,这个图是否相似。
plot(dbfvar[,1], dbfvar[,2], type="l") #dbfvar is the dataframe having above data.

剧情并不令人满意。这并不像预期的那样。 enter image description here

主要部分是创建集群并获取它们的质心,并可视化形成的集群的质心。

附言:我不限于使用 R,我也可以使用 python。在我继续并在 7 个这样的文件(每个 30,800 个地理位置)上实现它之前,我正在为上述问题寻找一个好的解决方案。

最佳答案

层次聚类是一种方法。

首先构建一个树状图:

dend <- hclust(dist(theData), method="complete")

我在这里使用“完整”链接,以便所有组都按最大距离“规则”合并。如果我们想确保一组中的所有点最多相隔一定距离,这在以后应该很有用。

我选择“2”的距离(因为我不确定如何将您的纬度和经度转换为英尺。您应该先转换,然后选择 600 而不是 2)。这是在高度为“2”处进行切割的结果树状图。
plot(dend, hang=-1)
points(c(-100,100), c(2,2), col="red", type="l", lty=2)

dendrogram

现在每个被红线相交的子树都将成为一个簇。
groups <- cutree(theData, h=2) # change "h" here to 600 after converting to feet.

我们可以将它们绘制为散点图以查看它们的外观:
plot(theData, col=groups)

cluster_scatter

有希望。附近的点形成集群,这正是我们想要的。

让我们在这些中心周围添加半径为 1 的中心和圆(这样圆内的最大距离为 2):
G1 <- tapply(theData[,1], groups, mean)  # means of groups
G2 <- tapply(theData[,2], groups, mean)  # ...

library(plotrix)  # for drawing circles
plot(theData, col=groups)
points(G1, G2, col= 1:6, cex=2, pch=19)
for(i in 1:length(G1)) {  # draw circles
    draw.circle(G1[i], G2[i], 1, border=i,lty=3,lwd=3)
}

radius

看起来围绕均值绘制圆圈并不是捕获集群内所有点的最佳方式。尽管如此,在视觉上可以验证一组中的点之间的最大距离为 2。(只需尝试稍微移动圆圈以封装所有点)。

关于r - 如何聚类点和绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26540831/

相关文章:

R (spatstat) : Built-In Functions Not Evaluating to Desired Limit

r - 如何获取在计算 R 表达式之前需要定义的所有变量?

swift - 我想循环遍历集群注释中的所有注释

java - 在 Java 中使用 ELKI 进行预计算聚类评估

r - 如何控制在ggplot2中首先绘制哪个因素?

R 的三明治包为线性模型中的稳健标准误差产生奇怪的结果

R - 差异散点图

matlab plot with axis for each plot only on side

python - Matplotlib - 散布在常规图的顶部

hadoop - 使用MapReduce进行聚类的设计