4.10 Снижение размерности и латентные факторы

Многие задачи машинного обучения сталкиваются с данными высокой размерности: тексты, изображения, временные ряды, графы. Однако полезная информация в таких данных зачастую лежит в значительно меньшем пространстве.

Это связано с наличием скрытых, или латентных, факторов, которые определяют структуру данных. Методы снижения размерности позволяют выявить эти скрытые зависимости, избавиться от шума и упростить анализ.

В этом параграфе мы рассмотрим:

  • Как метод главных компонент извлекает главные направления изменчивости через SVD-разложение.
  • Как латентно-семантический анализ и NMF извлекают тематики и скрытые факторы.
  • Как матричная факторизация используется в рекомендательных системах для восстановления предпочтений.
  • И как реализовать эти методы на практике.

Приступим!

Метод главных компонент и SVD

Метод главных компонент (англ. Principal Component Analysis, PCA) — базовый метод линейного снижения размерности, который позволяет найти наиболее вариативные направления в данных. Основная идея — найти такую ортонормированную систему координат, в которой дисперсия данных максимальна на первых осях.

Вспомним график, на котором изображены главные компоненты. На графике оси и соответствуют исходным признакам, а векторы и — главным компонентам. Главные компоненты взаимно ортогональны и показывают направления наибольшей и второй по значимости дисперсии в данных соответственно.

Главные компоненты как ортогональные направления наибольшей и второй по значимости дисперсии данных

Главные компоненты как ортогональные направления наибольшей и второй по значимости дисперсии данных

Чтобы это формализовать, поговорим о понятии ковариация.

💡Ковариация — это мера того, как два признака изменяются совместно.

Ковариация ведёт себя следующим образом:

  • Если оба признака увеличиваются или уменьшаются одновременно — ковариация положительна.
  • Если один из признаков растёт, а другой уменьшается — ковариация отрицательна.
  • Если между признаками нет линейной зависимости, то ковариация близка к нулю.

Для двух числовых признаков и ковариация определяется как:

где:

  • — число объектов;
  • и — средние значения по признакам.

Если у нас несколько признаков, мы можем вычислить ковариацию для каждой пары признаков — так формируется ковариационная матрица.

Пусть — матрица данных, центрированная по столбцам: из каждого признака (столбца) вычтено среднее. В ней признаков и объектов. Тогда ковариационная матрица имеет вид:

Это симметричная матрица размера где каждый элемент есть ковариация между признаками и .

Решая задачу нахождения собственных векторов этой матрицы , мы находим главные компоненты. На практике вместо собственных разложений применяют уже знакомое нам SVD-разложение:

где столбцы — это главные компоненты, а матрица содержит корни из дисперсий (стандартные отклонения) по направлениям главных компонент.

Важный нюанс про обозначения. В этой главе мы встречаем две разные матрицы, которые по традиции обозначаются одинаково — греческой буквой :

  • в — это ковариационная матрица данных , симметричная и положительно полуопределённая. Её собственные значения отражают дисперсии вдоль главных компонент.
  • в — это прямоугольно-диагональная матрица сингулярных чисел размером . Её диагональные элементы — это стандартные отклонения проекций данных на главные компоненты (если матрица центрирована по столбцам). Сингулярные числа матрицы , напомним, — это корни собственных значений матрицы .

Эти два объекта связаны следующим образом: если центрирована, то собственные значения ковариационной матрицы и сингулярные числа прямоугольно-диагональной матрицы связаны как .

Это объясняет, почему иногда говорят, что SVD и PCA — это два взгляда на одно и то же явление: один — через собственные значения, другой — через сингулярные числа.

Квадрат матрицы из SVD напрямую связана с PCA. При разложении матрица , используемая в PCA, раскладывается как:

Это следует из свойств ортогональной матрицы : . Мы пришли к формуле спектрального разложения через SVD. Таким образом, содержит собственные значения матрицы , а после деления на — дисперсию вдоль главных компонент. Это и есть набор собственных значений (спектр) ковариационной матрицы . Поэтому сингулярные числа в SVD позволяют сразу восстановить спектр PCA:

Мы видим, что дисперсия — это всего лишь частный случай ковариации, когда сравниваем признак с самим собой.

💡Ковариационная матрица — это обобщение дисперсии для случая многомерных данных.

