Главная
#Математика и ML #Clustering #Data Science

Что такое Иерархическая кластеризация в Data Science и когда дерево кластеров полезнее, чем KMeans в 2026 году?

Иерархическая кластеризация в Data Science нужна в тот момент, когда нам мало просто получить несколько меток групп, как это делает KMeans. Иногда важнее увидеть саму структуру близости между объектами: кто к кому ближе, какие маленькие группы сначала сливаются друг с другом, какие большие сегменты образуются позже и на каком уровне похожести вообще имеет смысл остановиться. То есть нас интересует не только финальное разбиение, но и путь, которым оно возникает. Именно здесь дерево кластеров становится полезнее, чем жесткое заранее заданное число групп.

Содержание
  1. Интуиция: не просто группы, а история того, как группы рождаются
  2. Почему дерево кластеров может быть полезнее, чем KMeans
  3. Что именно алгоритм делает шаг за шагом
  4. Linkage: как измерять расстояние между кластерами
  5. Дендрограмма: почему дерево здесь не просто картинка
  6. Геометрическая интерпретация: иерархия вместо центроидов
  7. Когда иерархическая кластеризация полезнее, чем KMeans
  8. Где у метода есть ограничения
  9. Как метод связан с машинным обучением и анализом данных
  10. Python: минимальный пример агломеративной кластеризации
  11. Что важно вынести из темы
  12. Kaggle notebook по теме:

Это очень важный сдвиг в мышлении. KMeans отвечает на вопрос: “как разбить точки на (K) групп?”. Иерархическая кластеризация задает другой вопрос: “если начать смотреть на данные как на систему вложенных похожестей, как будет расти дерево объединений?”. Поэтому она особенно хороша там, где аналитик еще не уверен, сколько вообще групп в данных и где сама структура вложенности может быть полезнее, чем одно плоское разбиение.

Задачи без учителя удобнее изучать через соседние методы. Поэтому после этой статьи особенно полезно посмотреть и как работает KMeans: на таком контрасте лучше видно, где заканчивается плоское разбиение на группы и начинается дерево последовательных объединений.

Интуиция: не просто группы, а история того, как группы рождаются

Представьте, что у вас есть объекты и матрица расстояний между ними. Вы не хотите сразу жестко сказать, что здесь ровно три или четыре кластера. Вам важнее увидеть, какие объекты сначала тянутся друг к другу, какие пары потом образуют более крупные объединения и какие большие ветви данных остаются далеко друг от друга до самого конца. Это и есть иерархический взгляд.

Если объяснить совсем просто, иерархическая кластеризация строит дерево. Внизу дерева все объекты стоят по отдельности. Затем алгоритм шаг за шагом объединяет самые близкие кластеры. Сначала это могут быть две отдельные точки. Потом — маленькие группы. Потом — более крупные поддеревья. В итоге наверху остается одно общее дерево. После этого аналитик уже сам решает, на какой высоте “разрезать” дерево и сколько кластеров ему реально нужно.

Именно эта возможность смотреть на данные на разных уровнях крупности делает метод очень сильным в исследовательском анализе, сегментации клиентов, анализе документов, биоинформатике и задачах, где вложенная структура сама по себе информативна.

Почему дерево кластеров может быть полезнее, чем KMeans

KMeans сразу заставляет нас выбрать число кластеров. Это удобно, но иногда слишком грубо. Иерархическая кластеризация не требует такого решения в самом начале. Она сначала строит полную структуру близостей, а уже потом позволяет выбрать уровень детализации. Поэтому она особенно полезна, когда данных много не по объему, а по смысловым уровням: сначала есть локальные микрогруппы, потом более крупные сегменты, потом надсегменты.

Еще один важный момент — геометрия. KMeans ориентируется на центроиды и любит примерно шарообразные кластеры. Иерархическая кластеризация гибче: итоговая форма кластеров зависит от выбранного способа измерения расстояния между кластерами. Поэтому она иногда лучше подхватывает структуру, которую centroid-based алгоритм упрощает слишком сильно. А если задача вообще строится вокруг плотных островов, шумовых точек и кластеров нестандартной формы, полезно отдельно сопоставить этот подход и с DBSCAN, у которого геометрическая интуиция устроена совсем по-другому.

Что именно алгоритм делает шаг за шагом

Есть две основные линии иерархической кластеризации: агломеративная и дивизивная. В практике чаще всего используют агломеративную. Она стартует с того, что каждый объект является отдельным кластером. Затем на каждом шаге находятся два ближайших кластера, и они сливаются. После этого пересчитываются расстояния между новыми и старыми кластерами, и процесс повторяется.

По сути это жадный алгоритм. Он каждый раз принимает локальное решение: слить самые близкие кластеры сейчас. Поэтому результат сильно зависит от того, как именно определяется расстояние между кластерами. И именно здесь появляется ключевое понятие linkage.

