Python - 具有阈值的多维聚类

时间:2017-03-26 15:11:48

标签: 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的属性和欧几里德距离在指定的阈值内,那么这两个被认为是相似的并且被链接 - 这个过程一直持续到最终所有链接的集群都可以被返回,因为一些集群将没有满足条件的点与另一个集群中的任何点相似,导致集群被分离。

1 个答案:

答案 0 :(得分:2)

最简单的方法是构建二进制“连接”矩阵。

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

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

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

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