【问题标题】:Determine the center of the cluster with the most points确定点数最多的聚类中心
【发布时间】:2020-01-26 15:45:14
【问题描述】:

在使用 KMeans 对具有 GPS 位置的数据集执行聚类后,有没有办法确定具有最多点的聚类,即最大聚类,然后将其中一个中心与该特定聚类相关联?

假设我的代码是:

kmeans = KMeans(n_clusters=4)
kmeans.fit(points)

我知道我可以通过以下方式打印中心:

print(kmeans.cluster_centers_) -> e.g [[lat1, long1], [lat2, long2], ...]

并通过以下方式确定每个集群的点数:

print(Counter(kmeans.labels_)) -> e.g. Counter({0: 510, 1: 200, 2: 50, 3: 44})

我现在如何将最大的集群(具有 510 个点的集群)链接到正确的中心坐标?这在 Python 中可行吗?

【问题讨论】:

    标签: python cluster-analysis


    【解决方案1】:

    您可以在计数器值上使用 argmax 获得最大的集群标签,并链接到仅索引的中心。

    import numpy as np
    from sklearn.cluster import KMeans
    from collections import Counter
    
    points = np.random.normal(0, 3, size=(100, 2))
    
    kmeans = KMeans(n_clusters=4)
    kmeans.fit(points)
    
    counter = Counter(kmeans.labels_)
    largest_cluster_idx = np.argmax(counter.values())
    largest_cluster_center = kmeans.cluster_centers_[largest_cluster_idx ]
    

    【讨论】:

    • 谢谢。但这不是依赖于kmeans.labels_的顺序对应于kmeans.cluster_centers_的顺序吗?我不确定它们是否对应。例如,如果我们有: Counter({3: 30, 1: 28, 0: 23, 2: 19}) 这意味着第三个集群的点数最多,但您的代码会说索引为 0 并返回中心数组的第一个坐标。
    • 我只是不确定 cluster_centers_ 的顺序。数组元素的顺序以什么方式对应于簇?第一个元素是簇 0 的中心还是最大簇的中心?我找不到有关它的文档。
    【解决方案2】:

    标签中的索引0对应中心0,索引1对应中心1。

    其他一切都是疯狂的,不是吗?

    即使您会自动按大小对它们进行排序(这会破坏某些内容),您也需要更新标签,因为用户需要能够为每个点找到正确的中心。

    此外,它们按大小重新排序的理论很容易反驳:只需在不同的日子再运行几次,你就会发现反例。特别是,如果您使用reversed(cluster_centers_) 作为初始化,那么它应该在一次迭代内完成并以相反的顺序给出它们。

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 1970-01-01
      • 2013-02-28
      • 2013-07-17
      • 1970-01-01
      • 2012-10-26
      • 2018-07-02
      相关资源
      最近更新 更多