← Назад к вопросам
В чем разница между GMM и K-Means моделями?
1.8 Middle🔥 102 комментариев
#Машинное обучение#Статистика и A/B тестирование
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
K-Means vs GMM: ключевые различия
Оба алгоритма кластеризуют данные, но совершенно по-разному.
Основные отличия
K-Means
- Жёсткое назначение: каждая точка принадлежит ОДНОМУ кластеру (либо 0, либо 1)
- Работает через расстояния: минимизирует сумму квадратов расстояний до центроидов
- Быстрый: O(nKi), где n=точки, K=кластеры, i=итерации
- Сферические кластеры: работает хорошо если кластеры примерно круглые и одинакового размера
from sklearn.cluster import KMeans
km = KMeans(n_clusters=3)
labels = km.fit_predict(X) # [0, 1, 2, 0, 1, ...]
# Каждой точке присваивается точно одна метка
GMM (Gaussian Mixture Model)
- Мягкое назначение: каждая точка имеет ВЕРОЯТНОСТЬ для каждого кластера
- Вероятностный подход: максимизирует логарифм правдоподобия (EM алгоритм)
- Медленнее: O(nK²i), но получаешь больше информации
- Гибкие кластеры: работает с эллиптическими кластерами разного размера
from sklearn.mixture import GaussianMixture
gmm = GaussianMixture(n_components=3)
labels = gmm.fit_predict(X) # [0, 1, 2, 0, 1, ...]
probs = gmm.predict_proba(X) # [[0.9, 0.05, 0.05], ...]
# Точка на 90% в кластере 0, на 5% в 1, на 5% в 2
Сравнительная таблица
| Характеристика | K-Means | GMM |
|---|---|---|
| Назначение | Hard (жёсткое) | Soft (мягкое) |
| Вероятности | Нет | Да |
| Форма кластеров | Сферическая | Эллиптическая |
| Размер кластеров | Одинаковый | Разный |
| Скорость | Быстро | Медленнее |
| Число кластеров | Выбираешь ты | BIC/AIC автоматически |
| Теория | Эвристический | Статистический (вероятностный) |
| Параметры | μ (центроиды) | μ, Σ (ковариация), π (веса) |
Почему GMM лучше для перекрывающихся кластеров
import numpy as np
from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixture
# Пример: два перекрывающихся кластера
X = np.vstack([
np.random.normal(0, 1, (100, 2)),
np.random.normal(1.5, 1, (100, 2)) # перекрывается с первым
])
# K-Means: жёсткие границы
km = KMeans(n_clusters=2)
km_labels = km.fit_predict(X) # Четкая граница между кластерами
# GMM: мягкие границы
gmm = GaussianMixture(n_components=2)
probs = gmm.predict_proba(X) # Вероятности!
# Точки в зоне перекрытия имеют вероятности типа [0.6, 0.4]
# K-Means же просто скажет [0] или [1]
Практическое применение
Используй K-Means если:
- Нужна быстрая кластеризация (миллионы точек)
- Кластеры примерно сферичные
- Нужны четкие метки без неуверенности
- Знаешь точное число кластеров
# Пример: сегментация пользователей
km = KMeans(n_clusters=5) # 5 сегментов
segments = km.fit_predict(customer_features)
Используй GMM если:
- Нужны вероятности и мера неуверенности
- Кластеры перекрываются или разных размеров
- Хочешь автоматически выбрать число кластеров
- Нужна статистическая интерпретация
# Пример: обнаружение аномалий
gmm = GaussianMixture(n_components=2) # нормальные vs аномалии
gmm.fit(X_train_normal)
# Для новых данных
log_prob = gmm.score(X_test) #低 значение = аномалия
if log_prob < threshold:
print("Аномалия!")
Выбор числа кластеров
K-Means → Elbow Method или Silhouette Score
from sklearn.metrics import silhouette_score
for k in range(2, 11):
km = KMeans(n_clusters=k)
score = silhouette_score(X, km.fit_predict(X))
# Выбираешь k с максимальным score
GMM → BIC (автоматически)
for k in range(2, 11):
gmm = GaussianMixture(n_components=k)
gmm.fit(X)
bic = gmm.bic(X) # Меньше = лучше
# k с минимальным BIC — оптимальный
Математика за кулисами
K-Means минимизирует:
J = Σ_i ||x_i - c_k||² (сумма квадратов расстояний)
GMM максимизирует (EM):
E-шаг: P(cluster_k | x_i) = π_k * N(x_i | μ_k, Σ_k) / Σ_j π_j * N(x_i | μ_j, Σ_j)
M-шаг: обновляем μ, Σ, π на основе вероятностей
Гибридный подход
Для лучших результатов:
- Сначала K-Means для быстрой инициализации
- Затем GMM для уточнения и получения вероятностей
km = KMeans(n_clusters=k, init=k-means++)
gmm = GaussianMixture(n_components=k,
means_init=km.cluster_centers_) # инит из K-Means
probs = gmm.fit(X).predict_proba(X)
Вывод
- K-Means → скорость, простота, четкие кластеры
- GMM → вероятности, гибкость, статистика
- Выбирай в зависимости от задачи и требований к скорости