Ответ
Плюсы:
- Работа с невыпуклыми формами: В отличие от 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)