Какие быстрые алгоритмы существуют для вычисления усеченного SVD?


14

Возможно, здесь не по теме, но уже существует несколько ( один , два ) связанных вопросов.

Поиски в литературе (или поиск в Google по усеченным алгоритмам SVD) обнаруживают множество статей, которые используют усеченные SVD по-разному, и утверждают (разочаровывающе, часто без цитирования), что существуют быстрые алгоритмы для его вычисления, но никто кажется, указывает на то, что эти алгоритмы.

Единственное, что я могу найти, - это один рандомизированный алгоритм , используемый в библиотеке redSVD .

То, что я хотел бы видеть, - это набор точных и неточных алгоритмов, подходящих для понимания того, как работают системы (но, конечно, не обязательно для их фактической реализации!).

У кого-нибудь есть хорошая рекомендация для такого рода вещей?


Если я хочу хорошо хранить данные, я использую b-дерево (или rb-дерево) в хэше (например, ram). Если бы у меня было b-дерево для данных, то я мог бы за O (log (n)) квантили выборки времени и тому подобное. Могу поспорить, что при больших данных такая выборка может быть использована для вычисления приличного разреженного приближения к svd-матрицам за короткое время. Вы также можете посмотреть «сжатое зондирование», которое является очень статистическим подходом к экстремальному сжатию данных.
EngrStudent - Восстановить Монику

Под усеченным SVD вы подразумеваете, что вас интересует только нахождение нескольких ведущих сингулярных векторов / значений, в отличие от всех них?
амеба говорит восстановить монику

@amoeba Да, это идея.
Джон Дусетт

Ответы:


16

Говоря в широком смысле, существует два подхода для вычисления разложения по собственным значениям или по сингулярным значениям. Один из подходов заключается в диагонализации матрицы, и это, по сути, приводит к одновременному получению всего разложения по собственным значениям / сингулярным значениям (всего спектра собственных значений), см. Краткий обзор здесь: Какие эффективные алгоритмы для вычисления разложения по сингулярным значениям (SVD)? Альтернативой является использование итерационного алгоритма, который выдает один (или несколько) собственных векторов за раз. Итерации могут быть остановлены после того, как желаемое количество собственных векторов было вычислено.

Я не думаю, что есть итерационные алгоритмы специально для SVD. Это связано с тем, что можно вычислить SVD матрицы B размером , выполнив собственное разложение квадратной симметричной ( n + m ) × ( n + m ) матрицы A = ( 0 B B 0 ) . Поэтому вместо того , чтобы спросить , что алгоритмы вычисления усеченного СВД, вы должны спросить , что итерационный алгоритм вычислений eigendecomposition: алгоритм усеченного СВД итерационный алгоритм eigendecomposition .N×мВ(N+м)×(N+м)

Aзнак равно(0ВВ0),
алгоритм усеченного СВДитерационный алгоритм для собственного разложения,

Самый простой итерационный алгоритм называется степенной итерацией и действительно очень прост:

  1. Инициализировать случайный .Икс
  2. Обновить .ИксAИкс
  3. Нормализовать .ИксИкс/| |Икс| |
  4. Перейти к шагу № 2, если не сходятся.

Все более сложные алгоритмы в конечном счете основаны на идее мощной итерации, но становятся довольно сложными. Необходимая математика задается подпространствами Крылова . Алгоритмы - итерация Арнольди (для квадратных несимметричных матриц), итерация Ланцоша (для квадратных симметричных матриц) и их варианты, такие как, например, «неявно перезапущенный метод Ланцоша» и еще много чего.

Вы можете найти это, например, в следующих учебниках:

  1. Голуб и Ван Лоан, Матричные вычисления
  2. Trefethen & Bau, Численная линейная алгебра
  3. Деммель, Прикладная числовая линейная алгебра
  4. Саад, Численные методы для задач больших собственных значений

Все разумные языки программирования и пакеты статистики (Matlab, R, Python numpy, как вы его называете) используют одни и те же библиотеки Фортрана для выполнения разложения по собственным / сингулярным значениям. Это LAPACK и ARPACK . ARPACK означает ARnoldi PACKage, и это все об итерациях Арнольди / Ланцоша. Например, в Matlab есть две функции для SVD: svdвыполняет полную декомпозицию через LAPACK, и svdsвычисляет заданное число единичных векторов через ARPACK, и это на самом деле просто оболочка для eigsвызова в матрице с квадратными размерами.

