в Python, как найти сумму расстояния от точки до центроида в каждом кластере - PullRequest
0 голосов
/ 05 декабря 2018

в Matlab функция kmeans может дать сумму, которая является суммой внутрикластерных расстояний от точки до центроида в векторе 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)

Я изо всех сил пытаюсь выяснить, как я могу рассчитать среднее расстояние для каждого кластера.

любые предложения будут оценены

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы можете использовать 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])
0 голосов
/ 05 декабря 2018

Вы можете получить расстояние каждой строки до ближайшего кластера, используя:

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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...