假设我有一个数据集如下:
[{"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/