Характеристический многочлен и почему это плохая идея
Степенной метод для нахождения ведущего (максимального по модулю) собственного значения и собственного вектора
Теорема Шура: A = U T U^*
Нормальные матрицы: A^* A = A A^*
Продвинутая тема: псевдоспектр
Сегодняшняя лекция
Сегодня мы поговорим о матричных разложениях как общем инструменте
Основные матричные разложения в вычислительной линейной алгебре:
LU-разложение и метод Гаусса — уже рассмотрены
QR-разложение и алгоритм Грама-Шмидта
Разложение Шура и QR-алгоритм
Методы вычисления SVD-разложения
Мы уже вводили QR-разложение некоторое время назад, но теперь мы обсудим его более подробно.
Общая концепция матричных разложений
В вычислительной линейной алгебре нам нужно решать различные задачи, например:
Решать линейные системы Ax = f
Вычислять собственные значения / собственные векторы
Вычислять сингулярные значения / сингулярные векторы
Вычислять обратные матрицы, иногда даже определители
Вычислять матричные функции такие как \exp(A), \cos(A) (это не поэлементные функции)
Для этого мы представляем матрицу как сумму и/или произведение матриц с более простой структурой, чтобы решать упомянутые задачи быстрее / в более стабильной форме.
Что такое более простая структура?
Что такое более простая структура
Мы уже встречали несколько классов матриц со структурой.
Для плотных матриц наиболее важными классами являются
унитарные матрицы
верхние/нижние треугольные матрицы
диагональные матрицы
План
План сегодняшней лекции - обсудить разложения одно за другим и указать: - Как вычислить конкретное разложение - Когда разложение существует - Что делается в реальной жизни (LAPACK).
Разложения, которые мы хотим обсудить сегодня
LU-разложение и разложение Холецкого — краткое напоминание, уже рассмотрены.
QR-разложение и алгоритм Грама-Шмидта
PLU разложение
Любая невырожденная матрица может быть представлена в виде
A = P L U,
где P - матрица перестановки, L - нижняя треугольная матрица, U - верхняя треугольная.
Основная цель LU разложения - решение линейных систем, потому что
A^{-1} f = (L U)^{-1} f = U^{-1} L^{-1} f,
и это сводится к решению двух линейных систем
L y = f, \quad U x = y
с нижней и верхней треугольными матрицами соответственно.
Вопрос: какова сложность решения этих линейных систем?
Положительно определенные матрицы и разложение Холецкого, напоминание
Если матрица эрмитова положительно определенная, т.е.
A = A^*, \quad (Ax, x) > 0, \quad x \ne 0,
то она может быть представлена в виде
A = RR^*,
где R - нижняя треугольная матрица.
Это нам понадобится для QR разложения.
QR разложение
Следующее разложение: QR разложение.
Опять же из названия понятно, что матрица представляется в виде произведения
A = Q R,
где Q - ортогональная (унитарная) по столбцам матрица, а R - верхняя треугольная матрица.
Размеры матриц: Q имеет размер n \times m, R имеет размер m \times m если n\geq m. Смотрите наш постер для визуализации QR разложения
QR разложение определено для любой прямоугольной матрицы.
QR разложение: применения
Это разложение играет ключевую роль во многих задачах: - Вычисление ортогональных базисов в линейном пространстве - Используется в предварительной обработке для SVD - QR-алгоритм для вычисления собственных векторов и собственных значений (один из 10 самых важных алгоритмов 20-го века) основан на QR разложении - Решение переопределенных систем линейных уравнений (задача линейных наименьших квадратов)
QR разложение и метод наименьших квадратов
Предположим, нам нужно решить
\Vert A x - b \Vert_2 \rightarrow \min_x,
где A имеет размер n \times m, n \geq m.
Тогда мы факторизуем
A = Q R,
и используем уравнение для псевдообратной матрицы в случае матрицы A полного ранга:
Заметим, что это квадратная система линейных уравнений с нижней треугольной матрицей. Какова сложность решения этой системы?
Существование QR разложения
Теорема. Каждая прямоугольная матрица размера n \times m имеет QR разложение.
Существует несколько способов доказать это и вычислить его:
Теоретический: с использованием матриц Грама и разложения Холецкого
Геометрический: с использованием ортогонализации Грама-Шмидта
Практический: с использованием преобразований Хаусхолдера/Гивенса
Доказательство с использованием разложения Холецкого
Если у нас есть представление вида
A = QR,
тогда A^* A = ( Q R)^* (QR) = R^* (Q^* Q) R = R^* R, матрица A^* A называется матрицей Грама, и её элементы являются скалярными произведениями столбцов матрицы A.
Доказательство с использованием разложения Холецкого (полный ранг по столбцам)
Предположим, что A имеет полный ранг по столбцам. Тогда легко показать, что A^* A положительно определена:
(A^* A y, y) = (Ay, Ay) = \Vert Ay \Vert^2 > 0, \quad y\not = 0.
Следовательно, A^* A = R^* R всегда существует.
Тогда матрица Q = A R^{-1} является унитарной:
(A R^{-1})^* (AR^{-1})= R^{-*} A^* A R^{-1} = R^{-*} R^* R R^{-1} = I.
Доказательство с использованием разложения Холецкого (случай неполного ранга)
Когда матрица n \times m не имеет полного ранга по столбцам, она называется матрицей неполного ранга.
QR разложение, однако, также существует.
Для любой матрицы неполного ранга существует последовательность матриц полного ранга по столбцам A_k такая, что A_k \rightarrow A (почему?).
Каждая A_k может быть разложена как A_k = Q_k R_k.
Множество всех унитарных матриц компактно, поэтому существует сходящаяся подпоследовательность Q_{n_k} \rightarrow Q (почему?), и Q^* A_k \rightarrow Q^* A = R, которая является треугольной.
Устойчивость QR разложения через разложение Холецкого
Итак, простейший способ вычислить QR разложение:
A^* A = R^* R,
и
Q = A R^{-1}.
Это плохая идея с точки зрения численной устойчивости. Давайте рассмотрим пример (для подматрицы матрицы Гильберта).
import numpy as npn =20r =9a = [[1.0/ (i + j +0.5) for i inrange(r)] for j inrange(n)]a = np.array(a)q, Rmat = np.linalg.qr(a)e = np.eye(r)print('Built-in QR orth', np.linalg.norm(np.dot(q.T, q) - e))gram_matrix = a.T.dot(a)Rmat1 = np.linalg.cholesky(gram_matrix)#q1 = np.dot(a, np.linalg.inv(Rmat1.T))q1 = np.linalg.solve(Rmat1, a.T).Tprint('Via Cholesky:', np.linalg.norm(np.dot(q1.T, q1) - e))
Built-in QR orth 7.668461578388947e-16
Via Cholesky: 0.9966594169095181
Второй способ: ортогонализация Грама-Шмидта
QR разложение - это математический способ записи процесса ортогонализации Грама-Шмидта.
Имея последовательность векторов a_1, \ldots, a_m, мы хотим найти ортогональный базис q_1, \ldots, q_m такой, что каждый a_i является линейной комбинацией этих векторов.
Заметим, что преобразование от Q к A имеет треугольную структуру, так как из k-го вектора мы вычитаем только предыдущие. Это следует из того факта, что произведение треугольных матриц является треугольной матрицей.
Модифицированный метод Грама-Шмидта
Метод Грама-Шмидта может быть очень неустойчивым (т.е. полученные векторы не будут ортогональными, особенно если q_k имеет малую норму).
Это называется потерей ортогональности.
Существует решение, называемое модифицированным методом Грама-Шмидта. Вместо того, чтобы делать
В точной арифметике это одно и то же. В арифметике с плавающей точкой это абсолютно разные вещи!
Обратите внимание, что сложность составляет \mathcal{O}(nm^2) операций
n =100a = np.random.rand(n)b = a +1e-9*np.random.randn(n)a = a/np.linalg.norm(a)c = b - np.dot(b, a)*ac = c/np.linalg.norm(c)print(np.dot(c, a))c = c - np.dot(c, a)*ac = c/np.linalg.norm(c)print(np.dot(c, a))
-1.3558882440423137e-07
5.551115123125783e-17
QR разложение: (почти) практический способ
Если A = QR, то
R = Q^* A,
и нам нужно найти определенную ортогональную матрицу Q, которая приводит матрицу к верхнетреугольной форме.
- Для простоты мы будем искать матрицу n \times n такую, что
и произведение унитарных матриц является унитарной матрицей.
Сложность каждого шага составляет \mathcal{O}(n^3), если выполняется общее QR разложение.
Мы надеемся, что A_k будет очень близка к треугольной матрице для достаточно большого k.
import numpy as npn =40a = [[1.0/(i - j +0.5) for i inrange(n)] for j inrange(n)]a = np.array(a)niters =10000for k inrange(niters): q, rmat = np.linalg.qr(a) a = rmat.dot(q)print('Leading 3x3 block of a:')print(a[:4, :4])