【问题标题】:Python - multi-dimensional clustering with thresholdsPython - 具有阈值的多维聚类
【发布时间】:2017-08-19 05:18:42
【问题描述】:

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

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

【问题讨论】:

    标签: python cluster-analysis


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢,这真的很有帮助。使用与权重有连续距离的 DBSCAN 的想法似乎很有趣 - 如果有一个属性(或多个属性)绝对必须相等(一个字符串属性在两个点上必须相同),它将如何工作点被认为是连接的),这将如何与权重想法一起使用?我假设最简单的方法是将我的点分成不同的组,用于每个不同的字符串属性……但如果有多个属性必须相等,那似乎就行不通了。
    • 你可以给出无限距离,或者使用广义 DBSCAN:Sander, Jörg, et al. “空间数据库中基于密度的聚类:GDBSCAN 算法及其应用。”数据挖掘和知识发现 2.2 (1998): 169-194。但是由于效率的原因,拆分数据是一个好主意,并且它确实适用于多个必须相同的属性。
    猜你喜欢
    • 2018-09-05
    • 2016-10-31
    • 1970-01-01
    • 2014-06-08
    • 2012-07-16
    • 2020-02-29
    • 1970-01-01
    • 2020-02-13
    • 2018-05-17
    相关资源
    最近更新 更多