Python - 带阈值的多维聚类

Python - multi-dimensional clustering with thresholds

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

[{"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 的所有属性和欧几里德距离都在指定阈值内,则这两个被认为是相似的并且是相关的 - 这个过程一直持续到最终所有 linked可以返回聚类,因为某些聚类将没有满足条件的点与另一个聚类中的任何点相似,从而导致聚类被分离。

最简单的方法是构建二进制 "connectivity" 矩阵。

如果您的条件完全满足,则让 a[i,j] 为 0,否则为 1。

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

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

把三个不同的阈值换成权重还是比较简单的,这样就可以得到一个连续的距离;甚至可能是 指标 。然后你可以使用数据索引,并尝试 OPTICS。