【问题标题】:With SciPy how do I get clustering for k=? with doing hierarchical clustering使用 SciPy 如何获得 k= 的聚类?进行层次聚类
【发布时间】:2013-07-11 02:50:57
【问题描述】:

所以我使用 fastcluster 和 SciPy 进行凝聚聚类。我可以做dendrogram 来获取聚类的树状图。我可以fcluster(Z, sqrt(D.max()), 'distance') 为我的数据获得一个非常好的聚类。如果我想手动检查树状图中说 k=3(簇)的区域,然后我想检查 k=6(簇)怎么办?如何在树状图的特定级别获得聚类?

我看到所有这些函数都有公差,但我不明白如何从公差转换为簇数。我可以使用简单的数据集手动构建聚类,方法是通过链接 (Z) 并逐步将聚类拼凑在一起,但这对于大型数据集并不实用。

【问题讨论】:

    标签: scipy hierarchical-clustering


    【解决方案1】:

    好的,让我提出一种方法。我不认为这是正确或最好的方式,但至少这是一个开始。

    1. 选择我们感兴趣的 k
    2. 请注意,链接 Z 有 N-1 个列表,其中 N 是数据点的数量。第 m 个列表条目将产生 N-m 个簇。因此,在 Z 中获取索引为 k = N-m-1 的列表。
    3. 获取该列表第三列的距离值
    4. 致电fcluster,将特定距离作为容差(或者可能是距离加上一些非常小的增量)。

    唯一的问题是存在平局,但如果您能检测到平局发生,这真的不是问题。

    【讨论】:

    【解决方案2】:

    如果您想在特定级别切割树,请使用:

    fl = fcluster(cl,numclust,criterion='maxclust')
    

    其中cl 是您的链接方法的输出,numclust 是您想要获得的集群数量。

    【讨论】:

    • 对 fcluster 的描述让我印象深刻的是“形成的平面簇不超过 t 个”。那么是否有你得到少于numclust 的情况,如果是这样,它们会是什么?我知道我的复杂方式不会比我想要的集群数量少。
    • @demongolem:即使您的算法返回的簇数也总是比您要求的要少,例如,您有 2 个数据点,而您要求 3 个簇。我已经广泛使用了fcluster,但我不知道例程在正常情况下返回较少集群的情况。
    • 没错,无论如何,没有足够的积分会阻止您的请求得到满足。我会接受它作为 SciPy 做生意的方式
    • 我怀疑这个答案有点令人困惑。 maxclust “在特定级别切割树”,以便我们最多拥有 t 个集群。它不会在特定高度切割树(并给出从该高度以下形成的任何簇)。为此,要使用的参数是“距离”
    【解决方案3】:

    层次聚类允许您放大和缩小以获得聚类的细粒度或粗粒度视图。因此,事先可能不清楚要切割哪个级别的树状图。一个简单的解决方案是获取每个级别的集群成员资格。也可以选择所需的簇数。

    import numpy as np
    from scipy import cluster
    np.random.seed(23)
    X = np.random.randn(20, 4)
    Z = cluster.hierarchy.ward(X)
    cutree_all = cluster.hierarchy.cut_tree(Z)
    cutree1 = cluster.hierarchy.cut_tree(Z, n_clusters=[5, 10])
    print("membership at all levels \n", cutree_all) 
    print("membership for 5 and 10 clusters \n", cutree1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 2019-06-14
      • 2012-03-10
      • 2019-04-27
      • 2021-07-02
      • 2020-12-18
      • 2016-08-26
      相关资源
      最近更新 更多