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


12

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

Я створив випадкову матрицю розрідженої суміжності 1000x1000 і порівняв декілька методів на своєму ноутбуці x230 ubuntu 13.04:

  • scipy.sparse.linalg.eigs: 0,65 секунди
  • scipy.sparse.linalg.eigsh: 0,44 секунди
  • scipy.linalg.eig: 6,09 секунди
  • scipy.linalg.eigh: 1,60 секунди

За допомогою розріджених eigs та eigsh я встановлюю k, кількість бажаних власних значень та власних векторів, щоб бути ранг матриці.

Проблема починається з більших матриць - на матриці 9000x9000 знадобилось scipy.sparse.linalg.eigsh 45 хвилин!


1
NB. scipy.sparse.linalg.eigsh - це ARPACK
pv.

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

1
Це запитання було розміщено тут . Я рекомендую закрити перекладену версію.
Арон Ахмадія

2
Я хочу обчислити A ^ k. Після переосмислення я думаю, що з такою матрицею набагато швидше обчислити пряме множення (A A A ...) rathen, ніж використовувати ейгендекомпозицію. Звичайно, це залежить від k.
Ноам Пелед

2
Так, робіть це безпосередньо. Результати ейгендекомпозиції не є надто рідкими, тому у вас виникнуть проблеми зі зберіганням (тоді, знову ж таки, ні A ^ k, якщо k досить великий). Пов'язані stackoverflow.com/a/9495457/424631
dranxo

Відповіді:


6

FILTLAN - це бібліотека C ++ для обчислення внутрішніх власних значень розріджених симетричних матриць. Той факт, що існує цілий пакет, присвячений саме цьому, повинен говорити про те, що це досить важка проблема. Виявити найбільші чи найменші кілька власних значень симетричної матриці можна за допомогою зсуву / інвертування та використання алгоритму Ланцоса, але середина спектру - інша справа. Якщо ви хочете використовувати це, ви можете використовувати SWIG для виклику програми C ++ з python.

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

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

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

a = np.zeros(100,dtype=np.uint)

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

Ви також можете дослідити виклик паралельної розрідженої лінійної бібліотеки алгебри на зразок CUSP або cuSPARSE з Python, якщо швидкість викликає занепокоєння, і у вас є NVIDIA GPU.


1

Я хотів би прокоментувати відповідь Даніеля Шаперо, але мені не вистачає репутації SE.

Прийнята відповідь мене сильно бентежить. Я думаю, що режим переключення змін може бути легко використаний для обчислення власних значень інтер'єру. Дивіться: https://docs.scipy.org/doc/scipy/reference/tutorial/arpack.html

Щоб відповісти на початкове запитання: рідко трапляється так, щоб ви хотіли всіх власних значень великої розрідженої матриці. Зазвичай, вам потрібні крайності або якась група внутрішніх цінностей. У цьому випадку для ермітової матриці eigshшвидше. Для негермістів вам доведеться піти eigs. І вони набагато швидші, ніж нудні eigабо eigh.

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