Методы кластеризации¶
Обзор¶
Кластеризация — это задача обучения без учителя, целью которой является группировка схожих объектов в кластеры так, чтобы объекты внутри одного кластера были более похожи друг на друга, чем на объекты из других кластеров.
K-Means (K-средних)¶
Принцип работы¶
- Инициализировать K центроидов случайным образом
- Назначить каждый объект ближайшему центроиду
- Пересчитать центроиды как среднее точек в кластере
- Повторять шаги 2-3 до сходимости
Формула¶
Минимизируется сумма квадратов расстояний:
J = Σᵢ Σⱼ ||xⱼ⁽ⁱ⁾ - μᵢ||²
Гиперпараметры¶
n_clusters: количество кластеров (K)init: метод инициализации ('k-means++', 'random')max_iter: максимальное количество итерацийn_init: количество запусков алгоритма
Выбор количества кластеров¶
- Метод локтя: поиск "излома" на графике inertia
- Silhouette score: оценка качества разделения
- Gap statistic: сравнение с равномерным распределением
Преимущества и недостатки¶
| Преимущества | Недостатки |
|---|---|
| Простота и скорость | Нужно задавать K |
| Масштабируемость | Чувствителен к выбросам |
| Сходимость гарантирована | Предполагает сферические кластеры |
| Чувствителен к инициализации |
Иерархическая кластеризация¶
Принцип работы¶
Строит древовидную структуру кластеров (дендрограмму).
Типы¶
- Агломеративная (bottom-up): каждый объект — отдельный кластер, затем объединяем
- Дивизивная (top-down): все объекты в одном кластере, затем разделяем
Методы связи (Linkage)¶
- Single: минимальное расстояние между кластерами
- Complete: максимальное расстояние
- Average: среднее расстояние
- Ward: минимизация дисперсии внутри кластеров
Преимущества и недостатки¶
| Преимущества | Недостатки |
|---|---|
| Не нужно задавать K | O(n³) сложность |
| Дендрограмма для визуализации | Не масштабируется |
| Любая форма кластеров | Чувствительна к шуму |
DBSCAN (Density-Based Spatial Clustering)¶
Принцип работы¶
Группирует точки, находящиеся в областях высокой плотности.
Термины¶
- Core point: точка с min_samples соседей в eps-окрестности
- Border point: имеет меньше соседей, но достижима из core point
- Noise point: выбросы, не принадлежащие ни одному кластеру
Гиперпараметры¶
eps: радиус окрестностиmin_samples: минимальное количество точек для core point
Преимущества и недостатки¶
| Преимущества | Недостатки |
|---|---|
| Не нужно задавать K | Чувствителен к параметрам |
| Находит кластеры любой формы | Плохо работает с разной плотностью |
| Устойчив к выбросам | Не подходит для данных высокой размерности |
| Определяет шум |
Сравнение методов¶
| Метод | Форма кластеров | Нужно ли K | Выбросы | Масштабируемость |
|---|---|---|---|---|
| K-Means | Сферические | Да | Нет | Высокая |
| Hierarchical | Любая | Нет | Нет | Низкая |
| DBSCAN | Любая | Нет | Да | Средняя |
Метрики оценки кластеризации¶
Внешние метрики (если известны истинные метки)¶
- Adjusted Rand Index (ARI)
- Normalized Mutual Information (NMI)
- Fowlkes-Mallows Index
Внутренние метрики (без истинных меток)¶
- Silhouette Coefficient: от -1 до 1, чем больше, тем лучше
- Calinski-Harabasz Index: отношение межкластерной дисперсии к внутрикластерной
- Davies-Bouldin Index: чем меньше, тем лучше
Пример кода¶
from sklearn.cluster import KMeans, AgglomerativeClustering, DBSCAN
from sklearn.metrics import silhouette_score, calinski_harabasz_score
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy as sch
# K-Means
kmeans = KMeans(n_clusters=3, init='k-means++', random_state=42)
kmeans_labels = kmeans.fit_predict(X)
kmeans_centers = kmeans.cluster_centers_
# Оценка качества
sil_score = silhouette_score(X, kmeans_labels)
ch_score = calinski_harabasz_score(X, kmeans_labels)
# Выбор оптимального K (метод локтя)
inertias = []
for k in range(1, 11):
km = KMeans(n_clusters=k, random_state=42)
km.fit(X)
inertias.append(km.inertia_)
plt.plot(range(1, 11), inertias, 'bo-')
plt.xlabel('Количество кластеров')
plt.ylabel('Inertia')
plt.title('Метод локтя')
plt.show()
# Иерархическая кластеризация
hc = AgglomerativeClustering(n_clusters=3, linkage='ward')
hc_labels = hc.fit_predict(X)
# Дендрограмма
dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))
plt.title('Дендрограмма')
plt.xlabel('Образцы')
plt.ylabel('Расстояние')
plt.show()
# DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan_labels = dbscan.fit_predict(X)
# -1 обозначает выбросы
Практические советы¶
- Стандартизируйте данные перед кластеризацией
- Начните с K-Means как базового метода
- Используйте силуэтный коэффициент для выбора K
- DBSCAN хорош для данных с выбросами и сложной формой
- Визуализируйте результаты с помощью PCA или t-SNE
- Проверьте устойчивость кластеризации на подвыборках
Применение¶
- Сегментация клиентов
- Группировка документов
- Обнаружение аномалий
- Сжатие изображений
- Биоинформатика