Linkage: как измерять расстояние между кластерами

Когда у нас уже не отдельные точки, а группы точек, возникает вопрос: как считать расстояние между двумя кластерами? И тут возможны разные ответы. Если брать минимальное расстояние между любыми двумя точками из разных кластеров, получаем single linkage. Если брать максимальное — complete linkage. Если брать среднее расстояние между всеми парами точек — average linkage. Если смотреть на рост внутрикластерной дисперсии, получаем Ward linkage.

Это не техническая мелочь, а смысловая настройка алгоритма. Single linkage хорошо цепляет вытянутые структуры, но может страдать от эффекта “цепочки”, когда кластеры слипаются через тонкий мостик точек. Complete linkage строит более компактные кластеры. Average linkage дает компромисс. Ward особенно популярен, когда хочется получать группы, похожие на плотные евклидовы облака.

Раздел математики: метрическая геометрия и кластерный анализ.

(d_{\text{single}}(A,B) = \min_{x \in A, y \in B} d(x,y))

Что означает каждый символ:

(A, B) — два кластера.

(x \in A, y \in B) — точки, принадлежащие этим кластерам.

(d(x,y)) — расстояние между двумя точками.

(\min) — берем самую близкую пару точек между кластерами.

Численный пример: если в кластере A лежат точки с координатами 1 и 2, а в кластере B — точки 6 и 9, то минимальное расстояние между кластерами равно (\min(|1-6|, |1-9|, |2-6|, |2-9|) = \min(5,8,4,7) = 4).

У single linkage кластеры могут соединяться довольно рано, если между ними есть хотя бы одна близкая пара. Это дает одну геометрию дерева. Если же использовать другой linkage, дерево получится иным. Поэтому в иерархической кластеризации выбор linkage — это почти как выбор самой философии объединения.

Дендрограмма: почему дерево здесь не просто картинка

Главный визуальный объект иерархической кластеризации — дендрограмма. Часто новички воспринимают ее как декоративную схему, но на самом деле это очень содержательный график. Высота узла в дендрограмме показывает, на каком уровне расстояния произошло слияние кластеров. Чем выше слияние, тем менее похожи были объединяющиеся группы.

Это дает аналитически полезную вещь: мы можем смотреть, где в дереве происходят большие скачки высоты. Часто именно в этих местах разумно “резать” дендрограмму и получать итоговые кластеры. В отличие от KMeans, где число групп задается заранее, здесь мы сначала видим всю структуру, а потом принимаем решение о числе кластеров более осмысленно.

Раздел математики: геометрия и анализ расстояний.

(d_{\text{avg}}(A,B) = \frac{1}{|A||B|}\sum_{x \in A}\sum_{y \in B} d(x,y))

Что означает каждый символ:

(d_{\text{avg}}(A,B)) — среднее расстояние между двумя кластерами.

(|A|, |B|) — число объектов в каждом кластере.

(\sum_{x \in A}\sum_{y \in B} d(x,y)) — сумма расстояний по всем парам точек из разных кластеров.

Численный пример: если в кластере A находятся точки 1 и 2, а в кластере B — точки 6 и 9, то среднее расстояние будет равно ((5 + 8 + 4 + 7)/(2 \cdot 2) = 24/4 = 6).

По сравнению с single linkage, average linkage уже чувствительнее к полной структуре кластера, а не только к одной ближайшей паре точек. Именно поэтому дендрограммы для разных linkage могут сильно отличаться.

Геометрическая интерпретация: иерархия вместо центроидов

Если KMeans мыслит через центры, то иерархическая кластеризация мыслит через последовательность слияний. Это значит, что геометрическая картина здесь другая. Мы не натягиваем на пространство несколько центроидов и не режем его на области Вороного. Мы постепенно склеиваем точки и группы, ориентируясь на расстояния между ними. В результате получаем не плоскую карту кластеров, а дерево близости.

Именно поэтому этот метод полезен, когда структура данных сама по себе многоуровневая. Например, сначала клиенты делятся на микро-сегменты, потом эти микро-сегменты собираются в более крупные типы поведения. Или документы сначала группируются по локальной тематике, а потом эти темы объединяются в более широкие рубрики. В таких случаях дерево кластеров несет больше информации, чем одно фиксированное разбиение.

Когда иерархическая кластеризация полезнее, чем KMeans

Она полезнее, когда число кластеров заранее неочевидно, когда нужно увидеть структуру вложенности, когда интересна дендрограмма как аналитический объект, когда хочется исследовать несколько уровней сегментации сразу. Она также бывает удобнее на умеренных по размеру выборках, где важна интерпретация структуры, а не только скорость.

