【问题标题】:in Python how to find the sum of point-to-centroid distance in each cluster在Python中如何找到每个集群中点到质心距离的总和
【发布时间】:2019-05-06 14:00:24
【问题描述】:

在 Matlab 中,kmeans 函数可以给出 sumd,即 k×1 向量中点到质心距离的簇内总和。

[idx,C,sumd] = kmeans(___) 

我需要在 python 中执行此操作。

我发现 km.transform 返回 距离数组形成簇

array([[0.13894406, 2.90411146],
       [3.25560603, 0.21255051],
       [2.43748321, 0.60557231],
       [1.16330349, 4.20635901],
       [0.53391368, 2.50914184],
       [3.43498204, 0.39192652]])

如果我执行 km.predict,我会得到集群的标识

array([0, 1, 1, 0, 0, 1], dtype=int32)

我正在努力弄清楚如何计算每个集群的平均距离。

任何建议将不胜感激

【问题讨论】:

    标签: python numpy sklearn-pandas


    【解决方案1】:

    您可以使用以下方法获取每行到最近集群的距离:

    dist = np.array([[0.13894406, 2.90411146],
        [3.25560603, 0.21255051],
        [2.43748321, 0.60557231],
        [1.16330349, 4.20635901],
        [0.53391368, 2.50914184],
        [3.43498204, 0.39192652]])
    
    labels = np.array([0, 1, 1, 0, 0, 1])
    
    d_closest = dist[np.arange(len(dist)), labels]
    

    然后计算每簇的平均距离(你也可以在numpy中做这个以索引为标签的数组,我觉得字典更直观):

    avg_dist_map = {k: d_closest[labels==k].mean() for k in set(labels)}
    avg_dist_map
    # returns:
    {0: 0.6120537433333334, 1: 0.40334978000000005}
    

    【讨论】:

      【解决方案2】:

      你可以使用np.bincount:

      dists = np.array([[0.13894406, 2.90411146],
                        [3.25560603, 0.21255051],
                        [2.43748321, 0.60557231],
                        [1.16330349, 4.20635901],
                        [0.53391368, 2.50914184],
                        [3.43498204, 0.39192652]])
      ids = np.array([0, 1, 1, 0, 0, 1], dtype=np.int32)
      np.bincount(ids, dists[np.arange(len(dists)), ids]) / np.bincount(ids)
      # array([0.61205374, 0.40334978])
      

      【讨论】:

        猜你喜欢
        • 2017-04-11
        • 2019-06-11
        • 2015-11-06
        • 2021-09-23
        • 1970-01-01
        • 1970-01-01
        • 2018-10-03
        • 2011-06-04
        • 2013-05-04
        相关资源
        最近更新 更多