k-means
Кластеризация без учителя: центроиды притягивают точки, точки перетягивают центроиды.
1function kMeans(pts: Array<[x: number, y: number]>, k: number, iters: number) {2 let centroids = pts.slice(0, k) // первые k точек как старт3 4 for (let it = 0; it < iters; it++) {5 // 1. назначение: каждая точка к ближайшему центроиду6 const assign = pts.map((p) =>7 argmin(centroids, (c) => dist2(p, c)),8 )9 10 // 2. пересчёт: центроид = среднее своих точек11 centroids = range(k).map((c) => {12 const mine = pts.filter((_, i) => assign[i] === c)13 return avg(mine)14 })15 }16 17 return { centroids }18}Проблема
Кластеризация без учителя: центроиды притягивают точки, точки перетягивают центроиды.
Что вы видите
Каждая точка приписывается ближайшему центроиду; центроид = среднее своих точек; повторять до сходимости.
Как это работает
Минимизирует сумму квадратов расстояний до центроидов. Чувствителен к старту (k-means++ решает), k выбирается заранее. Рабочая лошадка кластеризации.
Пошаговый разбор
- 01
Назначение
Точка → ближайший центроид.
- 02
Пересчёт
Центроид = среднее.
- 03
Сходимость
Назначения стабильны.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Маркетинг
Сегментация клиентов.
Изображения
Квантование цветов (палитры).
Новости
Группировка тематик.
Связанные алгоритмы
«Разложить по кучкам без учителя: k-means»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.