Высокоразмерные данные создают три проблемы: визуализация невозможна, алгоритмы машинного обучения страдают от проклятия размерности, а шум в признаках маскирует полезный сигнал. PCA, t-SNE и UMAP решают эти проблемы тремя разными способами. PCA находит линейные направления максимальной дисперсии через собственные векторы ковариационной матрицы. t-SNE строит вероятностное отображение, сохраняющее соседство точек, и использует t-распределение Стьюдента для борьбы со скученностью. UMAP конструирует топологический граф данных и оптимизирует его представление через бинарную кросс-энтропию, работая на порядок быстрее t-SNE и лучше сохраняя глобальную структуру. Выбор метода - это всегда компромисс между скоростью, интерпретируемостью и типом структуры, которую вы хотите извлечь из данных.
Эта статья даёт полный разбор механики каждого алгоритма. Вы получите критерии выбора под конкретную задачу, рекомендации по настройке параметров perplexity и n_neighbors, примеры кода на Python и чек-лист для самопроверки перед запуском снижения размерности. Материал построен так, чтобы закрыть главный вопрос: «Какой алгоритм брать для моих данных и как не сделать ложных выводов из визуализации».
Зачем снижать размерность: проблема проклятия размерности и три подхода к её решению
Проклятие размерности - это экспоненциальный рост объёма пространства при добавлении новых признаков. Точки данных становятся равноудалёнными друг от друга, метрики расстояния теряют смысл, а плотность выборки катастрофически падает. Для сохранения статистической значимости требуется экспоненциально больше данных на каждый новый признак. На практике это означает, что модель начинает переобучаться, а время обучения растёт нелинейно.
Снижение размерности решает три практические задачи. Первая - визуализация: данные с сотнями признаков нужно отобразить на плоскости для поиска кластеров, выбросов и паттернов. Вторая - борьба с шумом: признаки с низкой дисперсией часто не несут информации и только сбивают модель. Третья - ускорение обучения: меньше признаков - быстрее сходимость и ниже потребление памяти.
Три алгоритма, которые мы разбираем, представляют три философии решения проблемы. PCA - линейный метод, который ищет ортогональные направления максимальной дисперсии. Он быстр, детерминирован и интерпретируем, но не видит нелинейные многообразия. t-SNE - нелинейный вероятностный метод, оптимизированный под визуализацию. Он великолепно разделяет кластеры, но медленный и искажает глобальные расстояния. UMAP - топологический метод, который строит граф соседства и проецирует его в низкое пространство. Он быстрее t-SNE на порядок и лучше сохраняет глобальную структуру. Выбор между ними определяется свойствами данных и задачей: нужна ли вам линейная интерпретация, визуализация кластеров или баланс скорости и качества.
Перед применением любого из этих методов обязательно масштабируйте признаки. Стандартизация через StandardScaler приводит все переменные к единому масштабу, иначе признаки с большими абсолютными значениями доминируют в расчёте расстояний и дисперсий. Подробнее о подготовке данных и управлении ML-экспериментами читайте в руководстве по MLflow - там разобран полный цикл от логирования метрик до версионирования моделей.
PCA: линейная проекция через ковариационную матрицу
PCA строит новую систему координат, в которой оси - главные компоненты - упорядочены по убыванию объяснённой дисперсии. Первая компонента захватывает максимум вариативности данных, вторая - максимум из оставшегося при условии ортогональности первой, и так далее.
Алгоритм состоит из четырёх шагов. Шаг первый: центрирование - из каждого признака вычитается среднее значение, чтобы данные имели нулевое математическое ожидание. Шаг второй: вычисление ковариационной матрицы размером d×d, где d - число признаков. Элемент (i,j) этой матрицы показывает, как признак i изменяется совместно с признаком j. Шаг третий: нахождение собственных векторов и собственных значений ковариационной матрицы. Собственные векторы задают направления главных компонент, собственные значения - долю дисперсии вдоль этих направлений. Шаг четвёртый: проекция исходных данных на k собственных векторов с наибольшими собственными значениями.
На практике PCA часто применяют для сжатия изображений. Если взять датасет лиц и оставить 50 главных компонент из 4096 исходных признаков, восстановленное изображение сохранит узнаваемые черты при сжатии в 80 раз. Это работает, потому что пиксели лица коррелируют линейно: положение носа связано с положением глаз и рта. Ковариационная матрица улавливает эти линейные зависимости.
Главное ограничение PCA заложено в самом названии: principal components analysis ищет линейные комбинации. Данные, лежащие на нелинейном многообразии - например, точки на свёрнутой в спираль плоскости - PCA развернуть не сможет. Он спроецирует спираль в облако, потеряв структуру. Аналогично PCA не справляется с данными, где кластеры вложены друг в друга концентрическими окружностями.
Ещё один критический момент - масштабирование. Если один признак измеряется в миллиметрах (диапазон 0-100), а другой в километрах (0-0.1), PCA посчитает первый признак в тысячу раз важнее просто из-за численного масштаба, а не из-за реальной информативности. Всегда применяйте StandardScaler перед PCA.
Когда PCA работает хорошо, а когда - нет
PCA даёт отличные результаты на данных с линейной структурой. Сжатие изображений, анализ финансовых временных рядов, выделение главных факторов в опросниках - здесь линейные корреляции действительно описывают суть данных. В задаче снижения размерности эмбеддингов слов PCA часто используют как быстрый способ уменьшить размерность с 300 до 50-100 без катастрофической потери информации.
PCA проваливается на данных с явной нелинейной структурой. Классический пример - два концентрических кольца точек на плоскости. PCA найдёт направление максимальной дисперсии - это будет диаметр внешнего кольца, и спроецирует оба кольца в одну линию, полностью перемешав их. Никакая линейная проекция не разделит вложенные нелинейные структуры. Для таких данных нужны t-SNE или UMAP.
Отдельный случай - данные с разреженными признаками. Ковариационная матрица для них плохо обусловлена, собственные векторы становятся нестабильными. PCA на one-hot encoded категориальных переменных часто даёт бессмысленные компоненты. Здесь лучше использовать специализированные методы вроде Multiple Correspondence Analysis.
Практический критерий: если вы можете осмысленно интерпретировать линейную комбинацию признаков (например, «среднее арифметическое температуры и влажности»), PCA подходит. Если же связь между признаками принципиально нелинейна (пороговые эффекты, ветвления, циклы), переходите к нелинейным методам. Для более широкого контекста о том, как терпение и правильный выбор инструментов влияют на результат в ML-проектах, рекомендую разбор пяти уроков за 8 лет в ML.
t-SNE: вероятностный подход и борьба со скученностью
t-SNE отказывается от идеи линейной проекции. Вместо этого он определяет сходство точек через вероятности: в высокоразмерном пространстве точка x_j является соседом точки x_i с вероятностью p_{j|i}, пропорциональной гауссову ядру от расстояния между ними. Ширина гауссова распределения подбирается для каждой точки индивидуально так, чтобы эффективное число соседей равнялось заданному параметру perplexity. Точки в плотных областях получают узкое распределение, в разреженных - широкое. Это адаптивное масштабирование позволяет t-SNE одинаково хорошо обрабатывать регионы с разной плотностью.
Затем t-SNE строит симметричное распределение p_{ij} = (p_{j|i} + p_{i|j}) / 2n. В низкоразмерном пространстве сходство точек моделируется t-распределением Стьюдента с одной степенью свободы: q_{ij} пропорционально (1 + ||y_i - y_j||²)⁻¹. Выбор t-распределения вместо гауссова - ключевое решение. Тяжёлые хвосты t-распределения означают, что умеренно удалённые точки в низком пространстве отталкиваются слабее, чем при гауссовом распределении. Это решает проблему скученности: без тяжёлых хвостов все точки стянулись бы в центр карты, потому что в двумерном пространстве не хватает места для размещения всех попарных расстояний, характерных для высокоразмерного случая.
Функция потерь - KL-дивергенция между распределением p (высокое пространство) и q (низкое): KL(P||Q) = Σ p_{ij} log(p_{ij} / q_{ij}). Минимизация этой дивергенции градиентным спуском притягивает точки, бывшие соседями в исходном пространстве, и расталкивает те, что были далеки. Важный нюанс: KL-дивергенция асимметрична. Если p_{ij} велико, а q_{ij} мало - штраф большой (потеря соседства). Если p_{ij} мало, а q_{ij} велико - штраф маленький. Поэтому t-SNE хорошо сохраняет локальную структуру, но может произвольно размещать далёкие кластеры друг относительно друга.
Параметр perplexity: как выбрать и на что влияет
Perplexity задаёт эффективное число соседей, которое алгоритм учитывает для каждой точки. Математически perplexity = 2^{H(P_i)}, где H(P_i) - энтропия распределения соседства для точки i. Типичные значения лежат в диапазоне от 5 до 50, но решающее значение имеет размер датасета.
При малом perplexity (5-10) алгоритм фокусируется на ближайших соседях. Локальная структура проявляется детально: видны тонкие ответвления и микрокластеры. Плата - нестабильность глобальной картины: кластеры могут дробиться, а их взаимное расположение меняться от запуска к запуску. При большом perplexity (50-100) алгоритм учитывает более широкий контекст, глобальная структура стабильнее, но мелкие детали сглаживаются. На практике для датасетов до 1000 точек начинайте с perplexity 5-15, для 1000-10000 точек - 20-30, для 10000+ - 30-50. Правило: perplexity не должно превышать число точек, делённое на три.
Лучшая стратегия - запустить t-SNE с несколькими значениями perplexity (например, 10, 30, 50) и сравнить результаты. Если структура кластеров сохраняется при разных параметрах, вы нашли устойчивый паттерн. Если кластеры появляются и исчезают - это артефакт параметризации, а не свойство данных.
Интерпретация визуализаций t-SNE: что можно и нельзя увидеть
Первое и главное правило: расстояния между кластерами в t-SNE не несут информации. Два кластера на противоположных краях карты могут быть ближе друг к другу в исходном пространстве, чем два соседних кластера. KL-дивергенция не штрафует за произвольное размещение далёких точек, поэтому глобальная геометрия приносится в жертву локальной точности.
Размер кластеров тоже неинформативен. t-SNE стремится разместить все кластеры примерно одинакового размера на карте из-за эффекта нормализации. Кластер из 10 точек и кластер из 1000 точек могут выглядеть одинаково компактными. Плотность точек внутри кластера не отражает плотность в исходном пространстве - вспомните адаптивную ширину гауссова распределения.
Что можно интерпретировать: сам факт наличия кластеров и их относительное соседство на малом масштабе. Если две группы точек образуют отдельные сгустки, они действительно различаются в исходных признаках. Если точки двух классов перемешаны - алгоритм не нашёл разделяющей структуры. Для проверки устойчивости запускайте t-SNE несколько раз с разными random seed. Сходство карт при разных инициализациях подтверждает, что структура реальна.
Главный практический вывод: используйте t-SNE для генерации гипотез о структуре данных, но проверяйте эти гипотезы количественными методами - кластеризацией в исходном пространстве, расчётом силуэтных коэффициентов, сравнением с известными метками классов. Визуализация - это начало анализа, а не его итог. Если вы работаете с AI-агентами, которые генерируют код, и хотите понять структуру их решений, обратите внимание на CodeSlicer и построение графа влияния проекта - этот инструмент решает сходную проблему понимания структуры, но для кодовых баз.
UMAP: топологические графы и бинарная кросс-энтропия
UMAP строит нечёткое топологическое представление данных в два этапа. На первом этапе для каждой точки находится k ближайших соседей (параметр n_neighbors) и строится взвешенный ориентированный граф. Вес ребра между точками x_i и x_j вычисляется как exp(-(d(x_i, x_j) - ρ_i) / σ_i), где ρ_i - расстояние до ближайшего соседа точки i, а σ_i подбирается так, чтобы сумма весов исходящих рёбер равнялась log₂(k). Эта конструкция создаёт локальную метрику, адаптированную к плотности данных в окрестности каждой точки.
На втором этапе ориентированный граф превращается в неориентированный через операцию нечёткого объединения: вес ребра (i,j) в итоговом графе равен a + b - a·b, где a и b - веса в направленных рёбрах i→j и j→i. Полученный граф - это симплициальный комплекс, аппроксимирующий топологию многообразия, на котором лежат данные. UMAP предполагает, что данные равномерно распределены на римановом многообразии, и теорема Найквита-Шеннона позволяет восстановить это многообразие по конечной выборке.
Оптимизация низкоразмерного представления идёт через бинарную кросс-энтропию между двумя графами: высокоразмерным (топология данных) и низкоразмерным (встраивание). Функция потерь содержит два слагаемых: Σ_{(i,j)∈E} w_{ij} log(w_{ij} / q_{ij}) - притяжение связанных точек, и Σ_{(i,j)∉E} log(1 / (1 - q_{ij})) - отталкивание несвязанных. В отличие от t-SNE, UMAP не требует нормализации по всему датасету и использует стохастическую оптимизацию, что даёт радикальный выигрыш в скорости.
Ключевое отличие от t-SNE: бинарная кросс-энтропия симметрично штрафует за ошибки обоих типов - и за разрыв связанных точек, и за сближение несвязанных. Это позволяет UMAP лучше сохранять глобальную структуру: расстояния между удалёнными кластерами несут больше информации, чем в t-SNE.
n_neighbors и min_dist: баланс локального и глобального
n_neighbors - это аналог perplexity из t-SNE. Малое значение (5-15) заставляет UMAP фокусироваться на тонкой локальной структуре: алгоритм видит микрокластеры, ответвления, разреженные переходы между группами. Большое значение (50-200) смещает фокус на глобальную топологию: алгоритм видит крупные тренды, общую форму данных, но может сгладить мелкие детали.
min_dist контролирует минимальное расстояние между точками в низкоразмерном пространстве. Технически это параметр отталкивания: чем он меньше (0.0-0.1), тем плотнее упаковываются точки внутри кластеров. Чем больше (0.5-1.0), тем более разреженной становится визуализация, точки распределяются равномернее. min_dist не влияет на то, какие точки считаются соседями - только на итоговое размещение.
Практические рекомендации: для исследовательского анализа начинайте с n_neighbors=15, min_dist=0.1. Если визуализация выглядит слишком шумной и фрагментированной, увеличивайте n_neighbors до 30-50. Если кластеры слишком плотные и сливаются, увеличивайте min_dist до 0.3-0.5. Для данных с выраженной иерархической структурой попробуйте n_neighbors=50-100, чтобы увидеть глобальные связи между группами.
UMAP vs t-SNE: сравнение скорости и качества на реальных данных
На датасете MNIST (70 000 изображений 28×28) UMAP строит встраивание за 3-5 секунд на современном CPU, t-SNE - за 20-30 минут при использовании оптимизированной реализации Barnes-Hut. Ускорение в 200-400 раз достигается за счёт трёх факторов: отсутствия глобальной нормализации, стохастической оптимизации на подвыборках и эффективного представления графа через разреженные матрицы.
Качество встраивания на MNIST: UMAP формирует 10 чётко разделённых кластеров, причём похожие цифры (3-5-8, 4-7-9) располагаются рядом, отражая реальное сходство форм. t-SNE тоже разделяет классы, но расстояния между группами менее интерпретируемы: кластер цифры 1 может оказаться в центре карты, хотя в пространстве признаков он далёк от остальных.
На текстовых эмбеддингах (выборка из 100 000 документов, размерность 300) UMAP сохраняет глобальную тематическую структуру: кластеры «спорт» и «политика» располагаются на противоположных сторонах карты, а «спорт» и «фитнес» - рядом. t-SNE на тех же данных даёт более фрагментированную картину с множеством мелких субкластеров, но теряет макроструктуру.
Вывод для практики: если у вас больше 10 000 точек и важна глобальная структура - выбирайте UMAP. Если меньше 5 000 точек и нужна максимальная детализация локальных связей - t-SNE даст чуть более чёткое разделение близких кластеров ценой потери глобального контекста. Для оценки качества моделей, которые порождают анализируемые эмбеддинги, полезно понимать, как читать model card и проверять заявленные метрики - этой теме посвящён разбор evaluation awareness и расхождения safety-баллов.
Практическое руководство: какой алгоритм выбрать и как интерпретировать результат
Выбор алгоритма сводится к ответам на четыре вопроса. Первый: линейны ли ваши данные? Если признаки связаны линейными корреляциями и вам нужна интерпретируемость компонент - PCA. Если структура нелинейна - t-SNE или UMAP. Второй: что важнее - локальная или глобальная структура? Для детального разделения близких кластеров берите t-SNE. Для сохранения общей картины данных - UMAP. Третий: каков размер датасета? До 5 000 точек - t-SNE работает приемлемо. От 10 000 и выше - UMAP становится единственным практичным выбором среди нелинейных методов. Четвёртый: нужна ли воспроизводимость? PCA детерминирован, UMAP почти детерминирован при фиксированном random_state, t-SNE даёт вариативные результаты.
Предобработка едина для всех трёх методов: StandardScaler перед PCA обязателен, перед t-SNE и UMAP - настоятельно рекомендован. Евклидово расстояние, лежащее в основе всех трёх алгоритмов, чувствительно к масштабу признаков. Если признаки измеряются в разных единицах, масштабируйте.
Базовый код на Python для быстрого старта:
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import umap
# Масштабирование
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print(f"Объяснённая дисперсия: {pca.explained_variance_ratio_.sum():.2%}")
# t-SNE
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne = tsne.fit_transform(X_scaled)
# UMAP
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1, random_state=42)
X_umap = reducer.fit_transform(X_scaled)Таблица сравнения ключевых характеристик:
| Характеристика | PCA | t-SNE | UMAP |
|---|---|---|---|
| Тип данных | Линейные | Любые | Любые |
| Скорость (70k точек) | <1 сек | 20-30 мин | 3-5 сек |
| Глобальная структура | Сохраняет | Искажает | Сохраняет |
| Локальная структура | Средне | Отлично | Хорошо |
| Интерпретируемость | Высокая (нагрузки) | Низкая | Низкая |
| Детерминированность | Да | Нет | Почти да |
| Ключевой параметр | n_components | perplexity | n_neighbors, min_dist |
Чек-лист: 5 вопросов перед применением снижения размерности
- Данные линейны? Постройте матрицу корреляций. Если большинство пар признаков имеют значимые линейные корреляции - PCA. Если корреляции слабые, но кластеры видны на проекциях отдельных пар - t-SNE или UMAP.
- Нужна ли глобальная структура? Если расстояния между кластерами важны для выводов - UMAP или PCA. Если достаточно знать, что кластеры существуют и какие точки в них входят - t-SNE.
- Насколько велик датасет? До 5 000 точек - любой метод. 5 000-50 000 - PCA или UMAP. Свыше 50 000 - PCA или UMAP с уменьшением n_neighbors для ускорения. t-SNE на 100 000 точках может работать часы.
- Важна ли скорость? Для интерактивного анализа - PCA или UMAP. Для однократной публикационной визуализации - допустим t-SNE.
- Масштабированы ли признаки? Проверьте диапазоны значений. Если признаки имеют разный масштаб - StandardScaler обязателен. Для разреженных данных используйте MaxAbsScaler, сохраняющий нули.
Снижение размерности - это не самоцель, а инструмент для понимания данных. Каждый из трёх алгоритмов даёт свою проекцию реальности, и грамотный аналитик сопоставляет их, а не полагается на одну. Запустите PCA для быстрого взгляда, UMAP для общей картины и t-SNE для тонкой локальной структуры. Сравните результаты. Точки, которые стабильно группируются во всех трёх проекциях, образуют настоящие кластеры. Точки, мигрирующие между группами - пограничные случаи, заслуживающие отдельного внимания.