2.5. Разложение сигналов на компоненты (задачи факторизации матриц)
2.5.1. Анализ главных компонент (PCA)
2.5.1.1. Точный PCA и вероятностная интерпретация
PCA используется для разложения многомерного набора данных на последовательность ортогональных компонент, объясняющих максимальную долю дисперсии. В scikit-learn PCA реализован как объект преобразователя, который обучает \(n\) компонент в своем методе fit и может применяться к новым данным для их проецирования на эти компоненты.
PCA центрирует входные данные, но не масштабирует каждый признак перед применением SVD. Необязательный параметр whiten=True позволяет проецировать данные на сингулярное пространство, масштабируя каждую компоненту до единичной дисперсии. Это часто полезно, если модели последующего этапа предъявляют строгие требования к изотропности сигнала: например, так происходит в случае машин опорных векторов с RBF-ядром и алгоритма кластеризации K-Means.
Ниже приведен пример набора данных ирисов, состоящего из 4 признаков и спроецированного на 2 измерения, объясняющих наибольшую долю дисперсии:
Объект PCA также предоставляет вероятностную интерпретацию PCA, позволяющую оценить правдоподобие данных на основе объясняемой им доли дисперсии. Поэтому в нем реализован метод score, который можно использовать при перекрестной проверке:
Примеры
2.5.1.2. Инкрементальный PCA
Объект PCA очень полезен, но имеет некоторые ограничения при работе с большими наборами данных. Самое существенное ограничение состоит в том, что PCA поддерживает только пакетную обработку, то есть все обрабатываемые данные должны помещаться в оперативную память. Объект IncrementalPCA использует другой способ обработки и позволяет выполнять вычисления по частям, результаты которых почти в точности совпадают с результатами PCA, обрабатывая данные мини-пакетами. IncrementalPCA позволяет реализовать анализ главных компонент для данных, не помещающихся в память, одним из следующих способов:
- Использовать его метод
partial_fitдля фрагментов данных, последовательно загружаемых с локального жесткого диска или из сетевой базы данных. - Вызвать его метод fit для файла, отображенного в память с помощью
numpy.memmap.
IncrementalPCA хранит только оценки дисперсий компонент и шума, чтобы инкрементально обновлять explained_variance_ratio_. Поэтому объем используемой памяти зависит от количества образцов в пакете, а не от количества образцов в обрабатываемом наборе данных.
Как и PCA, IncrementalPCA центрирует входные данные, но не масштабирует каждый признак перед применением SVD.
Примеры
2.5.1.3. PCA с использованием рандомизированного SVD
Часто бывает полезно спроецировать данные в пространство меньшей размерности, сохраняющее большую часть дисперсии, отбросив сингулярные векторы компонент, соответствующие меньшим сингулярным значениям.
Например, если мы работаем с изображениями лиц в оттенках серого размером 64x64 пикселя для распознавания лиц, размерность данных равна 4096, и обучение машины опорных векторов с RBF-ядром на таких широких данных выполняется медленно. Кроме того, мы знаем, что внутренняя размерность данных намного меньше 4096, поскольку все изображения человеческих лиц в некоторой степени похожи друг на друга. Образцы лежат на многообразии гораздо меньшей размерности (например, около 200). Алгоритм PCA можно использовать для линейного преобразования данных, одновременно уменьшая размерность и сохраняя большую часть объясненной дисперсии.
В этом случае очень полезен класс PCA с необязательным параметром svd_solver='randomized': поскольку мы собираемся отбросить большинство сингулярных векторов, гораздо эффективнее ограничить вычисления приближенной оценкой сингулярных векторов, которые мы сохраним для выполнения преобразования.
Например, ниже показаны 16 портретов образцов (центрированных относительно 0.0) из набора данных Olivetti. Справа представлены первые 16 сингулярных векторов, преобразованных в портреты. Поскольку нам нужны только 16 старших сингулярных векторов набора данных с размером \(n_{samples} = 400\) и \(n_{features} = 64 \times 64 = 4096\), вычисление занимает менее 1 с:
Если обозначить \(n_{\max} = \max(n_{\mathrm{samples}}, n_{\mathrm{features}})\) и \(n_{\min} = \min(n_{\mathrm{samples}}, n_{\mathrm{features}})\), временная сложность рандомизированного PCA составляет \(O(n_{\max}^2 \cdot n_{\mathrm{components}})\) вместо \(O(n_{\max}^2 \cdot n_{\min})\) для точного метода, реализованного в PCA.
Объем памяти для рандомизированного PCA также пропорционален \(2 \cdot n_{\max} \cdot n_{\mathrm{components}}\) вместо \(n_{\max} \cdot n_{\min}\) для точного метода.
Примечание: реализация inverse_transform в PCA с svd_solver='randomized' не является точным обратным преобразованием transform, даже если whiten=False (значение по умолчанию).
Примеры
Литература
- Алгоритм 4.3 в статье «Поиск структуры с помощью случайности: стохастические алгоритмы для построения приближенных разложений матриц» Halko и др., 2009
- «Реализация рандомизированного алгоритма анализа главных компонент» A. Szlam и др., 2014
2.5.1.4. Разреженный анализ главных компонент (SparsePCA и MiniBatchSparsePCA)
SparsePCA — это вариант PCA, цель которого — извлечь набор разреженных компонент, наилучшим образом восстанавливающих данные.
Мини-пакетный разреженный PCA (MiniBatchSparsePCA) — это более быстрый, но менее точный вариант SparsePCA. Повышение скорости достигается за счет итераций по небольшим фрагментам набора признаков в течение заданного числа итераций.
Недостаток анализа главных компонент (PCA) состоит в том, что компоненты, извлеченные этим методом, имеют исключительно плотное представление, то есть их коэффициенты ненулевые при представлении в виде линейных комбинаций исходных переменных. Это может затруднить интерпретацию. Во многих случаях реальные компоненты можно более естественно представить как разреженные векторы; например, при распознавании лиц компоненты могут естественным образом соответствовать частям лица.
Разреженные главные компоненты дают более экономное и интерпретируемое представление, наглядно показывая, какие исходные признаки вносят вклад в различия между образцами.
В следующем примере показаны 16 компонент, извлеченных с помощью разреженного PCA из набора данных лиц Olivetti. Видно, как член регуляризации приводит к появлению множества нулей. Кроме того, естественная структура данных приводит к вертикальному соседству ненулевых коэффициентов. Модель не накладывает это ограничение математически: каждая компонента — это вектор \(h \in \mathbf{R}^{4096}\), и понятие вертикального соседства отсутствует, за исключением наглядной визуализации в виде изображений размером 64x64 пикселя. Локальный характер показанных ниже компонент обусловлен внутренней структурой данных, благодаря которой такие локальные шаблоны минимизируют ошибку восстановления. Существуют нормы, стимулирующие разреженность и учитывающие соседство и различные виды структуры; обзор таких методов см. в [Jen09]. Подробнее об использовании Sparse PCA см. в разделе «Примеры» ниже.
Обратите внимание, что существует множество различных формулировок задачи разреженного PCA. Реализованный здесь вариант основан на [Mrl09] . Решаемая задача оптимизации представляет собой задачу PCA (обучение словаря) с \(\ell_1\)-штрафом для компонент:
\(||.||_{\text{Fro}}\) обозначает норму Фробениуса, а \(||.||_{1,1}\) — поэлементную матричную норму, равную сумме абсолютных значений всех элементов матрицы. Матричная норма \(||.||_{1,1}\), стимулирующая разреженность, также предотвращает обучение компонент на шуме при небольшом количестве обучающих образцов. Степень штрафа (а значит, и разреженность) можно регулировать с помощью гиперпараметра alpha. Небольшие значения приводят к слабой регуляризации факторизации, а большие обнуляют многие коэффициенты.
Примечание
Хотя класс MiniBatchSparsePCA задуман как онлайн-алгоритм, он не реализует partial_fit, поскольку алгоритм работает онлайн по направлению признаков, а не образцов.
Примеры
Литература
«Онлайн-обучение словаря для разреженного кодирования» J. Mairal, F. Bach, J. Ponce, G. Sapiro, 2009
«Структурированный разреженный анализ главных компонент» R. Jenatton, G. Obozinski, F. Bach, 2009
2.5.2. Ядерный анализ главных компонент (kPCA)
2.5.2.1. Точный ядерный PCA
KernelPCA — это расширение PCA, обеспечивающее нелинейное снижение размерности с помощью ядер (см. Попарные метрики, меры сходства и ядра) [Scholkopf1997]. У этого метода множество применений, включая удаление шума, сжатие и структурированное предсказание (оценивание зависимости ядра). KernelPCA поддерживает как transform, так и inverse_transform.
Примечание
KernelPCA.inverse_transform использует гребневую регрессию с ядром для обучения функции, отображающей образцы из базиса PCA в исходное пространство признаков [Bakir2003]. Поэтому восстановление, полученное с помощью KernelPCA.inverse_transform, является приближенным. Дополнительные сведения см. в примере по ссылке ниже.
Примеры
Литература
Schölkopf, Bernhard, Alexander Smola и Klaus-Robert Müller. «Ядерный анализ главных компонент». Международная конференция по искусственным нейронным сетям. Springer, Берлин, Гейдельберг, 1997.
Bakır, Gökhan H., Jason Weston и Bernhard Schölkopf. «Обучение поиску прообразов». Advances in neural information processing systems 16 (2003): 449-456.
2.5.2.2. Выбор решателя для ядерного PCA
В то время как в PCA количество компонент ограничено количеством признаков, в KernelPCA оно ограничено количеством образцов. Во многих реальных наборах данных содержится большое количество образцов! В таких случаях поиск всех компонент с помощью полного kPCA приводит к напрасной трате вычислительного времени, поскольку данные в основном описываются первыми несколькими компонентами (например, n_components<=100). Иными словами, эффективный ранг центрированной матрицы Грама, для которой при обучении ядерного PCA выполняется собственное разложение, намного меньше ее размера. В такой ситуации приближенные решатели собственных значений позволяют ускорить вычисления с очень небольшой потерей точности.
Решатели собственных значений
Необязательный параметр eigen_solver='randomized' можно использовать для существенного сокращения времени вычислений, если количество запрашиваемых n_components невелико по сравнению с количеством образцов. Для поиска приближенного решения за меньшее время используются методы рандомизированного разложения.
Временная сложность рандомизированного KernelPCA составляет \(O(n_{\mathrm{samples}}^2 \cdot n_{\mathrm{components}})\) вместо \(O(n_{\mathrm{samples}}^3)\) для точного метода, реализованного с помощью eigen_solver='dense'.
Объем памяти для рандомизированного KernelPCA также пропорционален \(2 \cdot n_{\mathrm{samples}} \cdot n_{\mathrm{components}}\) вместо \(n_{\mathrm{samples}}^2\) для точного метода.
Примечание: этот метод совпадает с описанным в разделе PCA с использованием рандомизированного SVD.
Помимо двух описанных выше решателей, eigen_solver='arpack' можно использовать как альтернативный способ получить приближенное разложение. На практике этот метод обеспечивает приемлемое время выполнения только при крайне малом количестве искомых компонент. По умолчанию он включается, если требуемое количество компонент строго меньше 10, а количество образцов строго больше 200. Подробности см. в документации KernelPCA.
Литература
- плотный решатель: документация scipy.linalg.eigh
-
рандомизированный решатель:
- Алгоритм 4.3 в статье «Поиск структуры с помощью случайности: стохастические алгоритмы для построения приближенных разложений матриц» Halko и др. (2009)
- «Реализация рандомизированного алгоритма анализа главных компонент» A. Szlam и др. (2014)
- arpack-решатель: документация scipy.sparse.linalg.eigsh R. B. Lehoucq, D. C. Sorensen и C. Yang (1998)
2.5.3. Усечённое сингулярное разложение и латентно-семантический анализ
TruncatedSVD реализует вариант сингулярного разложения (SVD), который вычисляет только \(k\) наибольших сингулярных значений, где \(k\) — параметр, задаваемый пользователем.
TruncatedSVD очень похож на PCA, но отличается тем, что матрицу \(X\) не требуется центрировать. Если вычесть средние значения \(X\) по столбцам (для каждого признака) из значений признаков, то усечённое SVD полученной матрицы будет эквивалентно PCA.
Об усечённом SVD и латентно-семантическом анализе (LSA)
Когда усечённое SVD применяется к матрицам «термин-документ» (возвращаемым CountVectorizer или TfidfVectorizer), это преобразование называют латентно-семантическим анализом (LSA), поскольку оно преобразует такие матрицы в низкоразмерное «семантическое» пространство. В частности, известно, что LSA помогает бороться с последствиями синонимии и полисемии (оба понятия в общих чертах означают, что у слова может быть несколько значений), из-за которых матрицы «термин-документ» становятся чрезмерно разреженными и демонстрируют низкую степень сходства при использовании таких мер, как косинусное сходство.
Примечание
LSA также называют латентно-семантической индексацией, LSI, хотя строго говоря, это название относится к использованию метода в постоянных индексах для информационного поиска.
Математически усечённое SVD, применённое к обучающим выборкам \(X\), даёт низкоранговое приближение \(X\):
После этой операции \(U_k \Sigma_k\) — это преобразованный обучающий набор с \(k\) признаками (в API они называются n_components).
Чтобы преобразовать также тестовый набор \(X\), умножим его на \(V_k\):
Примечание
В большинстве описаний LSA в литературе по обработке естественного языка (NLP) и информационному поиску (IR) оси матрицы \(X\) меняют местами, чтобы она имела размерность (n_features, n_samples). Мы представляем LSA иначе — в соответствии с API scikit-learn, — но найденные сингулярные значения совпадают.
Хотя преобразователь TruncatedSVD работает с любой матрицей признаков, при обработке документов с помощью LSA рекомендуется использовать матрицы tf-idf, а не исходные частотные подсчёты. В частности, следует включить суб-линейное масштабирование и обратную частоту документов (sublinear_tf=True, use_idf=True), чтобы значения признаков были ближе к гауссовому распределению, компенсируя неверные предположения LSA о текстовых данных.
Примеры
Ссылки
- Christopher D. Manning, Prabhakar Raghavan и Hinrich Schütze (2008), Введение в информационный поиск, Cambridge University Press, глава 18: Разложения матриц и латентно-семантическая индексация
2.5.4. Обучение словаря
2.5.4.1. Разреженное кодирование с заранее вычисленным словарём
Объект SparseCoder — это оцениватель, который можно использовать для преобразования сигналов в разреженную линейную комбинацию атомов из фиксированного, заранее вычисленного словаря, например дискретного вейвлет-базиса. Поэтому этот объект не реализует метод fit. Такое преобразование сводится к задаче разреженного кодирования: поиску представления данных в виде линейной комбинации минимально возможного числа атомов словаря. Во всех вариантах обучения словаря реализованы следующие методы преобразования, выбор которых задаётся параметром инициализации transform_method:
- Ортогональный жадный алгоритм выбора соответствий (ортогональный жадный алгоритм выбора соответствий (OMP))
- Регрессия с наименьшим углом (регрессия с наименьшим углом)
- Lasso, вычисляемый с помощью регрессии с наименьшим углом
- Lasso с использованием покоординатного спуска (Lasso)
- Пороговая обработка
Пороговая обработка очень быстрая, но не обеспечивает точного восстановления. В литературе показана её полезность для задач классификации. Для задач восстановления изображений наиболее точное и несмещённое восстановление обеспечивает ортогональный жадный алгоритм выбора соответствий.
Объекты обучения словаря позволяют с помощью параметра split_code разделять положительные и отрицательные значения в результатах разреженного кодирования. Это полезно, когда обучение словаря используется для извлечения признаков, которые затем будут применяться в обучении с учителем: алгоритм обучения может назначать разные веса отрицательным и соответствующим им положительным коэффициентам конкретного атома.
Разделённый код для одного образца имеет длину 2 * n_components и строится по следующему правилу: сначала вычисляется обычный код длины n_components. Затем первые n_components элементов split_code заполняются положительной частью вектора обычного кода. Вторая половина разделённого кода заполняется отрицательной частью вектора кода, но со знаком плюс. Таким образом, split_code неотрицателен.
Примеры
2.5.4.2. Обучение словаря общего назначения
Обучение словаря (DictionaryLearning) — это задача факторизации матрицы, сводящаяся к поиску (обычно избыточного) словаря, который позволит эффективно кодировать подобранные данные разреженным образом.
Считается, что представление данных в виде разреженных комбинаций атомов из избыточного словаря соответствует принципу работы первичной зрительной коры млекопитающих. Поэтому было показано, что обучение словаря на фрагментах изображений даёт хорошие результаты в таких задачах обработки изображений, как дополнение изображения, ретуширование и удаление шума, а также в задачах распознавания с учителем.
Обучение словаря — это задача оптимизации, которая решается попеременным обновлением разреженного кода (как решения нескольких задач Lasso при фиксированном словаре), а затем обновлением словаря для наилучшего соответствия разреженному коду.
\(||.||_{\text{Fro}}\) обозначает норму Фробениуса, а \(||.||_{1,1}\) — покомпонентную матричную норму, равную сумме абсолютных значений всех элементов матрицы. После подгонки словаря с помощью такой процедуры преобразование сводится к этапу разреженного кодирования, для которого используется та же реализация, что и для всех объектов обучения словаря (см. Разреженное кодирование с заранее вычисленным словарём).
Также можно задать положительность словаря и/или кода, чтобы учесть ограничения, которые могут присутствовать в данных. Ниже показаны лица с различными ограничениями положительности. Красный цвет обозначает отрицательные значения, синий — положительные, а белый — нулевые.
Ссылки
- «Онлайн-обучение словаря для разреженного кодирования» J. Mairal, F. Bach, J. Ponce, G. Sapiro, 2009
2.5.4.3. Обучение словаря на мини-пакетах
MiniBatchDictionaryLearning реализует более быструю, но менее точную версию алгоритма обучения словаря, которая лучше подходит для больших наборов данных.
По умолчанию MiniBatchDictionaryLearning делит данные на мини-пакеты и выполняет онлайн-оптимизацию, проходя по мини-пакетам указанное число итераций. Однако в настоящее время условие остановки не реализовано.
Оцениватель также реализует partial_fit, который обновляет словарь, выполняя только один проход по мини-пакету. Это можно использовать для онлайн-обучения, когда данные изначально недоступны целиком или не помещаются в память.
На следующем изображении показан словарь, обученный на фрагментах изображения енота размером 4x4 пикселя, извлечённых из части изображения его морды.
Примеры
2.5.5. Факторный анализ
В обучении без учителя у нас есть только набор данных \(X = \{x_1, x_2, \dots, x_n \}\). Как описать этот набор данных математически? Очень простая модель continuous latent variable для \(X\) имеет вид
Вектор \(h_i\) называют «скрытым», поскольку он не наблюдается. \(\epsilon\) считается шумовым членом, распределённым по гауссовому закону со средним 0 и ковариацией \(\Psi\) (то есть \(\epsilon \sim \mathcal{N}(0, \Psi)\)), а \(\mu\) — некоторый произвольный вектор смещения. Такая модель называется «генеративной», поскольку описывает, как \(x_i\) порождается из \(h_i\). Если использовать все \(x_i\) в качестве столбцов матрицы \(\mathbf{X}\), а все \(h_i\) — в качестве столбцов матрицы \(\mathbf{H}\), то можно записать (при соответствующем определении \(\mathbf{M}\) и \(\mathbf{E}\)):
Иными словами, мы разложили матрицу \(\mathbf{X}\).
Если \(h_i\) задан, приведённое выше уравнение автоматически задаёт следующую вероятностную интерпретацию:
Для полной вероятностной модели нам также нужно задать априорное распределение скрытой переменной \(h\). Самое простое предположение (основанное на удобных свойствах гауссового распределения) — \(h \sim \mathcal{N}(0, \mathbf{I})\). Тогда маргинальное распределение \(x\) также будет гауссовым:
Теперь, без дополнительных предположений, идея скрытой переменной \(h\) была бы излишней: \(x\) можно полностью описать с помощью среднего и ковариации. Необходимо задать более конкретную структуру одного из этих двух параметров. Простое дополнительное предположение касается структуры ковариации ошибки \(\Psi\):
-
\(\Psi = \sigma^2 \mathbf{I}\): это предположение приводит к вероятностной модели
PCA. -
\(\Psi = \mathrm{diag}(\psi_1, \psi_2, \dots, \psi_n)\): эта модель называется
FactorAnalysisи является классической статистической моделью. Матрицу W иногда называют «матрицей факторных нагрузок».
Обе модели по существу оценивают гауссово распределение с низкоранговой ковариационной матрицей. Поскольку обе модели вероятностные, их можно включать в более сложные модели, например в смесь факторных анализаторов. Если предположить, что скрытые переменные имеют негауссовы априорные распределения, получаются совершенно иные модели (например, FastICA).
Факторный анализ может давать компоненты (столбцы своей матрицы нагрузок), похожие на компоненты PCA. Однако нельзя делать общих утверждений об этих компонентах (например, об их ортогональности):
Главное преимущество факторного анализа перед PCA состоит в том, что он может независимо моделировать дисперсию в каждом направлении входного пространства (гетероскедастический шум):
Это позволяет лучше выбирать модель, чем при использовании вероятностного PCA, если присутствует гетероскедастический шум:
После факторного анализа часто выполняют вращение факторов (с помощью параметра rotation), обычно для повышения интерпретируемости. Например, вращение Varimax максимизирует сумму дисперсий квадратов нагрузок; в результате факторы, как правило, становятся более разреженными, то есть каждый из них определяется лишь несколькими признаками («простая структура»). См., например, первый пример ниже.
Примеры
2.5.6. Анализ независимых компонент (ICA)
Анализ независимых компонент разделяет многомерный сигнал на аддитивные подкомпоненты, максимально независимые друг от друга. В scikit-learn он реализован с помощью алгоритма Fast ICA. Обычно ICA применяют не для уменьшения размерности, а для разделения наложенных друг на друга сигналов. Поскольку модель ICA не включает шумовой член, для её корректной работы необходимо выполнить отбеливание. Это можно сделать автоматически с помощью аргумента whiten или вручную, используя один из вариантов PCA.
Классически метод используют для разделения смешанных сигналов (эта задача известна как слепое разделение источников), как в примере ниже:
ICA также можно использовать как ещё один метод нелинейного разложения, находящий компоненты с некоторой степенью разреженности:
Примеры
2.5.7. Неотрицательная матричная факторизация (NMF или NNMF)
2.5.7.1. NMF с нормой Фробениуса
NMF [1] — альтернативный подход к разложению, предполагающий, что данные и компоненты неотрицательны. NMF можно использовать вместо PCA или его вариантов в тех случаях, когда матрица данных не содержит отрицательных значений. Метод находит разложение выборок \(X\) на две матрицы \(W\) и \(H\) с неотрицательными элементами, оптимизируя расстояние \(d\) между \(X\) и матричным произведением \(WH\). Наиболее широко используется квадрат нормы Фробениуса, являющийся очевидным расширением евклидовой нормы на матрицы:
В отличие от PCA, представление вектора получается аддитивным способом: компоненты накладываются друг на друга, а не вычитаются. Такие аддитивные модели эффективны для представления изображений и текста.
В работе [Hoyer, 2004] [2] было показано, что при тщательном наложении ограничений NMF может создавать основанное на частях представление набора данных, в результате чего получаются интерпретируемые модели. В следующем примере показаны 16 разреженных компонент, найденных с помощью NMF по изображениям из набора данных лиц Olivetti, в сравнении с собственными лицами PCA.
Атрибут init задаёт используемый метод инициализации, который сильно влияет на производительность метода. NMF реализует метод двойного сингулярного разложения для неотрицательных матриц. NNDSVD [4] основан на двух процедурах SVD: одна аппроксимирует матрицу данных, а другая — положительные части полученных частичных множителей SVD, используя алгебраическое свойство матриц ранга 1. Базовый алгоритм NNDSVD лучше подходит для разреженной факторизации. Для плотных данных рекомендуются его варианты NNDSVDa (в котором все нули заменяются средним значением всех элементов данных) и NNDSVDar (в котором нули заменяются случайными возмущениями, меньшими среднего значения данных, делённого на 100).
Обратите внимание, что решатель Multiplicative Update (‘mu’) не может обновлять нули, имеющиеся в инициализации, поэтому при совместном использовании с базовым алгоритмом NNDSVD, который вводит много нулей, результаты хуже; в этом случае предпочтительнее NNDSVDa или NNDSVDar.
NMF также можно инициализировать правильно масштабированными случайными неотрицательными матрицами, задав init="random". Для обеспечения воспроизводимости в random_state также можно передать целочисленное начальное значение или RandomState.
В NMF в функцию потерь можно добавить априорные распределения L1 и L2 для регуляризации модели. Для априорного распределения L2 используется норма Фробениуса, а для априорного распределения L1 — поэлементная норма L1. Как и в ElasticNet, соотношение L1 и L2 контролируется параметром l1_ratio (\(\rho\)), а интенсивность регуляризации — параметрами alpha_W и alpha_H (\(\alpha_W\) и \(\alpha_H\)). Априорные члены масштабируются количеством образцов (\(n\_samples\)) для H и количеством признаков (\(n\_features\)) для W, чтобы сбалансировать их влияние друг относительно друга и относительно члена подгонки по данным, насколько это возможно независимо от размера обучающей выборки. Тогда члены априорных распределений имеют вид:
а регуляризованная целевая функция имеет вид:
2.5.7.2. NMF с бета-дивергенцией
Как отмечалось выше, наиболее широко используется квадрат нормы Фробениуса, являющийся очевидным расширением евклидовой нормы на матрицы:
В NMF можно использовать и другие функции расстояния, например дивергенцию Кульбака — Лейблера (KL) (обобщённую), также называемую I-дивергенцией:
Или дивергенцию Итакуры — Сайто (IS):
Эти три расстояния являются частными случаями семейства бета-дивергенций при \(\beta = 2, 1, 0\) соответственно [6]. Бета-дивергенция определяется следующим образом:
Обратите внимание, что это определение недействительно при \(\beta \in (0; 1)\), однако его можно непрерывно продолжить до определений \(d_{KL}\) и \(d_{IS}\) соответственно.
Реализованные решатели NMF
NMF реализует два решателя: Coordinate Descent (‘cd’) [5] и Multiplicative Update (‘mu’) [6]. Решатель ‘mu’ может оптимизировать любую бета-дивергенцию, включая, конечно, норму Фробениуса (\(\beta=2\)), дивергенцию Кульбака — Лейблера (обобщённую) (\(\beta=1\)) и дивергенцию Итакуры — Сайто (\(\beta=0\)). Обратите внимание, что при \(\beta \in (1; 2)\) решатель ‘mu’ работает значительно быстрее, чем при других значениях \(\beta\). Также обратите внимание, что при отрицательном (или равном 0, то есть ‘itakura-saito’) значении \(\beta\) входная матрица не может содержать нулевые значения.
Решатель ‘cd’ может оптимизировать только норму Фробениуса. Из-за лежащей в основе NMF невыпуклости разные решатели могут сходиться к разным минимумам, даже при оптимизации одной и той же функции расстояния.
Для NMF лучше всего использовать метод fit_transform, который возвращает матрицу W. Матрица H сохраняется в обученной модели в атрибуте components_; метод transform разложит новую матрицу X_new на основе сохранённых компонент:
>>> import numpy as np >>> X = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]]) >>> from sklearn.decomposition import NMF >>> model = NMF(n_components=2, init='random', random_state=0) >>> W = model.fit_transform(X) >>> H = model.components_ >>> X_new = np.array([[1, 0], [1, 6.1], [1, 0], [1, 4], [3.2, 1], [0, 4]]) >>> W_new = model.transform(X_new)
Примеры
2.5.7.3. Мини-пакетная неотрицательная матричная факторизация
MiniBatchNMF [7] реализует более быструю, но менее точную версию неотрицательной матричной факторизации (то есть NMF), лучше подходящую для больших наборов данных.
По умолчанию MiniBatchNMF делит данные на мини-пакеты и оптимизирует модель NMF в онлайн-режиме, проходя по мини-пакетам заданное число итераций. Параметр batch_size управляет размером пакетов.
Чтобы ускорить алгоритм мини-пакетов, можно также масштабировать предыдущие пакеты, придавая им меньшую значимость, чем новым. Для этого вводится так называемый коэффициент забывания, задаваемый параметром forget_factor.
Оцениватель также реализует partial_fit, который обновляет H, выполняя только один проход по мини-пакету. Это можно использовать для онлайн-обучения, когда данные недоступны с самого начала или не помещаются в памяти.
Литература
2.5.8. Латентное размещение Дирихле (LDA)
Латентное размещение Дирихле — это порождающая вероятностная модель для коллекций дискретных наборов данных, например текстовых корпусов. Это также тематическая модель, используемая для выявления абстрактных тем в коллекции документов.
Графическая модель LDA — это порождающая модель с тремя уровнями:
Пояснения к обозначениям, представленным выше в графической модели и описанным в Hoffman et al. (2013):
- Корпус представляет собой коллекцию из \(D\) документов.
- Документ \(d \in D\) — это последовательность из \(N_d\) слов.
- В корпусе содержится \(K\) тем.
- Блоки обозначают повторяющуюся выборку.
В графической модели каждый узел является случайной переменной и играет определённую роль в порождающем процессе. Закрашенный узел обозначает наблюдаемую переменную, незакрашенный — скрытую (латентную) переменную. В данном случае единственные наблюдаемые нами данные — это слова в корпусе. Латентные переменные определяют случайную смесь тем в корпусе и распределение слов в документах. Цель LDA — использовать наблюдаемые слова для вывода о скрытой структуре тем.
Подробнее о моделировании текстовых корпусов
При моделировании текстовых корпусов предполагается следующий порождающий процесс для корпуса из \(D\) документов и \(K\) тем, где \(K\) соответствует n_components в API:
- Для каждой темы \(k \in K\) выбрать \(\beta_k \sim \mathrm{Dirichlet}(\eta)\). Это задаёт распределение слов, то есть вероятность появления слова в теме \(k\). \(\eta\) соответствует
topic_word_prior. - Для каждого документа \(d \in D\) выбрать доли тем \(\theta_d \sim \mathrm{Dirichlet}(\alpha)\). \(\alpha\) соответствует
doc_topic_prior. -
Для каждого слова \(n=1,\cdots,N_d\) в документе \(d\):
- Выбрать тему \(z_{dn} \sim \mathrm{Multinomial} (\theta_d)\)
- Выбрать наблюдаемое слово \(w_{dn} \sim \mathrm{Multinomial} (\beta_{z_{dn}})\)
Для оценки параметров апостериорное распределение имеет вид:
Поскольку апостериорное распределение не поддаётся вычислению, вариационный байесовский метод аппроксимирует его более простым распределением \(q(z,\theta,\beta | \lambda, \phi, \gamma)\), а вариационные параметры \(\lambda\), \(\phi\), \(\gamma\) оптимизируются для максимизации нижней границы свидетельства (ELBO):
Максимизация ELBO эквивалентна минимизации дивергенции Кульбака — Лейблера (KL) между \(q(z,\theta,\beta)\) и истинным апостериорным распределением \(p(z, \theta, \beta |w, \alpha, \eta)\).
LatentDirichletAllocation реализует алгоритм онлайн-вариационного байесовского вывода и поддерживает как онлайн-, так и пакетные методы обновления. Пакетный метод обновляет вариационные переменные после каждого полного прохода по данным, тогда как онлайн-метод обновляет их на основе точек данных из мини-пакета.
Примечание
Хотя для онлайн-метода гарантирована сходимость к локальному оптимуму, качество найденного оптимума и скорость сходимости могут зависеть от размера мини-пакета и атрибутов, связанных с настройкой скорости обучения.
При применении LatentDirichletAllocation к матрице «документ — термин» она раскладывается на матрицу «тема — термин» и матрицу «документ — тема». Матрица «тема — термин» сохраняется в модели как components_, а матрицу «документ — тема» можно вычислить с помощью метода transform.
LatentDirichletAllocation также реализует метод partial_fit. Он используется, когда данные можно получать последовательно.
Примеры
Литература
- «Латентное размещение Дирихле» D. Blei, A. Ng, M. Jordan, 2003
- «Онлайн-обучение для латентного размещения Дирихле» M. Hoffman, D. Blei, F. Bach, 2010
- «Стохастический вариационный вывод» M. Hoffman, D. Blei, C. Wang, J. Paisley, 2013
- «Критерий varimax для аналитического вращения в факторном анализе» H. F. Kaiser, 1958
См. также раздел Снижение размерности, посвящённый снижению размерности с помощью анализа соседних компонентов.
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/modules/decomposition.html