Обновить

ВAAВA

Для этих методов также есть библиотека Фортрана, она называется PROPACK :

Программный пакет PROPACK содержит набор функций для вычисления сингулярного разложения больших и разреженных или структурированных матриц. Процедуры SVD основаны на алгоритме бидиагонализации Ланцоша с частичной реортогонализацией (BPRO).

Тем не менее, PROPACK кажется гораздо менее стандартным, чем ARPACK, и изначально не поддерживается в стандартных языках программирования. Он написан Расмусом Ларсеном, у которого есть большая 90-страничная статья 1998 года « Бидиагонализация Ланцоша» с частичной реортогонализацией с хорошим обзором. Благодаря @MichaelGrant через этот поток вычислительной науки SE .

Среди более свежих работ наиболее популярными, по-видимому, являются Baglama & Reichel, 2005, Augmented неявно перезапускает методы бидиагонализации Lanczos , что, вероятно, соответствует уровню техники. Спасибо @Dougal за предоставленную ссылку в комментариях.

Обновление 2

Действительно, в обзорном документе, который вы сами цитировали, есть совершенно другой подход, описанный вами: Halko et al. 2009, Нахождение структуры со случайностью: вероятностные алгоритмы построения приближенных матричных разложений . Я не знаю достаточно об этом, чтобы комментировать.


Обратите внимание, что существуют SVD-специфичные итерационные методы; например, расширенные неявно перезапущенные методы бидиагонализации Ланцоша , J. Baglama и L. Reichel, SIAM J. Sci. Вычи. 2005. (Я не читал газету, чтобы узнать, принципиально ли она отличается от подхода, основанного на собственных значениях, который вы дали, просто знайте, что людям нравится этот метод.)
Дугал

1
Спасибо за ссылку, @Dougal. Я должен сказать, что я не очень хорошо знаю ни один из этих методов, поэтому не могу прокомментировать это. Было бы здорово, если бы кто-то более знающий объяснил бы связь между различными итерационными методами. Насколько я понимаю, ванильный метод Ланцоша предназначен для вычисления собственных значений квадратной матрицы, а не для SVD; «расширенный неявно перезапущенный Lanczos» должен быть тесно связан с ним, но вы правы - похоже, это напрямую связано с SVD. Не уверен, как все это сочетается. Я обновлю свой ответ, если когда-нибудь получу поближе.
говорит амеба, восстанови Монику

1
@ Дугал, я немного прочел и сделал обновление.
амеба говорит восстановить Монику

@amoeba будет ли "усеченный SVD" в контексте регуляризованных наименьших квадратов по сути быть таким же, как "регрессия основных компонентов" ?
GeoMatt22

1
@amoeba Можете ли вы прокомментировать случайную реализацию SVD на Facebook , некоторые люди, кажется, говорят, что это одно из самых быстрых возможных решений прямо сейчас. Было бы здорово, если бы вы могли редактировать, чтобы прокомментировать и это.
Тим

4

Я просто наткнулся на поток с помощью быстрого поиска SVD, поэтому я пытаюсь сам разобраться, но, возможно, вам стоит взглянуть на адаптивное перекрестное приближение (ACA).

MMзнак равноΣязнак равно0КUяВяTN×NО(N)

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

Примечание. Я хотел написать это как комментарий, но поскольку я только создал эту учетную запись, у меня недостаточно репутации для комментариев ... Но публикация работает.


2

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

  1. Прежде чем что-либо делать, подгоните простую модель (например, глобальное среднее + значения столбца и константы строки), и только после того, как вы это сделаете, вам следует перейти к использованию усеченного SVD для подгонки остатков.
  2. Инициализируйте случайный вектор длины k (где это урезанный ранг) для каждой строки и столбца (для каждого фильма и пользователя в случае Netflix).
  3. Удерживайте векторы строк фиксированными и обновите векторы столбцов, чтобы минимизировать ошибки относительно известных записей в матрице. Процедура приведена в коде Matlab в статье.
  4. Держите векторы столбцов фиксированными и обновляйте векторы строк аналогичным образом.
  5. Повторите 3 и 4, пока вы не сходитесь или не получаете достаточно хорошие результаты.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.