Який найшвидший спосіб обчислити найбільше власне значення загальної матриці?


27

EDIT: Я перевіряю, чи якісь власні значення мають величину одну або більше.

Мені потрібно знайти найбільше абсолютне власне значення великої розрідженої несиметричної матриці.

Я використовував eigen()функцію R , яка використовує альго QR або EISPACK або LAPACK, щоб знайти всі власні значення, а потім використовую abs()для отримання абсолютних значень. Однак мені потрібно зробити це швидше.

Я також спробував використовувати інтерфейс ARPACK в igraphпакеті R. Однак це дало помилку для однієї з моїх матриць.

Остаточна реалізація повинна бути доступною від Р.

Ймовірно, буде кілька власних значень однакової величини.

Чи є у вас якісь пропозиції?

EDIT: Точність лише повинна бути 1e-11. "Типовою" матрицею досі було . Мені вдалося зробити QR-факторизацію. Однак можливо також мати набагато більші. Наразі я починаю читати про алгоритм Арнольді. Я розумію, що це пов’язано з Ланчсосом.386×386

EDIT2: Якщо у мене є кілька матриць, які я "тестую", і я знаю, що є велика підматриця, яка не змінюється. Чи можна його ігнорувати / відкидати?


Дивіться мою відповідь тут: scicomp.stackexchange.com/a/1679/979 . Це актуальна тема дослідження і сучасні методи можуть зробити краще, ніж Ланцос. Проблема обчислення сингулярних значень еквівалентна проблемі обчислення власних значень.
dranxo

2
Матриця 400x400! = Велика. Також що означає найбільше, якщо "Можливо, буде кілька власних значень однакової величини"? У numpy land: linalg.eig (random.normal (size = (400,400))) займає близько півсекунди. Це занадто повільно?
meawoppl

@meawoppl так, півсекунди занадто повільно. Це тому, що це частина іншого альго, яке виконує цей розрахунок багато разів.
потужність

1
@power gotcah. Чи маєте ви наближення до власного вектора. тобто це, схоже, на останнє рішення, чи ви можете вигадати здогадки про його структуру?
meawoppl

Відповіді:


14

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

Якщо ваша матриця занадто велика, щоб дозволити одну факторизацію, і вам потрібна висока точність, алгоритм Ланчсоса, мабуть, найшвидший спосіб. У несиметричному випадку потрібен алгоритм Арнольді, який чисельно нестабільний, тому впровадження потребує вирішення цього питання (дещо незручно вилікувати).

Якщо це не так у вашій проблемі, дайте більш конкретну інформацію у своєму питанні. Потім додайте коментар до цієї відповіді, і я її оновлю.

Редагувати: [Це було для старої версії запитання, що стосується найбільшого власного значення.] Оскільки ваша матриця невелика і, мабуть, щільна, я б зробив ітерацію Арнольді на B = (IA) ^ {- 1}, використовуючи початкову перестановлена ​​трикутна факторизація ІА, щоб мати дешеве множення на Б. (Або обчислити явну зворотну, але це коштує в 3 рази більше, ніж факторизація.) Ви хочете перевірити, чи має В В негативне власне значення. Працюючи з B замість A, негативні власні значення значно краще відокремлюються, тому, якщо така є, ви повинні швидко сходитися.

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

Edit2: важко отримати з Арнольді певний підмножина інтересу. Щоб надійно отримати абсолютно найбільші власні значення, слід зробити ітерацію підпростору за допомогою оригінальної матриці з розміром підпростору, що відповідає або перевищує кількість власних значень, які, як очікується, будуть величиною близько 1 або більше. На малих матрицях це буде повільніше, ніж алгоритм QR, але на великих матрицях буде набагато швидше.


Мені потрібно перевірити, чи найбільше власне значення перевищує 1. Точність повинна бути лише 1e-11. "Типова" матриця наразі була 386 x 386. Мені вдалося зробити QR-факторизацію на ній. Однак можливо також мати набагато більші. Наразі я починаю читати про алгоритм Арнольді. Я розумію, що це пов’язано з Ланчсосом.
потужність

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

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

1
Це має більше сенсу, але тепер мій рецепт з працює добре лише в тому випадку, якщо бідне власне значення дійсно справжнє> 1. З іншого боку, нова інформація, ймовірно, означає, що у вас мало вибору, але обчислення всіх власних значень. - Будь ласка, оновіть своє запитання, щоб передати додаткову інформацію! (IA)1
Арнольд Ноймаєр

1
див. редагування 2 у моїй відповіді
Арнольд Ноймаєр

7

|λn1/λn|

λn1λn


1
що робити, якщо | λ (n − 1) | = | λ (n) | ?
потужність

@power, звичайна ітерація потужності не збігатиметься. Я не знаю, наскільки добре екстраполяційні методи будуть відрізняти різні власні значення, для цього вам доведеться прочитати документ.
Педро

2
|λn1|=|λn|λnλn1

чи є у вас посилання на науковий документ чи книгу, що це підтримує? Крім того, що робити, якщо \ lambda_ {n} є складним?
потужність

