Какие плюсы и минусы у спектральной кластеризации?

«Какие плюсы и минусы у спектральной кластеризации?» — вопрос из категории Классическое ML, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Плюсы:

  • Работа с невыпуклыми формами: В отличие от k-means, который предполагает сферические кластеры, спектральная кластеризация может выявлять кластеры произвольной формы, анализируя спектр графа сходства.
  • Гибкость метрик: Использует матрицу сходства (аффинности), которую можно построить на основе различных метрик (евклидово расстояние, RBF-ядро, косинусная близость).
  • Теоретическая основа: Основана на теории графов и спектральной теории, что дает прочный математический фундамент.

Минусы:

  • Вычислительная сложность: Построение и разложение матрицы сходства имеет сложность O(n²) по памяти и O(n³) по времени для нахождения собственных векторов, что делает метод неприменимым для очень больших наборов данных без специальных оптимизаций.
  • Чувствительность к гиперпараметрам: Результаты сильно зависят от выбора функции аффинности (например, параметра гамма в RBF-ядре) и способа построения графа (k-ближайших соседей или ε-окрестность).
  • Неявное определение кластеров: Модель не предоставляет явной параметрической формы для кластеров, что затрудняет интерпретацию и прогнозирование для новых точек.

Пример на Python (scikit-learn):

import numpy as np
from sklearn.cluster import SpectralClustering
from sklearn.datasets import make_moons

# Создаем данные в форме "двух лун" — классический пример невыпуклых кластеров
X, _ = make_moons(n_samples=200, noise=0.05, random_state=42)

# Применяем спектральную кластеризацию
model = SpectralClustering(
    n_clusters=2,
    affinity='nearest_neighbors', # Строим граф на основе k ближайших соседей
    n_neighbors=10,
    assign_labels='kmeans' # Кластеризуем собственные векторы с помощью k-means
)
labels = model.fit_predict(X)
# labels теперь содержит назначенные метки кластеров (0 или 1)