在Python中如何找到每个群集中点到质心距离的总和

时间:2018-12-05 03:44:51

标签: python numpy sklearn-pandas

在Matlab中,kmeans函数可以求和,即k-by-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)

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

任何建议将不胜感激

2 个答案:

答案 0 :(得分: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}

答案 1 :(得分:0)

您可以使用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])