Розуміння того, як Numpy робить SVD


13

Я використовував різні методи для обчислення як ранжування матриці, так і рішення матричної системи рівнянь. Я натрапив на функцію linalg.svd. Порівнюючи це з моїми власними зусиллями щодо розв’язання системи з Гауссовим усуненням, це здається і швидшим, і більш точним. Я намагаюся зрозуміти, як це можливо.

Наскільки мені відомо, функція linalg.svd використовує алгоритм QR для обчислення власних значень моєї матриці. Я знаю, як це працює математично, але я не знаю, як Numpy вдається це зробити так швидко і не втрачаючи особливої ​​точності.

Отже, моє запитання: як функція numpy.svd працює, а точніше, як це вдається зробити це швидко та точно (порівняно з елімінацією Гаусса)?


2
numpy використовує процедуру Lapack dgesddдля справжніх цінних SVD. Отже, ваше справжнє запитання, ймовірно, "як працює Lapack dgesdd?", І це зовсім не тема для stackoverflow.
талонії

Якщо ви дійсно цікаві, я б запропонував вивчити джерело LAPACK.

Дякую за ваші коментарі, і мої вибачення я поза офтопіком.
RobVerheyen

Ця публікація є перехресним повідомленням від переповнення стека . Перехресне опублікування зазвичай не рекомендується на сайтах Stack Exchange. Стандартний протокол для повторного розміщення запитання на іншому веб-сайті полягає в закритті, видаленні або переміщенні оригінальної публікації перед спробою повторного розміщення на іншому сайті. (Якщо ви перенесете питання, воно буде відмінено автоматично.)
Джефф Оксберрі

Вибачте, мені не було відомо про протокол. Я сподіваюся, що все-таки зможу отримати відповідь.
RobVerheyen

Відповіді:


15

У вашому запитанні є ряд питань.

Не використовуйте Гауссова елімінація (LU-факторизація) для обчислення числового рангу матриці. LU-факторизація для цієї мети недостовірна в арифметиці з плаваючою комою. Замість цього використовуйте ранг розкривається QR розкладання (наприклад, xGEQPXчи xGEPQYв LAPACK, де х C, D, S або Z, хоча ці процедури важко відстежити, см відповідь JedBrown на пов'язаний з цим питання ), або використовувати СВД (сингулярне розкладання значення, таке як xGESDDабо xGESVD, де x знову C, D, S або Z). SVD - більш точний, надійний алгоритм для визначення числового рангу, але він вимагає більше операцій з плаваючою комою.

Однак для вирішення лінійної системи факторизація LU (з частковим поворотом, що є стандартною реалізацією в LAPACK) є надзвичайно надійною на практиці. Існують деякі патологічні випадки, коли факторизація LU з частковим поворотом нестабільна (див. Лекцію 22 у числовій лінійній алгебрівід Трефетена та Бау для деталей). QR-факторизація - це більш стабільний чисельний алгоритм для розв’язання лінійних систем, імовірно, тому він дає вам такі точні результати. Однак, для квадратних матриць потрібні більше операцій з плаваючою комою, ніж LU-коефіцієнт (коефіцієнт 2) (я вважаю, що JackPoulson може мене виправити на цьому). Для прямокутних систем QR-факторизація є кращим вибором, оскільки вона дасть рішення з найменшими квадратами для занадто визначених лінійних систем. SVD також можна використовувати для вирішення лінійних систем, але це буде дорожче, ніж QR-факторизація.

janneb вірно, що numpy.linalg.svd є обгорткою xGESDDв LAPACK. Сингулярні декомпозиції величин проходять у два етапи. По-перше, матриця, що розкладається, зводиться до бідіагональної форми. Алгоритм, який використовується для приведення до бідіагональної форми в LAPACK, ймовірно, алгоритм Лоусона-Хансона-Чана, і він використовує QR-факторизацію в один момент. Лекція 31 з числової лінійної алгебри Трефетена та Бау дає огляд цього процесу. Потім xGESDDвикористовує алгоритм ділення і перемоги для обчислення значень сингулярності та лівого та правого сингулярних векторів з бідіагональної матриці. Щоб ознайомитись з цим кроком, вам потрібно буде проконсультуватися з матричними обчисленнями Голуба та Вану Кредита, або з прикладною числовою лінійною алгеброю Джима Деммеля.

Нарешті, не слід плутати однинні значення з власними значеннями . Ці два набори величин неоднакові. SVD обчислює сингулярні значення матриці. Числові обчислення Cleve Moler з MATLAB дає хороший огляд відмінностей між сингулярними значеннями та власними значеннями . Взагалі немає очевидного зв’язку між сингулярними значеннями даної матриці та її власними значеннями, за винятком звичайних матриць, де сингулярні значення є абсолютним значенням власних значень.


Я думаю, що "не пов'язане" є досить сильним для зв'язку між власними значеннями та одиничними значеннями. Відносини є досить неясними, якщо ви не знаєте повного розкладу вашої матриці в Йорданії, але ви можете використовувати одну для отримання оцінок іншої, якщо у вас є інформація (або ви готові робити припущення) про згадану декомпозицію Йорданії.
День

Що б ти запропонував замість цього?
Джефф Оксберрі

Перш за все, дякую за детальну відповідь. Я з’ясував, що не можу використовувати декомпозицію LU, щоб визначити матричний ранг важким шляхом. Здається, ваша відповідь означає, що QR-факторизація насправді буде швидшим методом вирішення моєї проблеми, правда? Чи є явна перевага у використанні SVD? Я добре знав той факт, що поодинокі значення не є власними значеннями. Я мав на увазі той факт, що поодинокі значення можна обчислити як власні значення матриці, помноженої на її перенесення зліва. Вибачте, що було не ясно.
RobVerheyen

Я можу додати, що матриця, яку я розв'язую, насправді є єдиною. Насправді ранг матриці становить лише приблизно половину розміру матриці. Можливо, це робить якийсь метод більш переважним?
RobVerheyen

1
@RobVerheyen: QR буде повільнішим, ніж LU, але значно точнішим. SVD буде навіть повільніше, ніж QR, але SVD вважається найнадійнішим методом визначення числового рангу (наприклад, MATLAB використовує SVD у своїй rankфункції). Існує також трохи розсуду при використанні будь-якого підходу; у підході до SVD числовий ранг - це кількість сингулярних значень вище визначеного (як правило, дуже малого) відрізку. (Підхід QR подібний, але замінює поодинокі значення діагональними записами матриці R.)
Джефф Оксберрі

8

Зважаючи на формулювання вашого запитання, я припускаю, що ваша матриця квадратна. SVD-процедури LAPACK, такі як zgesvd , по суті, тривають у три етапи для квадратних матриць:

  1. UAVAAB:=UAHAVAUAVABO(n3)
  2. {UB,VB,Σ}B=UBΣVBHO(n2)O(n3)
  3. UABVAH=AA=(UAUB)Σ(VAVB)HUAVAUBVBO(n3)

7

numpy.linalg.svd - обгортка навколо {Z, D} GESDD від LAPACK. LAPACK, у свою чергу, дуже ретельно написаний деякими передовими світовими експертами з числової лінійної алгебри. Дійсно, було б дуже дивно, якби хтось із не надто знайомих із цим полем досяг успіху перемогти ЛАПАК (ні за швидкістю, ні за точністю).

Що стосується того, чому QR краще, ніж усунення Гаусса, це, мабуть, більше підходить для /scicomp//


Дякую за відповідь та довідку. Я спробую там.
RobVerheyen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.