2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Посчитать правые сингулярные векторы у стоячей матрицы
Сообщение19.03.2021, 13:54 


11/08/18
363
Добрый день,

пусть у нас есть стоячая матрица $A \in {\mathbb R}^{N \times M}$, $N>>M$, заданная с машинной точностью $\epsilon$, и мне надо найти правые сингулярные векторы $V$ и сингулярные значения $\diag(\sigma_1,\dots,\sigma_M)=D$, сингулярного разложения $A = UDV^T$.

Неприятность в том, что памяти есть только на несколько копий $M^2$, а вот всю $A$ в память поместить не получается, да и $N$ на столько много больше $M$, что могут набегать ошибки округления. Матрица $A$ подается по строково, и вернуться и прочитать предыдущую строку нет. Можно хранить несколько строк, порядка $M$ в памяти.

Наивный способ решения строить $A^T A$ и считать $V$ как собственные вектора, а из собстенных значений извлекая из них корень получать сингулярные числа.

В реальности это приводит к тому, что:

$N = 2^{20}, M=10$ точность элементов $A$ - 24 бита, и для надежного вычисления $A^T A$ нам необходимо строить ее с точностью $24*2+20 = 68$ бит. Не мало, к сожалению, но ничего не поделать, в double-double влезет, но уже lapack не вызовешь.

Альтернативно была идея делать что-то типа ранг-ревеалинга у $A^T = QRP$, ($P$ - матрица перестановок от rank-revealing) и предполагать, что $QR R^T Q^T$, вернее $R R^T$ будет строиться как-то лучше, но что-то подсказывает, что это подход в никуда.

Скажите, пожалуйста, есть ли какой-то красивый способ найти правые сингулярные вектора не возведя в квадрат обусловленность матрицы?

Спасибо!

 Профиль  
                  
 
 Re: Посчитать правые сингулярные векторы у стоячей матрицы
Сообщение24.03.2021, 09:20 
Заслуженный участник
Аватара пользователя


11/03/08
10040
Москва
0. Насколько действительно серьёзна эта проблема? Всё-таки "число обусловленности" это скорее к решению уравнений относится. Ну и закладываться на наихудший случай можно, но слишком накладно. Опять же - 24 бита это мантисса типа single? Может, просто использовать немудрёный double? Или это точность входных данных, определяемая, скажем, применяемым АЦП? В общем, нужно ли сразу паниковать, или "и так сойдёт"?
1. Можно ли повторно получить матрицу А ("считаем на лету" или "данные на магнитной ленте, прочитали до конца и можно перемотать")? В последнем случае можно попробовать итеративно уточнять. Скажем, имея оценку V и D, каждую i-тую строку $A_i$ домножать слева $B_i=A_iD^{-1}V^T$, и затем использовать для расчёта $B^TB$, разложение которой даст поправки к V и D.
2. Если можно рассматривать первые M строк, как "типовые", можно по ним рассчитать разложение и его использовать для коррекции последующих строк.
3. Для "не возведя в квадрат", боюсь, понадобится произвольный доступ ко всем элементам А. Скажем, описанный в древнем ("...на языке Algol-60") справочнике Уилкинсона и Райнша алгоритм через переход к двухдиагональной матрице и затем QR-разложение её. Я не вижу способа реализовать при указанном способе доступа (но не присягну, что его вовсе нет, хотя очень сильно это подозреваю).

 Профиль  
                  
 
 Re: Посчитать правые сингулярные векторы у стоячей матрицы
Сообщение27.03.2021, 12:52 


11/08/18
363
Спасибо большое Евгений Машеров, за ответы!


0. ресурсов не хватает, поэтому стала серьезной.
1. Данные приходят с АЦП, имеют 24 бита (в скором времени будут 32 бита иметь), и, перемотать их нельзя.

Цитата:
2. Если можно рассматривать первые M строк, как "типовые"

пока делал именно так, или уменьшал мантиссу у сумматора.

Данных может быть много, вплоть до $2^{30}$, в этом случае, и если мантисса 32 бита, надо копить на 94 бита.

Накапливание происходит на FPGA (у нее очень мало памяти), считать можно уже в обычном компьютере, где ограничения по памяти почти нет, но собирать данные и сразу передавать в компьютер не получается, трафик большой. Грубо говоря, у меня за секунду приходит $N=2\times10^8$ и $M=200$ по 24 бита, то есть десятки гигабайт, то есть адекватным способом забрать их в компьютер нельзя.

В то же время, $A^T A$ для $M=200$ по 94 бит - это 240КБайт - что есть очень обозримо.

При внимательном осмотре данных, вернее переводя собственные числа $A^T A$ в сингулярные $A$, в спектре сингулярных чисел $A$ у меня имеется разброс больше мантиссы исходных чисел, но меньше мантиссы + число отсчетов. То есть пусть мантисса 24 бита, и 1 миллион отсчетов. В спектре сингулярных чисел $A$ у меня имеется важные для меня сингулярные числа, которые меньше главного примерно в $2^{28}$ раз.

Это все приводит к тому, что 60 бит - это минимум, с которым я долен копить $A^T A$, хотя надо реально точнее, то есть фактически по полной $20+24 \times 2=68$ и даже на обычном процессоре, когда я считаю задачу с собственными значениями для $A^T A$, надо как-то переходить к 4-ной точности, и так просто с лапака это не сделать. Приходится разлагать $A^T A$ Холецким с ведущим элементом, вручную его запрограммировав в quad-double, ожидая, что такое разложение уменьшит обусловленность не в корень, но хоть во сколько-то, а потом у каждого фактора считать сингулярное разложение.

Если у меня будет 94 бита, то тут уже может и точности не хватить. Поэтому есть непреодолимое желание не возводить обусловленность в квадрат еще на процессе получения данных, ибо даже $N=2^{30}$ и 32 битная точность исходных данных - это всего-то 62 бита, и похоже у этой матрицы важные для меня сингулярные числа будут только в $2^{35}$-$2^{40}$ раз меньше главного.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: YandexBot [bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group