Python - 带阈值的多维聚类

标签 python cluster-analysis

假设我有一个数据集如下:

[{"x":20, "y":50, "attributeA":90, "attributeB":3849},
 {"x":34, "y":20, "attributeA":86, "attributeB":5000},
 etc.

除了这些属性之外,还可能有更多其他属性 - 这只是一个示例。我想知道的是,如何根据所有因素对这些点进行聚类,并控制给定点与给定变量的下一个点之间的最大间隔,以便将其视为链接。 (即欧氏距离必须在 10 点以内,attributeA 在 5 点以内,attributeB 在 1000 点以内)

关于如何在 python 中执行此操作有什么想法吗?正如我上面所暗示的,如果可能的话,我想应用欧几里得距离来比较两点之间的距离 - 而不仅仅是将 x 和 y 作为单独的属性进行比较。对于其余属性,这将是所有单维比较......如果这有意义的话。

<小时/>

编辑:只是为了增加一些清晰度,以防万一这没有意义,基本上我正在寻找一些算法来比较所有对象(或者一些更有效的方法),如果全部的话与对象 B 相比,对象 A 的属性和欧几里得距离在指定阈值内,则这两个被认为是相似且链接的 - 此过程一直持续到最终可以返回所有链接的聚类,因为某些聚类将没有满足条件的点与另一个簇中的任何点相似,导致簇被分离。

最佳答案

最简单的方法是构建一个二元“连接”矩阵。

如果满足条件,则将 a[i,j] 设为 0,否则设为 1。

然后在该矩阵上运行具有完全链接的层次凝聚聚类。如果您不需要每个集群中的每一对对象都满足您的阈值,那么您还可以使用其他链接。

这不是最好的解决方案 - 其他距离矩阵将需要 O(n²) 内存和时间,而聚类甚至需要 O(n³),但最容易实现。在 Python 代码中计算距离矩阵会非常慢,除非你可以避免所有循环并有例如numpy 完成大部分工作。为了提高可扩展性,您应该考虑 DBSCAN 和数据索引。

将三个不同的阈值替换为权重是相当简单的,这样就可以获得连续的距离;甚至可能是一个指标。然后您可以使用数据索引,并尝试 OPTICS。

关于Python - 带阈值的多维聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43030493/

相关文章:

python - 我怎样才能知道一个元素属于Python中的哪个自组织映射(SOM)簇?

machine-learning - 高斯簇是线性可分的吗?

python - 为什么我的文本聚类会这样做

r - 将NbClust()与不相似矩阵一起使用时,如何解决出现的错误?

Python 命令行脚本 : file/directory autocompletion on user input

python - 如何为多图布局调整 Matplotlib/Seaborn 子图之间的空间

python - 从系列创建一个 pd.Dataframe

python - 使用 OpenCV python 捕获 rtsp 相机

python - 考虑二维高斯模型中的噪声

python - 为什么 pip 在已经是最新版本时要求我升级?