Чтобы снизить количество компонент до , достаточно оставить первые главных компонент, тем самым проектируя данные в подпространство размерности :

Это наиболее информативное линейное представление данных.

Пример

Рассмотрим пример. Допустим, у нас есть матрица признаков X, состоящая из трёх наблюдений и двух признаков:

Найдём проекцию наших данных на две главные компоненты.

Шаг 1. Центрирование матрицы . Считаем среднее по столбцам и вычитаем его из каждого элемента соответствующего столбца:

То есть наша матрица уже центрирована.

Шаг 2. Нахождение ковариационной матрицы.

Шаг 3. Найдём матрицу . Для этого надо рассчитать собственные значения и векторы ковариационной матрицы . Алгоритм расчёта мы рассматривали ранее: сначала составляем характеристическое уравнение, находим собственные значения, а потом для каждого из них собственные векторы.

Собственный вектор для :

Не забываем нормировать вектор по его длине:

Собственный вектор для :

Итак, мы нашли матрицу :

Шаг 4. Находим проекцию данных на пространство главных компонент.

В реальных задачах мы не вычисляем ковариационную матрицу и её спектр вручную — всё это делают библиотеки.

Примеры в Python

Например, в numpy ковариационная матрица централизованных данных легко вычисляется как:

1import numpy as np
2
3X_centered = X - X.mean(axis=0)
4Sigma = X_centered.T @ X_centered / X_centered.shape[0]

или с помощью встроенной функции:

1import numpy as np
2
3Sigma = np.cov(X.T, bias=True)

В np.cov(X.T) по умолчанию используется деление на , соответствующее несмещённой статистической оценке дисперсии. Однако в PCA принято делить на , так как ковариационная матрица задаёт линейное преобразование, а не оценку параметров. Чтобы получить именно такую матрицу, нужно указать bias=True — в этом случае NumPy делит на , как требует определение PCA.

Если используется Sklearn, всё упрощается ещё сильнее – библиотека сама центрирует и применяет SVD:

1from sklearn.decomposition import PCA
2
3pca = PCA(n_components=k)
4Z = pca.fit_transform(X)  # X автоматически центрируется

Компоненты доступны через pca.components_, а дисперсии (собственные значения ковариационной матрицы) — через pca.explained_variance_.

PCA продемонстрировал, как с помощью SVD можно свести многомерные числовые данные к компактному представлению, выявляя главные направления изменчивости. Однако спектральные методы анализа не ограничиваются задачами снижения размерности для числовых таблиц. Они находят применение и в более сложных, структурированных данных — например, при извлечении скрытых тем из корпуса документов (LSA, NMF) или при выявлении латентных факторов вкуса пользователей на основе истории оценок (ALS, SVD в рекомендациях).

Рассмотрим, как эти методы используют разложения матриц для анализа текстов и других высокоразмерных данных.

Латентно-семантический анализ и неотрицательное матричное разложение

Методы, подобные PCA, не ограничиваются только табличными числовыми признаками. В задачах обработки текстов и рекомендаций также широко применяются спектральные методы и разложения матриц.

Одни из ключевых примеров:

  • Латентно-семантический анализ (Latent Semantic Analysis, LSA).
  • Неотрицательное матричное разложение (Non-negative Matrix Factorization, NMF).

Они позволяют выявлять скрытые темы в текстах, уменьшать размерность и строить интерпретируемые представления объектов и признаков.

Давайте разберём их подробнее.

LSA

Это метод понижения размерности в пространстве «документ-термин», который применяется к разреженным матрицам текстов. Идея в том, что термины в языках взаимозависимы, и часто встречаются вместе в похожих контекстах. Мы хотим найти скрытые темы, в которых совместно участвуют слова и документы.

Пусть дана матрица , где:

  • — количество документов,
  • — количество терминов,
  • — число вхождения слова в документе (или TF-IDF).

Тогда латентно-семантический анализ — это просто SVD матрицы :

  • Строки в — это представление документов в тематическом пространстве;
  • Строки в — представления терминов в том же пространстве;
  • — матрица сингулярных значений, отражающая важность каждой темы (масштаб растяжения по каждой оси). Это даёт вложения как для слов, так и для документов в общее латентное тематическое пространство.

SVD-разложение матрицы «документ-термин» мы показали на рисунке ниже.

Обозначения:

  • — координаты документов в тематическом пространстве;
  • — масштаб важности тем;
  • — координаты терминов.

