【发布时间】:2019-11-26 21:39:35
【问题描述】:
我正在尝试将纬度/经度坐标聚类到指定数量的密集创建的聚类中,但需要考虑线段边界 - 如果任意两个数据点之间的线段与指定线段列表相交(比如 4 条线段 - -> 由开始/结束纬度/经度标识)那么这些点不应该聚集在一起。因为这是地理空间数据,所以我希望围绕特定的“地理”进行聚类,这些地理空间无法从我目前使用的聚类算法中轻松解释。最初的想法是修改输入到聚类算法中的距离矩阵的上三角形,循环遍历三角形的每个条目,根据“边界”检查线段,如果找到交点,则将距离替换为较大的值.然而,这在计算上是非常困难的(或者至少是我设置的配置),而且我无法在合理的时间内操作数据。
为了表示比例,这些数据集可能包含 1,000-50,000 个纬度/经度对。
我试图通过利用 Python 中的“kneighbors_graph”来“结构化”数据,以开发基于 KNN 算法的连接矩阵,但它没有解决问题(k 值不同)。示例如下:@987654321 @ 这最终使用了一种凝聚聚类方法,该方法没有产生我希望的结果(集群仍然跨越不同的地理区域,并且集群大小不均匀 - 一个占数据集的大部分)。
在 RI 中尝试了上述线段方法来调整输入 k-means 算法的距离矩阵,但在大约一个小时的计算后停止了代码执行(并且上面的三角形几乎没有被处理!),这使得我认为这与我的实施有关。我将在下面粘贴我的方法(线段是从 csv 文件中读入的,作为带有 start_lat、start_long、end_lat、end_long 的数据框 - 因此调用“barrier[k,...]”)
就如何解决问题的一般思想或什至可以加快我提到的处理想法的特定代码实现而言,任何和所有帮助都将受到赞赏。我还研究了扫线算法,但无法找到一种有效的方法将其实现到整个脚本中。
#Load CSV of barrier line segments
barrier <- read.csv("LineSegments.csv")
#Create distance matrix from Lat/Long Dataframe
distMatrix <- as.matrix(dist(LatLongDf))
q <- nrow(distMatrix)
#Loop through upper triangle of matrix without diagonal
for (i in 1:(q-1)){
for (j in (i+1):q) {
#Grab row/column index of matrix (point IDs) and remap to original DF for point lat/longs
c1 <- c(LatLongDf[rownames(distMatrix)[i][1],LatLongDf[rownames(distMatrix)[i][2])
c2 <- c(LatLongDf[rownames(distMatrix)[j][1],LatLongDf[rownames(distMatrix)[j][2])
#Loop through inputted line segments
for (k in 1:nrow(barrier)) {
#Get point of intersection between two segments
dp <- line.line.intersection(c1,c2,c(barrier[k,2],barrier[k,3]),c(barrier[k,4],barrier[k,5]),interior.only = TRUE)
#If the lines do not intersect then set distance to max
if (is.na(dp[1])) {
distMatrix[i,j] <- max(distMatrix)
break
}
}
}
}
【问题讨论】:
-
这不是一个真正的编程问题。考虑将其迁移到 gis.stackexchange.com 以获取有关一般方法的建议
-
K-means 不使用距离矩阵作为输入!它需要欧几里得向量来计算均值!
标签: python r cluster-analysis