DBSCAN
Кластеры по плотности: core-точки расширяются, шум честно помечается.
1function dbscan(2 pts: Array<[x: number, y: number]>,3 eps: number,4 minPts: number,5) {6 const labels = new Map<number, number>() // индекс → кластер | -1 = шум7 let cluster = 08 9 for (let i = 0; i < pts.length; i++) {10 if (labels.has(i)) continue11 const neighbors = pts12 .map((p, j) => ({ j, d: dist(pts[i]!, p) }))13 .filter((n) => n.d <= eps)14 15 if (neighbors.length < minPts) {16 labels.set(i, -1) // пока шум17 continue18 }19 20 labels.set(i, cluster) // core-точка: новый кластер21 const queue = neighbors.map((n) => n.j).filter((j) => j !== i)22 while (queue.length > 0) {23 const j = queue.shift()!24 if (labels.get(j) === -1) labels.set(j, cluster) // шум → border25 if (labels.has(j)) continue26 labels.set(j, cluster)27 const n2 = pts.map((p, k) => ({ k, d: dist(pts[j]!, p) })).filter((n) => n.d <= eps)28 if (n2.length >= minPts) queue.push(...n2.map((n) => n.k).filter((k) => !labels.has(k)))29 }30 cluster++31 }32 return labels33}Проблема
Кластеры по плотности: core-точки расширяются, шум честно помечается.
Что вы видите
ε-окрестности: ≥minPts соседей — core; связность core-ов = кластер.
Как это работает
Не задаёт k, находит кластеры произвольной формы и выбросы. Параметры ε и minPts; сильно зависит от масштаба признаков.
Пошаговый разбор
- 01
Core
≥minPts в ε.
- 02
Border
Достижим из core.
- 03
Noise
Ни то, ни другое.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Геоданные
Кластеры на картах.
Аномалии
Выбросы = фрод.
Сегментация
Нестандартные формы.
Связанные алгоритмы
«Кластеры без k и с шумом»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.