Количество тем , и разложение позволяет выявить скрытую структуру и семантическую близость между текстами и словами.

SVD-разложение матрицы

SVD-разложение матрицы «документ-термин» в методе латентно-семантического анализа (LSA): .

Таким образом, LSA — это PCA для текстов, но применяемый к разрежённой и часто TF-IDF-нормированной матрице.

Преимущество LSA заключается в выявлении синонимии и тематической близости между словами и документами, устойчивости к шуму.

Недостаток заключается в том, что матрицы и могут быть отрицательными, что затрудняет интерпретацию.

После снижения размерности (через ) каждый термин представляется вектором в тематическом пространстве. На основе этих векторов можно вычислить семантическую близость между терминами — например, по косинусной мере:

где — тематическое сходство; векторы и .

Такой подход позволяет выявить семантически схожие слова, даже если они не встречаются в одних и тех же документах, но проявляют похожую тематическую структуру.

Рисунок ниже иллюстрирует получение матрицы семантической близости. Выделенные столбцы и представляют векторы термина и . Их косинусная близость интерпретируется как семантическое сходство. Полученная матрица «термин-термин» отражает связи между словами на основе их распределения по документам.

Переход от матрицы «документ-термин» к матрице семантической близости между терминами

Переход от матрицы «документ-термин» к матрице семантической близости между терминами

Реализация в Python

LSA реализуется через SVD, обычно применяется к TF-IDF-матрице:

1from sklearn.decomposition import TruncatedSVD
2from sklearn.feature_extraction.text import TfidfVectorizer
3
4vectorizer = TfidfVectorizer()
5X = vectorizer.fit_transform(documents)
6
7svd = TruncatedSVD(n_components=100)  # число тем
8X_lsa = svd.fit_transform(X) # Матрица документов в тематическом пространстве
9
10svd.components_ # Описание тем через термины

NMF

В отличие от SVD, NMF требует, чтобы все элементы разложения были неотрицательными:

Где:

  • — матрица документов и терминов (обычно TF-IDF);
  • — представление документов через темы;
  • — представление тем через слова.

Каждая строка — это распределение тем в документе , а каждая строка — распределение слов в теме . Благодаря неотрицательности темы легко интерпретировать: они представляют собой набор характерных слов, а документ — смесь тем.

Ниже представлена иллюстрация для NMF. Исходная матрица содержит частоты терминов в документах и приближается произведением двух неотрицательных матриц:

  • — распределение тем в документах;
  • — распределение терминов по темам.

Каждая строка интерпретируется как вероятностный профиль документа по темам, а каждая строка — как характерные слова темы. В отличие от SVD, NMF обеспечивает интерпретируемость благодаря неотрицательности компонент.

Неотрицательное матричное разложение (NMF) матрицы «документ-термин»

Неотрицательное матричное разложение (NMF) матрицы «документ-термин»

Достоинства NMF в интерпретируемости и сходстве с вероятностными моделями. Минусы в отсутствии ортогональности, итеративном поиске решений.

Реализация в Python
1Реализация в Python
2from sklearn.decomposition import NMF
3
4nmf = NMF(n_components=100, init='nndsvd')
5
6W = nmf.fit_transform(X)  # документы в темы от X - TF-IDF
7H = nmf.components_       # темы в слова

Вот таблица, в которой мы сравнили оба метода:

Характеристика

LSA

NMF

Метод

SVD

Неотрицательная факторизация

Интерпретируемость

Затруднена из-за отрицательных значений

Есть, так как все значения положительны

Геометрия

Ортогональное пространство

Частично перекрывающиеся направления

Оптимизация

Вычисляется точно через SVD

Итеративно, численно

И PCA, и его тематические аналоги — LSA и NMF — опираются на линейную структуру данных. Они ищут линейные комбинации признаков, которые максимально объясняют вариацию, выявляют тематики или скрытые факторы. Такие методы эффективно работают, когда данные действительно лежат в плоском линейном подпространстве или близки к нему.

Однако в реальных задачах, особенно связанных с изображениями, текстами, биологическими или поведенческими измерениями, структура данных может быть гораздо более сложной.

Чтобы обнаружить нелинейную структуру данных, были разработаны специальные методы снижения размерности, основанные не на линейных преобразованиях, а на сохранении локальной топологии: отношений соседства, плотности и формы кластеров. С этими методами мы сможете познакомиться в главе по теории вероятностей.