5
Якщо існує декілька різних власних значень максимального модуля, ітерація потужності конвергується лише за виняткових обставин. Він, як правило, коливається дещо непридатним чином.
Арнольд Ноймаєр

5

Останнім часом було проведено кілька хороших досліджень з цього приводу. Нові підходи використовують "рандомізовані алгоритми", для отримання яких потрібна лише декілька прочитань вашої матриці, щоб отримати хорошу точність на найбільших власних значеннях. Це на відміну від силових ітерацій, які потребують декількох матричних векторних множень для досягнення високої точності.

Більше про нове дослідження ви можете прочитати тут:

http://math.berkeley.edu/~strain/273.F10/martinsson.tygert.rokhlin.randomized.decomposition.pdf

http://arxiv.org/abs/0909.4061

Цей код зробить це за вас:

http://cims.nyu.edu/~tygert/software.html

https://bitbucket.org/rcompton/pca_hgdp/raw/be45a1d9a7077b60219f7017af0130c7f43d7b52/pca.m

http://code.google.com/p/redsvd/

https://cwiki.apache.org/MAHOUT/stochastic-singular-value-decomposition.html

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


4

Тут ви знайдете алгоритмічне вступ до алгоритму Якобі-Девідсона, який обчислює максимальне власне значення.

У цій роботі досліджено математичні аспекти. JD допускає загальні (реальні або складні) матриці і може використовуватися для обчислення діапазонів власних значень.

Тут ви можете знайти різні реалізації бібліотеки JDQR і JDQZ (включаючи інтерфейс C, до якого ви повинні мати можливість посилання з R).


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

Якщо в кожній статті прямо не вказано обмеження, і аргумент конвергенції покладається на обмеження, яке не має значення.
Помер смерть

Ось ще одне пояснення JD. Розглянуті матриці є абсолютно загальними. Ніякої спеціальної структури не використовується, і результати, характерні для ермітових матриць, порівнюються та протиставляються, наприклад, конвергенція для загальних матриць є квадратичною, але кубічна для ермітових матриць.
Смерть,

спасибі за це. Я не знаходжу жодного коду С для загальної матриці, тому мені доведеться написати свій власний. Посилання на алгоритми, здається, є лише для герметичних матриць.
потужність

1
@power ви також не знайдете в літературі результату, який стверджує, що стандартні реалізації QR-кодів сходяться для реальної, загальної матриці - це відкрита проблема, і насправді не так давно було знайдено контрприклад для QR-коду в LAPACK.
Федеріко Полоні

2

У своєму початковому дописі ви кажете:

"Я також спробував використовувати інтерфейс ARPACK в пакеті igraph R. Однак це дало помилку для однієї з моїх матриць."

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

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

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


Я побачу, чи зможу я тоді знайти свою роботу. Я працював над цим рік тому.
потужність

0

Це не найшвидший спосіб, але досить швидкий спосіб - просто натиснути (спочатку випадковий) вектор матрицею кілька разів, а потім нормалізувати кожні кілька кроків. Врешті-решт він перейде до найбільшого власного вектора, а коефіцієнт посилення в нормі для одного кроку - це пов'язане власне значення.

Це найкраще працює, коли найбільше власне значення значно більше, ніж будь-яке інше власне значення. Якщо інші власне близький за величиною до величини, це займе якийсь час , сходитися, і це може бути важко визначити , якщо він має сходилися.


1
Дякую Дену, проте: У моїх матрицях деякі інші власні значення будуть мати схожу (якщо не таку ж) величину, як найбільшу. Чи схожий ваш метод на ітерацію потужності та ітерацію квот Релея? Беттерсон і Сміллі (1990) пишуть, що для деяких несиметричних матриць ітерація квоти Релея не збігатиметься. Беттерсон, С., Сміллі, Дж. (1990) "Ітерація коефіцієнта Релея для несиметричних матриць", "Математика обчислень", т. 55, число 191, P 169 - 178
потужність

Якщо інші власні значення мають таку саму величину, як і найбільша ... то чи не є ці значення також "найбільші"?
ely

@EMS: Вони все ще будуть "найбільшими власними значеннями", але наявність більш ніж однієї з найбільших все одно призведе до зближення.
День

Мені просто цікаво, до якого власного значення ви хочете, щоб він сходився. Такі речі, як коефіцієнт коефіцієнта Релея / Сила, мають на увазі, коли існує чітке найбільше власне значення. У вашому запитанні пропонується знайти найбільше власне значення, але тоді це здається, що це насправді не визначено для вашої проблеми. Я просто введений в оману за назвою посади.
ely

-1

Пакет R RARPACK працює для мене. І це здається дуже швидким, оскільки це просто інтерфейс для ARPACK, стандартного пакету для розрідженої лінійної алгебри (мається на увазі обчислення кількох власних значень та власних векторів).


Ласкаво просимо до SciComp! Як зазначено в питанні, ARPACK не працює в рамках ОП, тому ця відповідь не дуже корисна.
Крістіан Класон

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