计算已知点组的密度
Calculating the density of known groups of points
我目前正在开展一个项目,分析 AD 算法和可视化之间的相互作用。我阅读了大量文献,并得出结论,为了满足我的需要,我想结合几个指标。我能够实现其中的大部分,但是,缺少这个:
假设我有一个 2D space 被属于 2 类 之一的点占据。我想计算每个组的密度。组的标签是已知的。在查看 Whosebug 等时,我读了很多关于 DBSCAN 的内容,但据我了解,DBSCAN 本身用于执行聚类。我已经有了簇,想知道它们的密度。
对于已知指标的任何建议或指导,我将不胜感激。
如果存在,也请与我分享所需的 python 库。
非常感谢。
这是我的数据的样子:
array([[-3.90611544e+00, -5.47953465e-01],
[-5.22999684e+00, 5.56145331e-01],
[-4.84611012e+00, 5.54304197e-02],
[-4.85019718e+00, -3.19791419e-01],
[-4.59453620e+00, 5.70821744e-01],
[-6.65068624e+00, -9.97229190e-01],
[-6.57787930e+00, -5.03538827e-01],
[-4.80275333e+00, -8.42197968e-02],
[-4.55720113e+00, 8.23122108e-01],
[-4.47469205e+00, -6.77669238e-01],
[-5.84095559e+00, -8.19564981e-01],
[-4.93963103e+00, -8.66167854e-01],
[-4.98336307e+00, -4.45923700e-02],
[-4.56953722e+00, -4.27976712e-01],
[-6.25553298e+00, 1.32863878e-01],
[-6.11860914e+00, -1.09009817e+00],
[-5.60347264e+00, 1.34600670e+00],
[-4.85974421e+00, -2.03600566e-01],
[-4.38049846e+00, 1.27302889e+00],
.......
情节是这样的:
cannot include pictures yet, see link
我现在想要分别获得红色和绿色簇的密度值。
非常感谢您!
更新:更正了我的代码。另请注意,此算法的复杂度为 O(n^2):对于 10240 个点,在快速机器上 运行 需要将近 1 分钟。
更新 2:Return 相反:count/total_distance
更新 3:
如果,正如你上面提到的,密度可视化是一个目标,我认为你提供的样本图本身就是对观察者密度的良好视觉表示。
更新 4:根据下面的评论,我消除了重复计算,现在算法的复杂度为 O(n^2/2),当然,运行s 快了一倍。
一个边际改进,尤其是在有多个集群的情况下,是用一种单一颜色的色调来绘制每个集群中的点,这种颜色根据集群的平均密度而变化,比如从浅蓝色到深蓝色。
正如 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
我目前正在开展一个项目,分析 AD 算法和可视化之间的相互作用。我阅读了大量文献,并得出结论,为了满足我的需要,我想结合几个指标。我能够实现其中的大部分,但是,缺少这个:
假设我有一个 2D space 被属于 2 类 之一的点占据。我想计算每个组的密度。组的标签是已知的。在查看 Whosebug 等时,我读了很多关于 DBSCAN 的内容,但据我了解,DBSCAN 本身用于执行聚类。我已经有了簇,想知道它们的密度。
对于已知指标的任何建议或指导,我将不胜感激。 如果存在,也请与我分享所需的 python 库。
非常感谢。
这是我的数据的样子:
array([[-3.90611544e+00, -5.47953465e-01],
[-5.22999684e+00, 5.56145331e-01],
[-4.84611012e+00, 5.54304197e-02],
[-4.85019718e+00, -3.19791419e-01],
[-4.59453620e+00, 5.70821744e-01],
[-6.65068624e+00, -9.97229190e-01],
[-6.57787930e+00, -5.03538827e-01],
[-4.80275333e+00, -8.42197968e-02],
[-4.55720113e+00, 8.23122108e-01],
[-4.47469205e+00, -6.77669238e-01],
[-5.84095559e+00, -8.19564981e-01],
[-4.93963103e+00, -8.66167854e-01],
[-4.98336307e+00, -4.45923700e-02],
[-4.56953722e+00, -4.27976712e-01],
[-6.25553298e+00, 1.32863878e-01],
[-6.11860914e+00, -1.09009817e+00],
[-5.60347264e+00, 1.34600670e+00],
[-4.85974421e+00, -2.03600566e-01],
[-4.38049846e+00, 1.27302889e+00],
.......
情节是这样的: cannot include pictures yet, see link
我现在想要分别获得红色和绿色簇的密度值。
非常感谢您!
更新:更正了我的代码。另请注意,此算法的复杂度为 O(n^2):对于 10240 个点,在快速机器上 运行 需要将近 1 分钟。
更新 2:Return 相反:count/total_distance
更新 3: 如果,正如你上面提到的,密度可视化是一个目标,我认为你提供的样本图本身就是对观察者密度的良好视觉表示。
更新 4:根据下面的评论,我消除了重复计算,现在算法的复杂度为 O(n^2/2),当然,运行s 快了一倍。
一个边际改进,尤其是在有多个集群的情况下,是用一种单一颜色的色调来绘制每个集群中的点,这种颜色根据集群的平均密度而变化,比如从浅蓝色到深蓝色。
正如 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