← Назад к вопросам

В чем разница между 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-MeansGMM
Назначение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-шаг: обновляем μ, Σ, π на основе вероятностей

Гибридный подход

Для лучших результатов:

  1. Сначала K-Means для быстрой инициализации
  2. Затем 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 → вероятности, гибкость, статистика
  • Выбирай в зависимости от задачи и требований к скорости
В чем разница между GMM и K-Means моделями? | PrepBro