Вы, вероятно, часто будете разочарованы решением, которое прибегает к любому конкретному запуску «алгоритма k-средних» (то есть алгоритма Ллойда). Это потому, что алгоритм Ллойда часто застревает в плохих локальных минимумах.
К счастью, Ллойд - это всего лишь один из способов решения k-средств. И есть подход, который почти всегда находит лучшие локальные минимумы.
Хитрость заключается в обновлении кластерных присвоений точек данных по одному. Вы можете сделать это эффективно, сохранив подсчет количества очков n
, присвоенных каждому среднему значению. Так что вы можете повторно вычислить кластер значит m
после удаления точки x
следующим образом:
m_new = (n * m - x)/(n - 1)
И добавить x
кластера среднее m
с помощью:
m_new = (n * m + x)/(n + 1)
Конечно, потому что она не может быть векторизованный, немного больно работать в MATLAB, но не так уж плохо на других языках.
Если вы действительно заинтересованы в получении максимально возможных местных минимумов, и вы не возражаете против использования кластеризации на основе экземпляров, вы должны посмотреть на affinity propagation. Реализации MATLAB доступны на Frey lab affinity propagation page.
Я думаю, вы правы. Чтобы получить лучшую конвергенцию, я вместо этого изменил свой алгоритм, чтобы сделать несколько попыток с разными начальными центрами масс, а затем определить лучший из них, измерив дисперсию кластеров. Низкая средняя дисперсия в попытке равна компактным кластерам. Как это звучит? – Theodor
@ Теодор: Это один из возможных критериев. –