обчислюючи усічений SVD, одне особливе значення / вектор за один раз


11

Чи існує усічений алгоритм SVD, який обчислює поодинокі значення по одному?

Моя проблема: Я хотів би обчислити перші сингулярних значень (і сингулярних векторів) великої щільної матриці , але я не знаю, яке відповідне значення було б. великий, тому з міркувань ефективності я б краще не оцінював повний SVD лише для того, щоб урізати найменші SV.kMkM

В ідеалі, існує спосіб обчислити сингулярні значення послідовно, від найбільшого ( ) до найменшого ( ). Таким чином, я можу просто зупинити обчислення після обчислення го значення однини, якщо опуститься нижче деякого порогу.σ1,σ2,σ1σnkσk/σ1

Чи існує такий алгоритм (бажано з реалізацією Python)? У своєму гугленні я знайшов лише усічені SVD-функції, які приймають k як параметр, змушуючи вас вгадувати це апріорі.


Ваш квадрат M або прямокутний? Якщо прямокутний, чи потрібні вам довгі чи короткі однинні вектори? Тобто, якщо M є (mxn) з m> n, ви хочете (mxk) або (kxn)?
Макс Хатчінсон

M прямокутний, із значно більшою кількістю рядків, ніж стовпці. Я хочу, щоб короткі сингулярні вектори (тобто V, в M = U S V ^ T).
SuperElectric

Відповіді:


6

Існує пара варіантів, якщо ви хочете орієнтовно оцінити коефіцієнти.

  1. Чітко розкриваючі QR-фактори
  2. Інтерполятивне розкладання (ІД) та інші рандомізовані методи.

Взагалі кажучи, вони забезпечують факторизацію форми

AMNTfactor×σk+1(A):=ϵ

Орієнтовна факторизація вищевказаної форми може бути перетворена на стандартне розкладання, наприклад QR або SVD, використовуючи стандартні методи. Хороший огляд доступний у статті Халко, Мартинссона та Троппа "Пошук структури з випадковістю: ймовірнісні алгоритми побудови наближених матричних декомпозицій"

Що стосується програмного забезпечення, то інтерфейс до алгоритмів ідентифікаторів доступний у scipy (scipy.linalg.interpolative) http://docs.scipy.org/doc/scipy-dev/reference/linalg.interpolative.html, що дозволяє користувачеві вказувати .ϵ


2

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

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

Іншою стратегією було б таке:

  • Обчисліть найбільше значення однини .s1
  • Встановіть абсолютну толерантність розрідженої програми SVD на , де - ваш поріг, а - деякий фактор безпеки, щоб визначити, скільки можливо сторонніх сингулярних значень потрібно обчислити.τs1fτ0<f1
  • Виклик розрідженої SVD-програми.

Якщо розріджена програма SVD обчислює тонку SVD (і я не можу зрозуміти, чому б цього не сталося), то ця стратегія дає всі ті особливі значення, які ви хочете (плюс, можливо, деякі додаткові), оскільки значення нижче абсолютного допуску будуть трактуватимуться як нуль. У цьому випадку ви можете використовувати scipy.sparse.linalg.svds , зазначивши, що - необов'язковий параметр, і вам не потрібно його вказувати апріорі .k


Якщо ви не вказали 'k' у scipy.sparse.linalg.svds, він буде за замовчуванням до k = 6, незалежно від параметра 'tol'. Не ясно, чи це помилка, чи якщо "tol" повинен посилатися на точність обчислених сингулярних значень (а не на їх розмір)
Нік Алгер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.