А пока давайте поймём, как действовать, если перед нами задача не только понять структуру, но и предсказать неизвестные значения.

Например, в рекомендательных системах мы хотим не только визуализировать предпочтения пользователей, но и восстановить пропущенные оценки: какие фильмы, товары или книги могут заинтересовать человека, — исходя из его поведения и предпочтений других.

В таких задачах применяется матричная факторизация — подход, который, подобно SVD или NMF, разлагает данные на скрытые компоненты, но делает это с учётом разрежённости данных. В отличие от методов визуализации, здесь важен не столько внешний вид латентного пространства, сколько его способность воспроизводить и дополнять структуру пользовательских предпочтений.

Матричная факторизация в рекомендательных системах

В задачах рекомендаций (фильмов, товаров, книг) данные представлены в виде разрежённой матрицы предпочтений: большинство пользователей оценивают лишь небольшую часть объектов.

Однако за этой разрежённостью скрывается структура — предпочтения можно объяснить латентными (скрытыми) факторами, такими как жанры, стили, категории. Матричная факторизация позволяет выявить эти факторы и восстановить недостающие оценки, формируя персонализированные рекомендации.

Допустим, у нас есть количество фильмов и пользователей, которые оценивают эти фильмы. Эти данные можно представить матрицей , где:

  • — число пользователей;
  • — число фильмов;
  • — это оценка пользователя фильма либо пропуск, если пользователь не оценивал фильм .

Такие матрицы очень разрежены: пользователь оценивает лишь малую долю объектов. Задача — восстановить недостающие оценки, то есть предсказать , которые пропущены в матрице .

Предположим, что пользователь обладает вкусовыми признаками: любит драму, боевики, старое кино, комедии и т. д. Эти вкусы можно описать как вектор признаков пользователя:

А фильм можно описать вектором характеристик:

Где каждая компонента — насколько фильм выражает ту или иную тему. Идея факторизации в данном случае состоит в том, чтобы представить матрицу как приближённое произведение этих двух матриц меньшей размерности — матрицы признаков (вкусов) пользователей и матрицы характеристик (тем) фильмов:

Где:

  • — матрица скрытых предпочтений пользователей: строка — это вектор из латентных факторов, описывающих пользователя ;
  • — матрица скрытых характеристик объектов: столбец — это вектор из латентных факторов, описывающих фильм .

На рисунке ниже показана схема разложения разреженной матрицы рейтингов в произведение двух матриц меньшей размерности. — предпочтения пользователей; — характеристики фильмов. Число латентных факторов .

Разложение разреженной матрицы рейтингов $R\in \mathbb{R}^{m\times n}$ в произведение двух матриц меньшей размерности

Разложение разреженной матрицы рейтингов в произведение двух матриц меньшей размерности

Параметр — это число скрытых факторов (или латентная размерность), то есть размерность пространства, в котором находятся и пользователи, и объекты. Обычно .

Такое предположение оправдано эмпирически — предпочтения и свойства имеют внутреннюю структуру. Например, большинство фильмов можно описать комбинацией жанров; предпочтения пользователей часто коррелированы.

Пусть у нас есть множество известных оценок . При этом известно только для . Тогда мы минимизируем среднеквадратичную ошибку между предсказанием и наблюдаемыми значениями:

чтобы обучить такие вектора, при которых восстановление будет точным. Чтобы избежать переобучения, добавляется регуляризатор:

Где — квадрат нормы Фробениуса матрицы ; — коэффициент регуляризации.

После обучения:

  • Строка описывает вкусы пользователя в скрытом пространстве.
  • Столбец описывает темы / жанровую принадлежность фильма .
  • Cкалярное произведение — это предсказанная оценка пользователя для фильма .

Таким образом, мы переходим от огромной разреженной матрицы к компактному представлению в общем пространстве.

Чтобы визуализировать этот переход, мы взяли датасет MovieLens, уже ставший классикой для Recsys-задач, выбрали самых активных пользователей и самые популярные фильмы и свернули разреженную матрицу реальных рейтингов в компактное латентное пространство. Сначала центрируем по пользователям (вычитаем их средний рейтинг), получаем факторы и через TruncatedSVD, а затем для наглядности отображаем факторы фильмов в 2D с помощью UMAP.

