Які швидкі алгоритми існують для обчислення усіченого SVD?


14

Можливо, тут немає теми, але вже є декілька ( один , два ) пов'язаних із цим питань.

Оглянувшись літературою (або пошуком Google за усіченими алгоритмами SVD), виходить багато паперів, які різними способами використовують усічені SVD, і стверджують ( страшно , часто, без цитування), що існують швидкі алгоритми її обчислення, але ніхто схоже, вказує на те, що це алгоритми.

Єдине, що я можу знайти - це єдиний рандомізований алгоритм , який використовується в бібліотеці redSVD .

Що я хотів би бачити, це набір точних і неточних алгоритмів, що підходить для розуміння того, як працюють системи (але не обов'язково для їх реальної реалізації, звичайно!).

Хтось має хороші посилання на подібні речі?


Якщо я хочу добре зберігати дані, я використовую b-дерево (або rb-дерево) у хеші (подумайте про баран). Якби я мав b-дерево для даних, я міг би в O (log (n)) пробити час вибірки квантилів тощо. Б'юсь об заклад, що з великими даними така вибірка може бути використана для обчислення пристойного розрідженого наближення до матриць svd за короткий час. Ви також можете знайти "стиснене зондування", що є дуже статистичним підходом до екстремального стиснення даних.
EngrStudent

Під усіченим SVD ви маєте на увазі, що вас цікавить лише пошук кількох провідних вектора / значення, на відміну від усіх?
амеба каже, що повернеться Моніка

@amoeba Так, це ідея.
Джон Дучетт

Відповіді:


17

Дуже широко кажучи, існує два підходи до обчислення власних значень чи сингулярних розкладів значення. Один із підходів - діагоналізація матриці, і це, по суті, дає одночасно ціле розкладання власного значення / сингулярного значення (весь спектр власного значення).Альтернативою є використання ітеративного алгоритму, який дає один (або кілька) власних векторів одночасно. Ітерації можна зупинити після обчислення потрібної кількості власних векторів.

Я не думаю, що є ітеративні алгоритми, спеціально для SVD. Це тому, що можна обчислити SVD матриці B , виконавши ейгендекомпозицію квадратної симетричної ( n + m ) × ( n + m ) матриці A = ( 0 B B 0 ) .n×mB(n+m)×(n+m)

A=(0BB0).
Тому замість того , щоб запитати , що алгоритми обчислення усіченого СВД, ви повинні запитати , що ітераційний алгоритм обчислень eigendecomposition:
algorithm for truncated SVDiterative algorithm for eigendecomposition.

Найпростіший ітеративний алгоритм називається ітерацією потужності і насправді дуже простий:

  1. x
  2. Оновлення xAx
  3. Нормалізувати xx/x
  4. Перейдіть до кроку №2, якщо не зійдеться.

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

Це можна знайти, наприклад, у наступних підручниках:

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

Усі розумні мови програмування та пакети статистики (Matlab, R, Python numpy, ви їх називаєте) використовують одні і ті ж бібліотеки Fortran для декомпозиції власних / сингулярних значень. Це LAPACK і ARPACK . ARPACK означає ARnoldi PACKage, і все стосується ітерацій Арнольді / Ланцоса. Наприклад, у Matlab є дві функції для SVD:svd здійснює повне розкладання за допомогою LAPACK і svdsобчислює задану кількість сингулярних векторів через ARPACK, і це насправді просто обгортка для eigsвиклику на матриці "квадрат-іed".

Оновлення

BAABA і тим самим економити простір та час.

Для цих методів також існує бібліотека Fortran, вона називається PROPACK :

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

Однак здається, що PROPACK набагато менш стандартний, ніж ARPACK, і не підтримується в стандартних мовах програмування. Він написаний Расмусом Ларсеном, який має велику 90-сторінкову газету " Ланцос бідіагоналізація" з частковою реортогоналізацією, що здається хорошим оглядом. Завдяки @MichaelGrant через цю тему Computational Science SE .

Серед останніх робіт найбільш популярними видаються «Baglama & Reichel», 2005, « Augmented» неявно перезапущено методи бідіагоналізації Lanczos , що, мабуть, є у сучасному рівні. Дякуємо @Dougal за те, що дав це посилання у коментарях.

Оновлення 2

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


Зауважте, що існують специфічні для SVD методи ітерації; наприклад, Доповнені непримітно ретартовані методи бідіагоналізації Ланцоса , Дж. Баглама та Л. Рейхель, SIAM J. Sci. Обчислення. 2005. (Я не читав статтю, щоб знати, чи принципово вона відрізняється від власного значення підходу, який ви дали, просто знайте, що людям подобається цей метод.)
Дугал

1
Дякуємо за посилання, @Dougal. Я повинен сказати, що я дійсно не знаю жодного з цих методів, тому не можу коментувати це. Було б чудово, якби хтось більш обізнаний пояснив би зв’язок між різними ітераційними методами. Наскільки я розумію, метод ванільного Ланцоса призначений для обчислення власних значень квадратної матриці, а не для SVD; "Доповнений неявно перезапущений Ланцос" повинен бути з ним тісно пов'язаний, але ви маєте рацію - це, здається, безпосередньо стосується SVD. Не впевнений, як все це поєднується. Я оновлю свою відповідь, якщо я коли-небудь детальніше ознайомлюсь.
амеба каже, що повернеться до Моніки

1
@Dougal, я побіжно прочитав і зробив оновлення.
Амеба каже, що повернеться до Моніки

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

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

4

Я просто натрапив на нитку через гуглі швидкі SVD, тому я намагаюся сам з'ясувати речі, але, можливо, вам варто заглянути в адаптивне перехресне наближення (ACA).

ММ=i=0кUiViТN×NО(N) ). Так це дійсно швидко; на жаль, багато людей з легкістю використовують слово "швидкий".

Знову ж, це залежить від вашої проблеми, якщо це спрацює. У багатьох випадках, з якими я особисто стикаюся, ACA є дуже корисним числовим інструментом.

Примітка: я хотів написати це як коментар, але оскільки я просто створив цей обліковий запис, у мене недостатньо репутації для коментарів ... Але публікація працює.


2

Ось методика, яку я раніше успішно використовував для обчислення усіченого SVD (на наборі даних Netflix). Це взято з цієї статті . У налаштуваннях спільної фільтрації я маю зазначити, що більшість значень відсутні, і справа в тому, щоб передбачити їх , тому для вирішення такої проблеми використовуйте усічений SVD, ви повинні використовувати техніку, яка працює в цій умові. Короткий опис:

  1. Перш ніж робити що-небудь, підберіть просту модель (наприклад, середнє значення + значення постійних стовпців та рядків), і лише після того, як ви це зробите, слід перейти до використання усіченого SVD для підключення залишків.
  2. Ініціалізуйте випадковий вектор довжиною k (де це ранг, до якого ви підкоряєтеся) до кожного рядка та стовпця (до кожного фільму та користувача у випадку Netflix).
  3. Тримайте вектори рядків фіксованими та оновлюйте вектори стовпців, щоб мінімізувати помилки wrt відомих записів у матриці. Процедура наведена в коді matlab у статті.
  4. Тримайте вектори стовпців фіксованими та оновлюйте вектори рядків аналогічно.
  5. Повторюйте 3 і 4, поки ви не зблизитесь або не отримаєте достатньо хороших результатів.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.