Многие задачи машинного обучения сталкиваются с данными высокой размерности: тексты, изображения, временные ряды, графы. Однако полезная информация в таких данных зачастую лежит в значительно меньшем пространстве.
Это связано с наличием скрытых, или латентных, факторов, которые определяют структуру данных. Методы снижения размерности позволяют выявить эти скрытые зависимости, избавиться от шума и упростить анализ.
В этом параграфе мы рассмотрим:
- Как метод главных компонент извлекает главные направления изменчивости через 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-разложение матрицы «документ-термин» в методе латентно-семантического анализа (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 в интерпретируемости и сходстве с вероятностными моделями. Минусы в отсутствии ортогональности, итеративном поиске решений.
Реализация в 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, разлагает данные на скрытые компоненты, но делает это с учётом разрежённости данных. В отличие от методов визуализации, здесь важен не столько внешний вид латентного пространства, сколько его способность воспроизводить и дополнять структуру пользовательских предпочтений.
Матричная факторизация в рекомендательных системах
В задачах рекомендаций (фильмов, товаров, книг) данные представлены в виде разрежённой матрицы предпочтений: большинство пользователей оценивают лишь небольшую часть объектов.
Однако за этой разрежённостью скрывается структура — предпочтения можно объяснить латентными (скрытыми) факторами, такими как жанры, стили, категории. Матричная факторизация позволяет выявить эти факторы и восстановить недостающие оценки, формируя персонализированные рекомендации.
Допустим, у нас есть количество фильмов и пользователей, которые оценивают эти фильмы. Эти данные можно представить матрицей , где:
- — число пользователей;
- — число фильмов;
- — это оценка пользователя фильма либо пропуск, если пользователь не оценивал фильм .
Такие матрицы очень разрежены: пользователь оценивает лишь малую долю объектов. Задача — восстановить недостающие оценки, то есть предсказать , которые пропущены в матрице .
Предположим, что пользователь обладает вкусовыми признаками: любит драму, боевики, старое кино, комедии и т. д. Эти вкусы можно описать как вектор признаков пользователя:
А фильм можно описать вектором характеристик:
Где каждая компонента — насколько фильм выражает ту или иную тему. Идея факторизации в данном случае состоит в том, чтобы представить матрицу как приближённое произведение этих двух матриц меньшей размерности — матрицы признаков (вкусов) пользователей и матрицы характеристик (тем) фильмов:
Где:
- — матрица скрытых предпочтений пользователей: строка — это вектор из латентных факторов, описывающих пользователя ;
- — матрица скрытых характеристик объектов: столбец — это вектор из латентных факторов, описывающих фильм .
На рисунке ниже показана схема разложения разреженной матрицы рейтингов в произведение двух матриц меньшей размерности. — предпочтения пользователей; — характеристики фильмов. Число латентных факторов .
Разложение разреженной матрицы рейтингов в произведение двух матриц меньшей размерности
Параметр — это число скрытых факторов (или латентная размерность), то есть размерность пространства, в котором находятся и пользователи, и объекты. Обычно .
Такое предположение оправдано эмпирически — предпочтения и свойства имеют внутреннюю структуру. Например, большинство фильмов можно описать комбинацией жанров; предпочтения пользователей часто коррелированы.
Пусть у нас есть множество известных оценок . При этом известно только для . Тогда мы минимизируем среднеквадратичную ошибку между предсказанием и наблюдаемыми значениями:
чтобы обучить такие вектора, при которых восстановление будет точным. Чтобы избежать переобучения, добавляется регуляризатор:
Где — квадрат нормы Фробениуса матрицы ; — коэффициент регуляризации.
После обучения:
- Строка описывает вкусы пользователя в скрытом пространстве.
- Столбец описывает темы / жанровую принадлежность фильма .
- Cкалярное произведение — это предсказанная оценка пользователя для фильма .
Таким образом, мы переходим от огромной разреженной матрицы к компактному представлению в общем пространстве.
Чтобы визуализировать этот переход, мы взяли датасет MovieLens, уже ставший классикой для Recsys-задач, выбрали самых активных пользователей и самые популярные фильмы и свернули разреженную матрицу реальных рейтингов в компактное латентное пространство. Сначала центрируем по пользователям (вычитаем их средний рейтинг), получаем факторы и через TruncatedSVD, а затем для наглядности отображаем факторы фильмов в 2D с помощью UMAP.
Слева — фрагмент матрицы (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 используют матричные разложения для извлечения тем из коллекции документов;
- чем отличаются методы с ортогональными и неотрицательными компонентами и как это влияет на интерпретируемость результатов.
В следующем параграфе мы перейдём от анализа признаков к построению моделей: рассмотрим линейные модели и узнаем, как решать задачи регрессии и классификации, бороться с переобучением с помощью регуляризации и строить устойчивые предсказательные алгоритмы.
