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