Слева — фрагмент матрицы> Справа — UMAP-1/2

Слева — фрагмент матрицы (MovieLens), цвет — это оценка от 0.5 до 5, белый — отсутствие оценки. Справа — UMAP-1/2: проекция латентных факторов фильмов (после центрирования по пользователям и TruncatedSVD); цвет — жанр

На графике справа хорошо видно, зачем мы это делали: хаотичная и неполная матрица слева превратилась в осмысленную «карту фильмов». Объекты со схожими свойствами оказались рядом — например, фильмы одного жанра (боевики, драмы, комедии) образовали заметные кластеры. Это наглядно доказывает, что модель действительно нашла скрытую структуру: латентные факторы успешно отразили семантическую близость между фильмами, даже не имея информации о жанрах.

Мы убедились, что идея работает. Но как именно найти оптимальные матрицы и , которые минимизируют ошибку на практике? Прямое решение этой задачи затруднительно.

Один из подходов для решения подобных задач — это ALS (англ. Alternating Least Squares). Так как прямая минимизация функции потерь, которую мы описали выше, невозможна (она нелинейна относительно и ), ALS производит оптимизацию решения иным способом. В ходе обучения одна из матриц фиксируется, в результате чего оптимизация второй матрицы сводится к задаче линейной регрессии.

Шаги алгоритма следующие:
Шаг 1. Зафиксировать , найти по методу наименьших квадратов.
Шаг 2. Зафиксировать , найти .
Шаг 3. Повторять до сходимости.

Каждый шаг минимизирует квадратичную функцию, что обеспечивает быстрое решение. В ALS на каждом шаге мы решаем независимую задачу МНК для каждой строки матрицы или , что позволяет эффективно обучать модель даже на больших данных. Метод гарантированно сходится (хотя не обязательно к глобальному минимуму).

Реализация в Python

Для реализации ALS в Python можно использовать библиотеку implicit, работающую с рекомендательными системами:

1rom implicit.als import AlternatingLeastSquares
2from scipy.sparse import csr_matrix
3
4R = csr_matrix(ratings_matrix)  # Разреженная матрица R
5model = AlternatingLeastSquares(factors=50, regularization=0.1)
6# Обучение модели
7model = AlternatingLeastSquares(factors=50, regularization=0.1)
8model.fit(R.T)  # Implicit ожидает объекты по строкам, поэтому транспонируем
9
10# Извлекаем матрицы латентных факторов
11W = model.user_factors # Размерность (m, k) — пользователи
12H = model.item_factors # Размерность (n, k) — объекты
13
14# Предсказание оценки пользователя i для объекта j:
15i, j = 0, 5  # Например, пользователь 0 и объект 5
16score = np.dot(W[i], H[j])

Матричная факторизация — это мощный метод для восстановления структуры и предпочтений в разреженных данных:

  • Позволяет предсказывать оценки и давать рекомендации.
  • Раскрывает скрытые факторы в поведении пользователей и свойствах объектов.
  • Широко используется в системах рекомендаций: Netflix, Spotify, Amazon.

Связь с линейной алгеброй проявляется в формулировке как задачи приближённого разложения матрицы, а также в применении градиентного спуска, регуляризации и факторизационных методов.


В этом параграфе мы рассмотрели методы снижения размерности, которые позволяют выявлять скрытую структуру в данных, сжимать информацию и упрощать модели без существенной потери качества.
Вы узнали:

  • как линейные преобразования могут быть использованы для поиска направлений наибольшей изменчивости и скрытых факторов в данных;
  • как метод главных компонент (PCA) позволяет понизить размерность, сохранив максимальную дисперсию;
  • что SVD лежит в основе многих алгоритмов анализа текстов и изображений;
  • как LSA и NMF используют матричные разложения для извлечения тем из коллекции документов;
  • чем отличаются методы с ортогональными и неотрицательными компонентами и как это влияет на интерпретируемость результатов.

В следующем параграфе мы перейдём от анализа признаков к построению моделей: рассмотрим линейные модели и узнаем, как решать задачи регрессии и классификации, бороться с переобучением с помощью регуляризации и строить устойчивые предсказательные алгоритмы.



Чтобы добавить в заметки выделенный текст, нажмите Ctrl + E
Предыдущий параграф4.9. Спектральные методы и матричные разложения
Следующий параграф4.11. Линейные модели и регуляризация