use*_*477 2 plot r 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))
Run Code Online (Sandbox Code Playgroud)
上述数据框中有30,800个条目(地理位置)。我在上面给出了一个示例。
我不能使用K均值,因为它会产生No。指定的群集数量,但此处并非如此。聚类应包含约600英尺范围内的4个或更多点。
作为第一步,我试图绘制所有纬度和经度点,并了解可视化效果。这样我就可以使用它来检查是否形成了群集图,并且该图看起来是否相似。
plot(dbfvar[,1], dbfvar[,2], type="l") #dbfvar is the dataframe having above data.
Run Code Online (Sandbox Code Playgroud)
情节并不令人满意。这不是预期的。
主要部分是创建聚类并获取它们的质心,并可视化所形成的聚类的质心。
PS:我不仅限于使用R,我也可以使用python。在寻求并在7个此类文件(每个30,800个地理位置)上实施该文件之前,我正在为上述问题寻求一个好的解决方案。
分层聚类是一种方法。
首先,您要构建树状图:
dend <- hclust(dist(theData), method="complete")
Run Code Online (Sandbox Code Playgroud)
我在这里使用“完整”链接,以便所有组通过最大距离“规则”合并。如果我们要确保一组中的所有点至多相距一定距离,这将在以后有用。
我选择的距离为“ 2”(因为我不确定如何将您的经度和纬度转换为英尺。您应该先转换然后选择600而不是2)。这是生成的树状图,其高度为“ 2”。
plot(dend, hang=-1)
points(c(-100,100), c(2,2), col="red", type="l", lty=2)
Run Code Online (Sandbox Code Playgroud)

现在,每条与红线相交的子树将成为一个群集。
groups <- cutree(theData, h=2) # change "h" here to 600 after converting to feet.
Run Code Online (Sandbox Code Playgroud)
我们可以将它们绘制为散点图,以查看它们的外观:
plot(theData, col=groups)
Run Code Online (Sandbox Code Playgroud)

有希望。附近的点形成了我们想要的聚类。
让我们在半径为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)
}
Run Code Online (Sandbox Code Playgroud)

看起来在均值周围画圈并不是捕获群集中所有点的最佳方法。但是,从视觉上可以验证一组中的点之间的最大距离为2。(只需尝试稍微移动一下圆圈以封装所有点)。