24 / 27 · Обучение без учителя
Понижение размерности
Описание многомерных данных несколькими координатами: метод главных компонент, выведенный и как максимизация дисперсии, и как минимизация ошибки восстановления и вычисляемый через SVD, доля объяснённой дисперсии и выбор числа компонент, отбеливание, вероятностный PCA, ядерный PCA и как читать карты t-SNE и UMAP, с автоэнкодерами как нелинейным обобщением.
Смеси распределений и EM-алгоритм · Ядра · Многомерное нормальное распределение · Линейная алгебра ↗
На этой странице 16
Смеси распределений из предыдущей заметки объясняли каждую точку дискретной латентной переменной — кластером, из которого она пришла. Многие данные лучше объясняются несколькими непрерывными. Изображение рукописной цифры состоит из 64 значений пикселей, но изображения меняются вдоль гораздо меньшего числа направлений: какая это цифра, её наклон, ширина, толщина штриха. Точки заполняют тонкую область в , близкую к подпространству или поверхности малой размерности. Найти эту область — значит получить координаты, которые сжимают данные, убирают шум, делают расстояния осмысленнее и позволяют посмотреть на данные в двух измерениях. Эта заметка выводит линейный ответ, метод главных компонент, с двух сторон, которые сходятся в одной задаче на собственные значения, даёт ему вероятностное прочтение как модели с латентными переменными, а затем переходит к нелинейным методам, которые сохраняют окрестности, а не дисперсию.
Обозначения. — точки данных, центрированные так, что , а — матрица со строками . — выборочная ковариационная матрица с собственными значениями и ортонормированными собственными векторами . — целевая размерность, — матрица с ортонормированными столбцами (), а — новые координаты . — сингулярное разложение с сингулярными числами .
Зачем понижать размерность#
Четыре причины, часто все сразу:
- Посмотреть. У графиков две оси. Отображение в две размерности — единственный способ увидеть все 64 признака набора данных на одной диаграмме рассеяния.
- Сжатие. Хранение координат вместо экономит память и ускоряет всё, что идёт дальше.
- Шумоподавление. Если сигнал живёт в нескольких направлениях, а шум распределён по всем, отбрасывание слабых направлений убирает в основном шум.
- Лучшие расстояния. В высокой размерности расстояния между точками концентрируются вокруг общего значения (сферический слой гауссианы), что вредит ближайшим соседям и методам кластеризации этого раздела. Расстояния в хорошо выбранном пространстве малой размерности информативнее.
PCA как максимизация дисперсии#
Спроецируем данные на одно направление — единичный вектор . Проекции имеют нулевое среднее, потому что данные центрированы, и дисперсию
Направление, вдоль которого точки остаются разнесёнными, сохраняет различия между ними, поэтому ищем направление наибольшей дисперсии: максимизируем при условии . У лагранжиана градиент , и он обращается в ноль, когда
Значит, должен быть собственным вектором , и тогда дисперсия равна : лучшее направление — собственный вектор с наибольшим собственным значением, , первая главная компонента (first principal component). Вторая компонента — направление наибольшей дисперсии, ортогональное первой. Записав любой единичный в собственном базисе, с , получаем ; при , которого требует ортогональность, максимум равен и достигается при . Продолжая, получаем, что старших собственных векторов — это главных компонент, а дисперсия данных вдоль в точности равна .
В заметке о многомерном нормальном распределении те же собственные векторы встречались как оси эллипса ковариации. Метод главных компонент (principal component analysis, PCA) — это та же геометрия, оценённая по данным: главные компоненты — оси эллипса, лучше всего описывающего облако, упорядоченные по длине.
PCA как минимизация ошибки восстановления#
Теперь зададим другой вопрос. Представим каждую точку числами и восстановим её как . При каком восстановленные точки ближе всего к данным? Поскольку — ортогональный проектор, остаток ортогонален , и по теореме Пифагора
Усредняя по точкам, получаем
Первое слагаемое — полная дисперсия, заданная данными; второе — дисперсия, сохранённая проекцией. Поэтому минимизация ошибки восстановления — та же задача, что максимизация сохранённой дисперсии, и решение у неё то же: , с минимальной ошибкой
суммой отброшенных собственных значений. (То, что старших собственных векторов максимизируют по всем ортонормированным , следует из того же рассуждения в собственном базисе, применённого к каждому столбцу, или из теоремы Ки Фаня.) Два вывода — это два исторических истока PCA: Pearson (1901) искал прямую и плоскость, ближе всего подходящие к точкам, Hotelling (1933) — компоненты наибольшей дисперсии.
Две стороны одной задачи: дисперсия и ошибка восстановления
Разобранный пример. Для ковариационной матрицы из курса теории вероятностей собственные значения равны и , а первый собственный вектор — . Первая компонента сохраняет дисперсии, а восстановление только по ней оставляет среднеквадратичную ошибку . Точка получает координату и восстановление ; квадрат длины остатка равен , и действительно .
Через SVD#
У любой матрицы есть сингулярное разложение (singular value decomposition, SVD) , где у и ортонормированные столбцы, а диагональна с ( — ранг). Тогда
— спектральное разложение: главные компоненты — правые сингулярные векторы , собственные значения равны , а координаты всех точек — . Есть две причины вычислять PCA именно так. Построение возводит в квадрат число обусловленности, поэтому малые собственные значения теряют точность, а SVD работает с напрямую. И для больших данных усечённое или рандомизированное SVD вычисляет только старших компонент, без полной матрицы .
SVD показывает и то, что PCA оптимален в более сильном смысле. По теореме Эккарта–Янга (Eckart–Young theorem; Eckart and Young, 1936) лучшее приближение матрицей ранга по норме Фробениуса — усечённое SVD с ошибкой . Восстановление PCA при — это в точности : никакое линейное описание данных ранга не лучше. Усечённое SVD матрицы счётчиков «слово–документ» — это латентно-семантический анализ, базовый метод из заметки о GloVe.
Объяснённая дисперсия и выбор k#
Доля дисперсии, сохраняемая первыми компонентами, — это доля объяснённой дисперсии (explained variance ratio)
а единица минус она — относительная ошибка восстановления. На 1797 изображениях цифр из scikit-learn, по 64 пикселя в каждом, первые две компоненты объясняют 14.9% и 13.6% дисперсии; 5 компонент объясняют половину, 21 — 90%, 29 — 95%. При 21 компоненте среднеквадратичная ошибка восстановления на изображение равна 116.3 — сумме 43 отброшенных собственных значений, как и предсказывает вывод выше.
Единого правила для нет. Распространённые варианты:
- Доля дисперсии, например 90% или 95%. Просто, но порог произволен.
- Излом на графике каменистой осыпи (scree plot), то есть собственных значений в порядке убывания: оставить компоненты до того места, где кривая выходит на «пол» из малых похожих собственных значений, — так выглядит изотропный шум.
- Последующая задача: выбрать по ошибке на валидации модели, которая использует компоненты.
- Правдоподобие вероятностного PCA (ниже), на отложенных данных или со штрафом вроде BIC.
Сколько компонент оставить
На рисунке первые два правила расходятся. У данных три направления сигнала и шум во всех десяти; график осыпи показывает три, но они объясняют только 89.9% дисперсии, поэтому правило «90%» оставляет четвёртую компоненту, которая является чистым шумом.
Стандартизация и отбеливание#
PCA зависит от единиц измерения признаков. Признак, измеренный в граммах, имеет в тысячу раз большее стандартное отклонение, чем тот же признак в килограммах, и доминирует в первой компоненте. Когда у признаков несвязанные единицы, каждый сначала стандартизуют к единичной дисперсии; тогда PCA работает с корреляционной матрицей вместо ковариационной. Когда единица общая, как у пикселей, обычно подходит исходная ковариационная матрица.
Отбеливание (whitening) идёт на шаг дальше и масштабирует каждую компоненту к единичной дисперсии:
Новые координаты некоррелированы и имеют единичную дисперсию, , — выборочный вариант отбеливающего преобразования из заметки о многомерном нормальном распределении. Отбеливание помогает методам, которые предполагают сравнимые некоррелированные входы, например анализу независимых компонент или методам, основанным на расстояниях. Его риск — деление на : направления с крошечными собственными значениями, часто чистый шум, усиливаются до масштаба сигнала, поэтому отбеливание сочетают с усечением до компонент или с добавлением небольшой константы к каждому .
Вероятностный PCA#
PCA в описанном виде — проекция, а не модель: он не приписывает точке вероятности. Вероятностный PCA (probabilistic PCA; Tipping and Bishop, 1999) — непрерывный аналог гауссовской смеси. Латентный вектор линейно отображается в пространство данных и размывается изотропным шумом, с ; по правилу для аффинных отображений — гауссиана, ковариация которой — «ранг плюс шум». Её решение методом максимального правдоподобия — замаскированный PCA: столбцы порождают подпространство старших собственных векторов, для любого поворота , а дисперсия шума равна среднему отброшенных собственных значений, (Bishop, 2006, раздел 12.2.1). На рисунке с графиком осыпи это среднее равно , истинной дисперсии шума; для цифр при оно равно . Апостериорное среднее латентного вектора равно . Это не вектор главных координат : в лежат масштабированные и повёрнутые нагрузки, а не ортонормированные собственные векторы, и при среднее стремится к — главным координатам, делённым на свои стандартные отклонения и повёрнутым на . Проекцией PCA становится восстановление в пространстве данных, . Модель можно обучать и EM-алгоритмом, который обходится без ковариационной матрицы и справляется с пропущенными значениями, а поскольку это плотность, она даёт правдоподобие для выбора и оценку необычности точек — отправную точку следующей заметки.
Ядерный PCA#
PCA находит только линейную структуру. У двух концентрических окружностей нет направления большой дисперсии, которое бы их разделяло: любая проекция на прямую смешивает кольца. Ядерный PCA (kernel PCA; Schölkopf, Smola and Müller, 1998) выполняет PCA в пространстве признаков , доступном через ядро , как в заметке о ядрах. Главные направления в пространстве признаков — комбинации отображённых точек, , и задача на собственные значения превращается в задачу для матрицы ядра , , центрированной в пространстве признаков:
где — матрица , все элементы которой равны , а нормирован так, чтобы направление имело единичную длину, . Координата точки на компоненте равна и вычисляется только через ядра. При пространство признаков содержит , и , поэтому квадрат радиуса , разделяющий окружности, там линейная функция. В разделе «Код» логистическая регрессия на двух обычных главных компонентах окружностей даёт точность на обучающих данных 0.502 — уровень случайного угадывания, а на трёх ядерных компонентах — 1.0. Обе модели обучаются и оцениваются на одних и тех же 400 точках, поэтому числа показывают, что каждое представление может выразить линейно, а не качество на тесте. Только третья ядерная компонента разделяет кольца сама по себе: ядерный PCA упорядочивает направления по дисперсии в пространстве признаков, а не по полезности. Цена — задача на собственные значения размера , а у компонент нет простой интерпретации во входном пространстве.
t-SNE и UMAP: окрестности вместо дисперсии#
Для визуализации сохранение больших расстояний — часто неверная цель. Двумерная линейная проекция цифр сохраняет направления наибольшего разброса, и десять классов цифр сильно перекрываются. t-SNE (van der Maaten and Hinton, 2008) требует другого: точки, близкие в данных, должны остаться близкими на плоскости.
- Превратить расстояния в данных в вероятности соседства. Для каждой точки положим с нормировкой по , где каждая ширина подбирается так, чтобы у распределения была заданная перплексия (perplexity), , — примерно число соседей, которые учитываются; типичные значения от 5 до 50. Симметризовать: .
- Определить такие же вероятности для точек на плоскости, с ядром -распределения Стьюдента (Student-t) с тяжёлыми хвостами: с нормировкой по всем парам.
- Двигать градиентным спуском, минимизируя .
Что сохраняется, решает асимметрия KL-дивергенции. Пара с большим , настоящие соседи, поставленная далеко (малое ), стоит дорого; пара с малым , поставленная близко, стоит дёшево. t-SNE сохраняет окрестности и свободно обращается со всем остальным. Тяжёлый хвост отвечает на проблему скученности (crowding problem): у точки в 64 измерениях может быть много равноудалённых соседей, у точки на плоскости — нет, и ядро позволяет отодвинуть умеренно далёкие точки далеко, а не сваливать их в середину. В разделе «Код» 58.4% из 10 ближайших соседей каждого изображения цифры в 64 измерениях входят в число его 10 ближайших соседей на карте t-SNE, против 11.8% в двумерной проекции PCA.
UMAP (McInnes, Healy and Melville, 2018) следует тому же плану с другими решениями: взвешенный граф ближайших соседей в данных, похожий граф на плоскости и кросс-энтропия между весами их рёбер, оптимизируемая стохастическим градиентным спуском. Он гораздо быстрее, масштабируется на миллионы точек и умеет вкладывать новые точки, и часто говорят, что он лучше сохраняет глобальную структуру; правила чтения ниже относятся и к нему.
Как читать такие карты (Wattenberg, Viégas and Johnson, 2016):
- Гиперпараметры действительно важны. Перплексия (у UMAP — число соседей) меняет картину; стоит посмотреть на несколько значений.
- Размеры кластеров ничего не значат. t-SNE расширяет плотные кластеры и сжимает разреженные, поэтому площадь кластера ничего не говорит о его разбросе в данных.
- Расстояния между кластерами могут ничего не значить. Два кластера, далёкие на карте, могут быть близки в данных, и наоборот.
- Случайный шум может выглядеть кластеризованным, особенно при малой перплексии.
- Для форм и топологии одного графика мало. Кольцо или линия на карте может быть артефактом одного запуска.
Надёжно карта показывает, какие точки — соседи. Она для того, чтобы смотреть, а не измерять: у её осей нет смысла, в обычном t-SNE нет отображения для новых точек, а её координаты — плохие признаки для модели. Заметка об автоэнкодерах читает графики t-SNE выученных кодов именно с этими оговорками, а заметка о векторных представлениях слов сравнивает проекции PCA и t-SNE векторов слов.
Автоэнкодеры: нелинейный PCA#
PCA — лучшая линейная пара «энкодер–декодер»: , , обученная минимизировать квадратичную ошибку восстановления. Обучение линейной сети с узким местом (bottleneck) из нейронов на той же функции потерь градиентным спуском приходит к тому же подпространству: её минимум порождает главное подпространство, и других локальных минимумов у неё нет, только седловые точки (Baldi and Hornik, 1989). Замена двух линейных отображений нейросетями, энкодером и декодером , даёт автоэнкодер (autoencoder), который может следовать изогнутой поверхности, а не плоскому подпространству. Заметка об автоэнкодерах курса генеративных моделей строит на этой идее свёрточные автоэнкодеры для изображений, а вероятностная версия, в которой энкодер — приближённое апостериорное распределение, — это вариационный автоэнкодер, вероятностный PCA, ставший нелинейным.
Что изменилось#
| PCA | Вероятностный PCA | Ядерный PCA | t-SNE / UMAP | Автоэнкодер | |
|---|---|---|---|---|---|
| Отображение | линейное, | линейное, с плотностью | линейное в пространстве признаков | нет: оптимизируются положения | нейросетевые энкодер и декодер |
| Сохраняет | дисперсию, большие расстояния | то же, плюс правдоподобие | дисперсию в пространстве признаков | окрестности | то, что нужно для восстановления |
| Новые точки | проекция | проекция | ядра с обучающей выборкой | нет в обычном t-SNE | кодирование |
| Решение | SVD, точное | замкнутый вид или EM | задача на собственные значения | невыпуклое, случайное | невыпуклое, градиентный спуск |
| Применение | сжатие, шумоподавление, признаки | то же, плотность, пропущенные данные | нелинейные признаки | только визуализация | представления, генерация |
Ограничения#
- Линейность и ориентация на дисперсию. PCA сохраняет направления наибольшей дисперсии, а они не обязаны быть важными для задачи; направление с малой дисперсией может нести всю информацию о классе.
- Чувствительность к масштабу и выбросам. Единицы измерения определяют компоненты, и одна далёкая точка может забрать себе компоненту; для этого существуют робастные варианты PCA.
- Компоненты трудно интерпретировать. Каждая — смесь всех признаков, а знаки определены лишь с точностью до .
- Нелинейные карты — чтобы смотреть. t-SNE и UMAP искажают размеры и расстояния, зависят от гиперпараметров и начальных значений генератора а обычный t-SNE не даёт функции для новых точек. У UMAP она есть (
transformв библиотеке umap-learn), но новые положения наследуют те же искажения; конвейер, который передаёт вложение модели, должен обучать его только на обучающей части. - Внутренняя размерность — выбор при моделировании. Каждое правило для закладывает предположение о том, что сигнал, а что шум.
Что нужно запомнить#
- PCA проецирует центрированные данные на старшие собственные векторы ковариационной матрицы ; дисперсия вдоль равна .
- Максимизация сохранённой дисперсии и минимизация квадратичной ошибки восстановления — одна задача, поскольку ; минимальная ошибка равна .
- PCA вычисляют через SVD : компоненты , собственные значения , координаты ; по теореме Эккарта–Янга никакое приближение ранга не лучше.
- выбирают по объяснённой дисперсии, излому графика осыпи, последующей задаче или правдоподобию; правила могут расходиться.
- Признаки с разными единицами измерения нужно стандартизовать; отбеливание масштабирует компоненты к единичной дисперсии и усиливает шумовые направления.
- У вероятностного PCA, , решение методом максимального правдоподобия — PCA, а — среднее отброшенных собственных значений.
- Ядерный PCA — это PCA центрированной матрицы ядра: нелинейные компоненты ценой задачи на собственные значения размера .
- t-SNE и UMAP сохраняют окрестности; размеры кластеров и промежутки между ними на их картах несут мало информации.
- Линейный автоэнкодер выучивает подпространство PCA; нелинейный его обобщает.
Код#
PCA через SVD, объяснённая дисперсия и ошибка восстановления на цифрах, вероятностный PCA, отбеливание, ядерный PCA и окрестности на картах PCA и t-SNE:
import numpy as np
from sklearn.datasets import load_digits, make_circles
from sklearn.decomposition import PCA, KernelPCA
from sklearn.manifold import TSNE
from sklearn.neighbors import NearestNeighbors
from sklearn.linear_model import LogisticRegression
# распределение: собственные значения ковариационной матрицы и доля первой компоненты
S = np.array([[2.0, 1.2], [1.2, 1.0]])
lam = np.linalg.eigvalsh(S)[::-1]
print(lam.round(3), round(lam[0] / lam.sum(), 3)) # [2.8 0.2] 0.933
# PCA выборки через SVD центрированной матрицы данных: то же, что собственные векторы ковариационной матрицы
rng = np.random.default_rng(0)
X = rng.multivariate_normal([0, 0], S, size=2000)
Xc = X - X.mean(axis=0)
U, s, Vt = np.linalg.svd(Xc, full_matrices=False)
ev = np.linalg.eigvalsh(Xc.T @ Xc / len(X))[::-1]
print((s ** 2 / len(X)).round(3), ev.round(3), np.abs(Vt[0]).round(3)) # [2.812 0.198] [2.812 0.198] [0.826 0.563]
# цифры: 1797 изображений 8 x 8 пикселей; доля первых двух компонент, число компонент для 50%, 90%, 95%
D = load_digits().data
p = PCA().fit(D)
cum = np.cumsum(p.explained_variance_ratio_)
print(p.explained_variance_ratio_[:2].round(3), [int(np.searchsorted(cum, q) + 1) for q in (0.5, 0.9, 0.95)])
# [0.149 0.136] [5, 21, 29]
# ошибка восстановления по k компонентам = сумма отброшенных собственных значений (на изображение, ковариация с 1/n)
for k in (2, 10, 21):
pk = PCA(k).fit(D)
err = ((D - pk.inverse_transform(pk.transform(D))) ** 2).sum(axis=1).mean()
lam_n = p.explained_variance_ * (len(D) - 1) / len(D)
print(k, round(err, 1), round(lam_n[k:].sum(), 1), round(cum[k - 1], 3))
# 2 858.9 858.9 0.285 | 10 314.5 314.5 0.738 | 21 116.3 116.3 0.903
# вероятностный PCA: дисперсия шума — среднее отброшенных собственных значений
p10 = PCA(10).fit(D)
print(round(p10.noise_variance_, 3), round(p.explained_variance_[10:].mean(), 3)) # 5.828 5.828
# отбеливание: у масштабированных координат единичная ковариационная матрица
Z = PCA(10, whiten=True).fit_transform(D)
print(np.allclose(np.cov(Z.T), np.eye(10))) # True
# ядерный PCA на двух концентрических окружностях: точность линейного классификатора на компонентах на обучающих данных
Xr, yr = make_circles(n_samples=400, factor=0.4, noise=0.05, random_state=0)
acc = lambda z: round(LogisticRegression().fit(z, yr).score(z, yr), 3)
z_lin = PCA(2).fit_transform(Xr)
z_ker = KernelPCA(3, kernel='poly', degree=2, gamma=1, coef0=0).fit_transform(Xr) # k(x, y) = (x . y)^2
print(acc(z_lin), acc(z_ker), [acc(z_ker[:, [j]]) for j in range(3)]) # 0.502 1.0 [0.53, 0.535, 1.0]
# окрестности: доля 10 ближайших соседей каждого изображения в 64-D, оставшихся среди 10 ближайших в 2-D
def kept(A, B, k=10):
ia = NearestNeighbors(n_neighbors=k + 1).fit(A).kneighbors(A, return_distance=False)[:, 1:]
ib = NearestNeighbors(n_neighbors=k + 1).fit(B).kneighbors(B, return_distance=False)[:, 1:]
return np.mean([len(set(a) & set(b)) / k for a, b in zip(ia, ib)])
for name, E in (('pca', PCA(2).fit_transform(D)), ('t-sne', TSNE(2, perplexity=30, random_state=0).fit_transform(D))):
print(name, round(kept(D, E), 3)) # pca 0.118 | t-sne 0.584
Дальше#
Вероятностный PCA и гауссовская смесь — плотности: они говорят не только, где находятся данные, но и насколько вероятна каждая точка. Точка, которую модель считает очень маловероятной или которая лежит далеко от подпространства, где живут данные, необычна. Следующая заметка превращает это наблюдение в методы поиска аномалий: оценки по плотности, расстояния до соседей, случайные деревья, которые быстро изолируют странные точки, и одноклассовые машины опорных векторов, — и разбирает, как оценивать детектор, когда аномалии редки.
Литература#
- K. Pearson. On lines and planes of closest fit to systems of points in space. The London, Edinburgh, and Dublin Philosophical Magazine and Journal of Science, 2(11), 559–572, 1901.
- H. Hotelling. Analysis of a complex of statistical variables into principal components. Journal of Educational Psychology, 24(6), 417–441, 1933.
- C. Eckart, G. Young. The approximation of one matrix by another of lower rank. Psychometrika, 1(3), 211–218, 1936.
- M. E. Tipping, C. M. Bishop. Probabilistic Principal Component Analysis. Journal of the Royal Statistical Society B, 61(3), 611–622, 1999.
- B. Schölkopf, A. Smola, K.-R. Müller. Nonlinear Component Analysis as a Kernel Eigenvalue Problem. Neural Computation, 10(5), 1299–1319, 1998.
- L. van der Maaten, G. Hinton. Visualizing Data using t-SNE. JMLR, 9, 2579–2605, 2008.
- L. McInnes, J. Healy, J. Melville. UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction. arXiv:1802.03426, 2018.
- M. Wattenberg, F. Viégas, I. Johnson. How to Use t-SNE Effectively. Distill, 2016.
- P. Baldi, K. Hornik. Neural networks and principal component analysis: Learning from examples without local minima. Neural Networks, 2(1), 53–58, 1989.
- C. M. Bishop. Pattern Recognition and Machine Learning. Springer, 2006. Раздел 12.1 (PCA, обе постановки), раздел 12.2 (вероятностный PCA; 12.2.1 — решение методом максимального правдоподобия), раздел 12.3 (ядерный PCA).
- M. P. Deisenroth, A. A. Faisal, C. S. Ong. Mathematics for Machine Learning. Cambridge University Press, 2020. Глава 10 (понижение размерности методом PCA), раздел 4.5 (SVD), раздел 4.6 (приближение матриц).
- E. Sokolov et al. Машинное обучение (HSE): конспекты лекций, лекция 12: обучение без учителя (2021); задачи по PCA (2025).