在 Python 如何找到每个簇中点到质心距离的总和
in Python how to find the sum of point-to-centroid distance in each cluster
在 Matlab 中,kmeans 函数可以给出 sumd,它是 k×1 向量中点到质心距离的簇内总和。
[idx,C,sumd] = kmeans(___)
我需要在 python 中完成此操作。
我发现 km.transform returns
一组距离形成簇
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)
我正在努力弄清楚如何计算每个集群的平均距离。
如有任何建议,我们将不胜感激
您可以使用以下方法获取每行到最近集群的距离:
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}
您可以使用 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])
在 Matlab 中,kmeans 函数可以给出 sumd,它是 k×1 向量中点到质心距离的簇内总和。
[idx,C,sumd] = kmeans(___)
我需要在 python 中完成此操作。
我发现 km.transform returns 一组距离形成簇
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)
我正在努力弄清楚如何计算每个集群的平均距离。
如有任何建议,我们将不胜感激
您可以使用以下方法获取每行到最近集群的距离:
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}
您可以使用 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])