1 回答
TA贡献1821条经验 获得超6个赞
更新:更正了我的代码。另请注意,此算法的复杂度为 O(n^2):对于 10240 个点,在快速机器上运行几乎需要 1 分钟。
更新 2:返回倒数:count/total_distance
更新 3:如果,正如您上面提到的,密度可视化是一个目标,我认为您提供的示例图本身就是对观察者的密度的良好视觉表示。
更新 4:根据下面的评论,我消除了重复计算,现在算法的复杂度为 O(n^2/2),而且运行速度自然是原来的两倍。
一个边际改进,尤其是在有多个集群的情况下,是用一种单一颜色的色调来绘制每个集群中的点,这种颜色根据集群的平均密度而变化,比如从浅蓝色到深蓝色。
正如DerekG指出的那样,您可以对上述方案使用其他密度度量。
另一个想法是通过计算每个点的邻居数量来计算每个点的局部密度,如果邻居的数量超过某个阈值,则通过用对比色(比如黑色)着色来在视觉上突出显示该点。
请注意,我在此答案中提供的代码示例可以轻松修改以实现上述任何方法,包括DerekG的方法
我不是聚类分析专家,但我会尽力提供帮助:
原始答案:
答案取决于密度的定义。如果将密度定义为集群中所有点对的平均距离,那么这段代码就是答案:
from math import sqrt
points = [
[1, 3],
[2, 4],
[9, 1],
[2, 6],
[5, 3],
]
def density(points):
total_distance = 0
count = 0
i = 0
for x1,y1 in points:
for x2,y2 in points[i+1:]:
count += 1
total_distance += sqrt((x1-x2)**2 + (y1-y2)**2)
i += 1
print(count)
return count/total_distance
print(density(points))
哪个打印:
0.2131384729384717
添加回答
举报