Если задача звучит как “найти несколько плотных сегментов заранее известного числа”, KMeans может быть проще и быстрее. Если задача звучит как “понять, как объекты организуются в дерево похожести и на каких уровнях возникают осмысленные группы”, иерархический подход становится сильнее.

Где у метода есть ограничения

Главное ограничение — вычислительная цена. Иерархическая кластеризация особенно тяжела на больших выборках, потому что ей нужно работать с матрицей расстояний или с операциями, которые быстро растут по стоимости. Еще одна проблема — чувствительность к шуму и выбросам: одна странная точка может повлиять на структуру ранних или поздних слияний.

Кроме того, в отличие от KMeans, здесь нельзя “переиграть” локальное решение после слияния. Если два кластера объединились на каком-то шаге, дальше это уже необратимо. Поэтому ранние ошибки структуры могут тянуться вверх по дереву. Это одна из причин, почему выбор расстояния и linkage так важен. А для исследовательского анализа полезно иногда смотреть на ту же структуру ещё и через t-SNE: не как замену дендрограмме, а как дополнительную визуальную подсказку о том, где пространство само намекает на локальные группы.

Как метод связан с машинным обучением и анализом данных

Иерархическая кластеризация хороша не только как самостоятельный алгоритм, но и как инструмент exploratory analysis. Она помогает увидеть структуру эмбеддингов, сегментировать пользователей, группировать тексты, товары, биологические объекты, временные профили. Она особенно полезна там, где аналитик не хочет сразу принимать решение о числе групп, а хочет сначала увидеть саму форму данных.

В этом смысле метод очень образовательный. Он учит думать не только в терминах конечного ответа, но и в терминах структуры расстояний. А это уже более зрелый взгляд на unsupervised learning.

Python: минимальный пример агломеративной кластеризации

from sklearn.datasets import make_blobs  # Генерируем искусственные данные с несколькими облаками точек.
from sklearn.preprocessing import StandardScaler  # Подключаем масштабирование признаков.
from sklearn.cluster import AgglomerativeClustering  # Импортируем агломеративную иерархическую кластеризацию.
from sklearn.metrics import silhouette_score  # Берем silhouette score как диагностику качества разбиения.

X, _ = make_blobs(  # Создаем синтетические кластеры для демонстрации метода.
    n_samples=500,
    centers=4,
    cluster_std=1.1,
    random_state=42,
)  # Получаем набор точек без использования истинных меток в обучении.

scaler = StandardScaler()  # Создаем объект нормализации признаков.
X_scaled = scaler.fit_transform(X)  # Приводим пространство к сопоставимому масштабу.

model = AgglomerativeClustering(  # Создаем модель иерархической кластеризации.
    n_clusters=4,  # Задаем число кластеров, которое хотим получить после разреза дерева.
    metric="euclidean",  # Используем евклидово расстояние между объектами.
    linkage="ward",  # Выбираем Ward linkage для компактных кластеров.
)  # Получаем объект кластеризатора.

labels = model.fit_predict(X_scaled)  # Обучаем модель и получаем номер кластера для каждой точки.
silhouette = silhouette_score(X_scaled, labels)  # Считаем silhouette score для оценки разделимости кластеров.

print("Cluster labels for first 20 objects:")  # Готовим читаемый вывод меток.
print(labels[:20])  # Печатаем первые 20 результатов кластеризации.
print("Silhouette score:", round(silhouette, 4))  # Печатаем качество разбиения.

Этот пример полезен тем, что показывает базовую рабочую логику. Мы масштабируем пространство, выбираем расстояние и linkage, запускаем кластеризацию и оцениваем, насколько кластеры вообще разделимы. Для реальной практики этого уже достаточно, чтобы начать сравнивать разные linkage и смотреть, как меняется структура групп. А если хочется отдельно разобраться, когда такая численная оценка вообще осмысленна, полезно рядом держать и материал про silhouette score.

Что важно вынести из темы

Иерархическая кластеризация полезна тогда, когда нам важно не просто плоское разбиение данных, а сама структура вложенной близости между объектами. Она строит дерево кластеров, в котором видно, кто с кем объединяется и на каком уровне расстояний. Именно поэтому она часто полезнее KMeans в задачах, где число кластеров заранее неочевидно, а дендрограмма сама по себе несет аналитическую ценность.

Если сформулировать совсем коротко, KMeans ищет центры, а иерархическая кластеризация ищет историю объединений. Когда вам нужна именно структура дерева, а не только готовые номера групп, иерархический подход оказывается сильнее и содержательнее.

Kaggle notebook по теме:

https://www.kaggle.com/code/advikmaniar/beginners-guide-k-means-hierarchical-clustering

Что читать дальше

Связанные статьи по этой теме

Инструменты Python в 2026 году: современный стек для профессиональной разработки Что должен знать Junior Data Scientist в 2026 году? Как собрать GitHub-портфолио для Data Science
Вернуться в блог