Как обрабатывать kmeans, когда в кластере нет элементов - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь реализовать KMeans на Java и столкнулся со случаем, который выбрасывает все мои результаты.Это происходит, когда при некоторых случайно выбранных инициализированных центроидах данные попадают в состояние, когда один из центроидов фактически не определяет кластер.Например, если K = 3, возможно, что 2 центроида расположены ближе ко всем точкам данных, и в этом случае во время этой итерации у меня будет только 2 кластера вместо 3.

.Однако, понимаем KMeans, когда мы сбрасываем центроиды, нам нужно суммировать все точки данных на кластер и разделить на размер кластера (чтобы получить среднее значение).Таким образом, это означает, что у нас будет кластер размером 0, и наш новый центроид будет иметь значение

[0/0, 0/0, ... 0/0]

. У меня есть 2 вопроса об обработке этого случая: (1) Как мы могли бы восстановиться после этого, еслимы потеряли один из наших кластеров?(2) Есть ли способ объяснить деление на 0?

У меня есть следующий код для этой логики:

// do the sums
for (int i = 0; i < numDocuments; i++) {
    int value = label[i]; // get the document's label (i.e. 0, 1, 2)
    for (int j = 0; j < numWords; j++) {
        tempCentroids[value][j] += data[i][j];
    }
    tally[value]++;
}

// get the average
for (int i = 0; i < k; i++) {
    for (int j = 0; j < numWords; j++) {
        tempCentroids[i][j] /= (double) tally[i]; // could have division by zero
        System.out.println("tally[i] for centroid " + k + " is " + tally[i]);
    }
}

Заранее спасибо,

1 Ответ

0 голосов
/ 19 октября 2018

«Например, если K = 3, возможно, что 2 центроида расположены ближе ко всем точкам данных, и в этом случае во время этой итерации у меня будет только 2 кластера вместо 3»

Я думаю, вы всегда можете сохранить выбранный центроид, чтобы третий кластер был в третьем кластере, а не в каком-то другом кластере.Таким образом, вы сохраняете количество кластеров и не сталкиваетесь со странным случаем, который вы упомянули.(Я предполагаю, что вы выбрали случайные центроиды в качестве фактических K точек данных из вашего набора данных)

Возможно, вы захотите взглянуть на алгоритм K-means ++, который аналогичен алгоритму Kmeans, за исключением инициализациишага кластер-центр.Это приведет к (возможно) лучшей классификации.

...