Я пытаюсь реализовать 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]);
}
}
Заранее спасибо,