Діагоналізація щільних умовних матриць


10

Я намагаюсь діагоналізувати деякі щільні, погано обумовлені матриці. У машинній точності результати є неточними (повертаючи негативні власні значення, власні вектори не мають очікуваної симетрії). Я перейшов на функцію Eigensystem [] Mathematica, щоб скористатися довільною точністю, але обчислення надзвичайно повільні. Я відкритий для будь-якої кількості рішень. Чи є пакети / алгоритми, які добре підходять до проблем, що не обумовлені? Я не фахівець з передумови, тому я не впевнений, наскільки це може допомогти. Інакше все, що я можу придумати, - це паралелізовані довільні точні вирішення власних значень, але я не знайомий ні з чим, крім Mathematica, MATLAB та C ++.

Для ознайомлення з проблемою матриці великі, але не величезні (максимум від 4096x4096 до 32768x32768). Вони реальні, симетричні, а власні значення обмежені між 0 і 1 (винятково), при цьому багато власних значень дуже близькі до 0 і жодні не близькі до 1. Матриця по суті є оператором згортки. Мені не потрібно діагоналізувати всі мої матриці, але чим більше я можу пройти, тим краще. У мене є доступ до обчислювальних кластерів з багатьма процесорами та розподіленими можливостями обчислень.

Дякую


2
Яку рутину ви використовуєте для діагоналізації реальних симетричних матриць? І в якому сенсі розклад власного значення неточний?
Джек Поульсон

Ось ідея, пов’язана з відповіддю Арнольда: виконайте розкладку Холеського матриці SPD, а потім знайдіть сингулярні значення щойно отриманого трикутника Холеського, можливо, використовуючи алгоритм типу dqd для збереження точності.
JM

1
@JM: Формування декомпозиції Холеського числово-сингулярної позитивної певної матриці є чисельно нестабільним звичайним методом, оскільки, ймовірно, зустрічаються негативні повороти. (Наприклад, chol (A) Матлаба, як правило, не вдається.) Треба було б встановити їх на нуль і знищити відповідні рядки факторів. Це дає змогу надійно отримати числовий нульовий простір.
Арнольд Ноймаєр

@Arnold, якщо пам'ять, є адаптації Холецкого , які використовують симетричний поворот для тих випадків , коли матриця позитивний підлогу -definite (або майже так). Можливо, їх можна використати ...
JM

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

Відповіді:


7

Обчисліть СВД на місці спектрального розкладання. Результати однакові в точній арифметиці, оскільки ваша матриця є симетричною позитивно визначеною, але з арифметикою з кінцевою точністю ви отримаєте невеликі власні значення з набагато більшою точністю.

Редагувати: Див. Деммель і Кахан, Точні сингулярні значення бідіагональних матриць, SIAM J. Sci. Стат. Обчислення. 11 (1990), 873-912.
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf

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


[0,BT;B,0]

2
@JackPoulson: Справа в тому, що бідіагональна форма значно краще визначає невеликі сингулярні значення. Пов'язана симетрична тридіагональна форма має нулі на діагоналі, які зберігаються бідіагональним зведенням до діагоналі, а не QR, застосованими до тридіагоналі.
Арнольд Ноймаєр

1
Довідка? Метод Якобі, як відомо, є високоточним (хоча і повільним).
Джек Поульсон

@JackPoulson: Спробуйте і подивіться. Деммель і Кахан, точні сингулярні значення бідіагональних матриць, 202.38.126.65/oldmirrors/ftp.netlib.org/lapack/lawnspdf/…
Арнольд Ноймаєр

[0,BT;B,0]

1

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

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


Я не перевіряв цього, але тут є реалізація MATLAB: groups.google.com/forum/?fromgroups#!msg/sci.math.num-analysis/…
Джек Поульсон

Зауважте, що жоден метод не зможе вирішити власні значення, менші ніж приблизно від норми, що перевищує точність машини, що використовується, оскільки зміна одного запису одним ulp вже може значно змінити невелике власне значення. Таким чином, отримання нульових власних значень замість дуже крихітних є доцільним, і жоден метод (крім роботи з більш високою точністю) не роз'єднає відповідні власні вектори, а просто поверне основу для загального числового нульового простору. Для чого потрібні власні значення?
Арнольд Ноймайер

@ArnoldNeumaier: Я провів деякі тести в MATLAB з власними значеннями в діапазоні [0,1], з одним власним значенням вручну, встановленим на значення, такі як 6.3e-16, і SVD-програмою Octave (на основі dgesvd, яка використовує скорочення до бідіагональної та тоді QR) підбирає ці значення набагато точніше, ніж егма Октава. Зв'язаний код Якобі здається занадто повільним у використанні, навіть на матрицях скромного розміру.
Джек Поульсон

@JackPoulson: Так. Але Лей, схоже, скаржиться на кілька дуже крихітних власних значень, і їхні власні вектори рідко будуть такими, які були розроблені, але будуть змішуватися вільно, незалежно від того, який метод використовується. І позитивні дуже крихітні позитивні значення (менші ніж 1e-16), звичайно, знайдуться нульовими.
Арнольд Ноймаєр

@ArnoldNeumaier правий, що я знаходжу кілька дуже малих власних значень, які, напевно, посилює проблему. Я не розумів (хоча в ретроспективі це очевидно), що власні значення менше 1e-16 будуть нульовими в плаваючій точці. Я думаю, що хоча число може бути збережене, помилка округлення виникає при додаванні його до більшого числа. Власні вектори мені кажуть, чи вирішується певна проблема. Власний вектор дозволяє розкласти задачу на розв'язні та нерозв'язні частини. Якщо я принципово обмежений точністю, то чи можете ви порекомендувати будь-які пакети для швидшого вирішення?
Лі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.