Ответ
Оба алгоритма решают задачу кластеризации, но основаны на разных математических принципах.
K-Means
- Принцип: Жесткая (hard) кластеризация. Каждая точка данных принадлежит ровно одному кластеру (тому, чей центроид ближе).
- Геометрия: Минимизирует сумму квадратов расстояний до центроидов. Эффективно находит сферические кластеры примерно одинакового размера.
- Алгоритм: Итеративный (Expectation-Maximization в упрощенной форме). Быстрый и масштабируемый.
Gaussian Mixture Model (GMM)
- Принцип: Мягкая (soft) или вероятностная кластеризация. Каждая точка может принадлежать всем кластерам с разной вероятностью (responsibility).
- Геометрия: Предполагает, что данные порождены смесью нескольких гауссовых (нормальных) распределений. Может моделировать эллиптические кластеры разного размера и ориентации.
- Алгоритм: Полноценный EM-алгоритм. Медленнее K-Means, но более гибкий.
Сравнение на практике:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixture
# Создаем вытянутые (не сферические) кластеры
X = np.vstack([np.random.randn(100, 2) * [0.5, 3],
np.random.randn(100, 2) * [3, 0.5] + [5, 5]])
# K-Means
kmeans = KMeans(n_clusters=2, random_state=42).fit(X)
kmeans_labels = kmeans.predict(X) # Жесткие метки: 0 или 1
# GMM
gmm = GaussianMixture(n_components=2, random_state=42).fit(X)
gmm_probs = gmm.predict_proba(X) # Матрица вероятностей [N x 2]
gmm_labels = gmm.predict(X) # Жесткие метки (по максимальной вероятности)
Когда что выбрать:
- K-Means: Когда кластеры сферические и хорошо разделены, нужна скорость и интерпретируемость.
- GMM: Когда кластеры имеют сложную форму (вытянутые, эллиптические), нужна оценка неопределенности (вероятность принадлежности) или модель используется как плотностная оценка.