Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов
| Файл:Symbol wait.svg | Эта работа ждет рассмотрения преподавателем Дата последней правки страницы: 20.11.2016 Авторы этой статьи считают, что задание выполнено. |
| Метод Якоби вычисления сингулярных чисел и векторов | |
| Последовательный алгоритм | |
| Последовательная сложность | [math]\displaystyle{ O(n^3) }[/math] |
| Объём входных данных | [math]\displaystyle{ n^2 }[/math] |
| Объём выходных данных | [math]\displaystyle{ 2n^2 + n }[/math] |
| Параллельный алгоритм | |
| Высота ярусно-параллельной формы | [math]\displaystyle{ O(n^2) }[/math] |
| Ширина ярусно-параллельной формы | [math]\displaystyle{ O(n) }[/math] |
Авторы статьи: Давлетшина Александра (группа 619); Зайцева Александра. Вклад каждого участника считать равноценным.
Свойства и структура алгоритма
Общее описание алгоритма
Сингулярным разложением называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:
• левые сингулярные векторы матрицы А — это собственные векторы матрицы [math]\displaystyle{ AA^* }[/math];
• правые сингулярные векторы матрицы A — это собственные векторы матрицы [math]\displaystyle{ A^*A }[/math].
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: Образом любого линейного преобразования, заданного с помощью матрицы [math]\displaystyle{ m }[/math]x[math]\displaystyle{ n }[/math], примененного к единичной сфере является гиперэллипсоид.
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: [math]\displaystyle{ A=U\Sigma V^* }[/math], где [math]\displaystyle{ U, V }[/math] – унитарные матрицы, а [math]\displaystyle{ \Sigma }[/math] – диагональная матрица с вещественными положительными числами на диагонали [1].
Диагональные элементы матрицы [math]\displaystyle{ \Sigma }[/math] называются сингулярными числами матрицы [math]\displaystyle{ A }[/math], а столбцы матриц [math]\displaystyle{ U,V }[/math] левыми и правыми сингулярными векторами соответственно.
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.
Неявный[2] метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице [math]\displaystyle{ A = G^TG }[/math]. Это значит, что на каждом шаге вычисляется вращение Якоби [math]\displaystyle{ J }[/math], с помощью которого матрица [math]\displaystyle{ G^TG }[/math] неявно пересчитывется в [math]\displaystyle{ J^TG^TGJ }[/math]; вращение выбрано так, чтобы пара внедиагональных элементов из [math]\displaystyle{ G^TG }[/math] обратилась в нули в матрице [math]\displaystyle{ J^TG^TGJ }[/math]. При этом ни [math]\displaystyle{ G^TG }[/math], ни [math]\displaystyle{ J^TG^TGJ }[/math] не вычисляются в явном виде; вместо них вычисляется матрица [math]\displaystyle{ GJ }[/math]. Поэтому алгоритм называется методом односторонних вращений.
Математическое описание алгоритма
Исходные данные: матрица [math]\displaystyle{ G }[/math] (элементы [math]\displaystyle{ g_{ij}, i, j = 1, \ldots, n }[/math]).
Вычисляемые данные: матрица [math]\displaystyle{ \Sigma = diag(\sigma_{i}) }[/math], где [math]\displaystyle{ \sigma_{i} }[/math] - сингулярные числа, [math]\displaystyle{ U }[/math] - матрица левых сингулярных векторов, [math]\displaystyle{ V }[/math] - матрица правых сингулярных векторов.
симметричную матрицу [math]\displaystyle{ A = (G^TG) }[/math] можно привести к диагональному виду: [math]\displaystyle{ RG^TGR^T }[/math], где
[math]\displaystyle{ R(j,k,\theta) = \begin{matrix} \\ \\ \\ j \\ \\ k \\ \\ \\ \\ \end{matrix} }[/math] [math]\displaystyle{ \begin{bmatrix} & 1 & & & & & & & & \\ & & 1 & & & & & & & \\ & & & \ddots & & & & & & \\ & & & & \cos(\theta) & & -\sin(\theta) & & & \\ & & & & & \ddots & & & & \\ & & & & \sin(\theta) & & \cos(\theta) & & & \\ & & & & & & & \ddots & & \\ & & & & & & & & 1 & \\ & & & & & & & & & 1 \\ \end{bmatrix} }[/math]
Обозначим [math]\displaystyle{ s = \sin \theta }[/math] и [math]\displaystyle{ c = \cos \theta }[/math].
Перемножив матрицы [math]\displaystyle{ RG^TGR^T }[/math], получим следующие выражения[3]:
[math]\displaystyle{ \begin{align} a_{jj}^{(i+1)} &= c^2\, a_{jj}^{(i)} - 2\, s c \,a_{jk}^{(i)} + s^2\, a_{kk}^{(i)} \\ a_{kk}^{(i+1)} &= s^2 \,a_{jj}^{(i)} + 2 s c\, a_{jk}^{(i)} + c^2 \, a_{kk}^{(i)} \\ a_{jk}^{(i+1)} &= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)} + s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\ a_{jm}^{(i+1)} &= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)} - s \, a_{km}^{(i)} & m \ne j,k \\ a_{km}^{(i+1)} &= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)} + c \, a_{km}^{(i)} & m \ne j,k \\ a_{ml}^{(i+1)} &= a_{ml}^{(i)} &m,l \ne j,k \end{align} }[/math]
Т.к внедиагональные элементы должны быть равны 0, то выбираем [math]\displaystyle{ \theta }[/math] так, чтобы [math]\displaystyle{ a_{jk}^{(i+1)} = 0 }[/math] и [math]\displaystyle{ a_{kj}^{(i+1)} = 0 }[/math].
Тогда решая уравнение получаем, что
[math]\displaystyle{ \begin{align} \tau &= ({a_{jj} - a_{kk}})/{2a_{jk}} \\ t &= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\ c &= 1/(\sqrt{1 + t^2}) \\ s &= ct \\ \end{align} }[/math]
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа [math]\displaystyle{ \varepsilon }[/math].
Вычислительное ядро алгоритма
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы [math]\displaystyle{ g_{jm}^{(i+1)} = g_{mj}^{(i+1)} }[/math] и [math]\displaystyle{ g_{km}^{(i+1)} = g_{mk}^{(i+1)} }[/math], [math]\displaystyle{ m \ne j,k }[/math], а также вычисления элементов [math]\displaystyle{ g_{jj}^{(i+1)} }[/math] и [math]\displaystyle{ g_{kk}^{(i+1)} }[/math], получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:
[math]\displaystyle{ \begin{align} g_{jj}^{(i+1)} &= c^2\, g_{jj}^{(i)} - 2\, s c \,g_{jk}^{(i)} + s^2\, g_{kk}^{(i)} \\ g_{kk}^{(i+1)} &= s^2 \,g_{jj}^{(i)} + 2 s c\, g_{jk}^{(i)} + c^2 \, g_{kk}^{(i)} \\ g_{jk}^{(i+1)} &= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)} + s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\ g_{jm}^{(i+1)} &= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)} - s \, g_{km}^{(i)} & m \ne j,k \\ g_{km}^{(i+1)} &= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)} + c \, g_{km}^{(i)} & m \ne j,k \\ g_{ml}^{(i+1)} &= g_{ml}^{(i)} &m,l \ne j,k \end{align} }[/math]
Макроструктура алгоритма
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:
- Вычисление [math]\displaystyle{ \tau, c, s, t }[/math].
- Одностороннее вращение матрицы.
Что требует [math]\displaystyle{ O(n) }[/math] операций.
После этого необходимо:
- Вычислить сингулярные числа [math]\displaystyle{ \sigma_i }[/math]. Что требует [math]\displaystyle{ O(n) }[/math] операций.
- Вычислить [math]\displaystyle{ U }[/math] и [math]\displaystyle{ V }[/math]. Что требует [math]\displaystyle{ O(n^2) }[/math] операций.
Схема реализации последовательного алгоритма
Применение метода Якоби к матрице [math]\displaystyle{ A = (G^TG) }[/math] можно описать следующим образом[4]:
Если [math]\displaystyle{ G = U\Sigma V^T }[/math] и [math]\displaystyle{ \Sigma = diag(\sigma_{i}) }[/math], то алгоритм вычисляет сингулярные числа [math]\displaystyle{ \sigma_{i} }[/math], матрицу [math]\displaystyle{ U }[/math] левых сингулярных векторов и матрицу [math]\displaystyle{ V }[/math] правых сингулярных векторов по следующей схеме:
repeat
for [math]\displaystyle{ j=1 }[/math] to [math]\displaystyle{ n-1 }[/math]
for [math]\displaystyle{ k=j+1 }[/math] to [math]\displaystyle{ n }[/math]
обратиться к процедуре One-Sided-Jacobi-Rotation[math]\displaystyle{ (G,j,k) }[/math]
end for
end for
пока [math]\displaystyle{ G^TG }[/math] не станет достаточно близка к диагональной матрице
Положить [math]\displaystyle{ \sigma_{i} = ||G(:,i)||_2 }[/math] (норма [math]\displaystyle{ i }[/math]-го столбца в [math]\displaystyle{ G }[/math])
Положить [math]\displaystyle{ U = [u_{1},\dots, u_{n}] }[/math], где [math]\displaystyle{ u_{i} = G(:,i)/\sigma_{i} }[/math]
Положить [math]\displaystyle{ V = J }[/math], где [math]\displaystyle{ J }[/math] - накопленное произведение вращений Якоби.
Где процедура One-Sided-Jacobi-Rotation является метод односторонних вращений Якоби:
proc One-Sided-Jacobi-Rotation[math]\displaystyle{ (G,j,k) }[/math] вычислить [math]\displaystyle{ a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk} }[/math] и [math]\displaystyle{ a_{kk} = (G^TG)_{kk} }[/math] if [math]\displaystyle{ |a_{jk}| }[/math] не слишком мал [math]\displaystyle{ \begin{align} \tau &= ({a_{jj} - a_{kk}})/{2a_{jk}} \\ t &= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\ c &= 1/(\sqrt{1 + t^2}) \\ s &= ct \\ G &= GR(j,k,\theta) \ \dots c=cos\theta, s=sin\theta \end{align} }[/math] if нужны правые сингулярные векторы [math]\displaystyle{ J = JR(j,k,\theta) }[/math] end if end if
Последовательная сложность алгоритма
Для одного вращения Якоби необходимо выполнить [math]\displaystyle{ O(n) }[/math] операций умножения и сложения.
Всего вариантов выбора [math]\displaystyle{ j }[/math] и [math]\displaystyle{ k }[/math] существует [math]\displaystyle{ \frac{n(n-1)}{2} }[/math].
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.
Информационный граф
Граф алгоритма состоит из четырех групп вершин
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов [math]\displaystyle{ a_{jj},a_{jk},a_{kk} }[/math] матрицы произведения [math]\displaystyle{ A = (G^TG) }[/math]. Где [math]\displaystyle{ j }[/math] изменяется от [math]\displaystyle{ 1 }[/math] до [math]\displaystyle{ n-1 }[/math], принимая все целочисленные значения, [math]\displaystyle{ k }[/math] изменяется от [math]\displaystyle{ j+1 }[/math] до [math]\displaystyle{ n }[/math], принимая все целочисленные значения.
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям [math]\displaystyle{ g_{ij} }[/math] соответствуют обозначения [math]\displaystyle{ x_{ij} }[/math], а элементам [math]\displaystyle{ g^T_{ij} }[/math] обозначения [math]\displaystyle{ z_{ij} }[/math]. Значение [math]\displaystyle{ s_{ij} }[/math] является значением результирующего элемента.
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление [math]\displaystyle{ c }[/math] и [math]\displaystyle{ s }[/math].
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов [math]\displaystyle{ g_{jm}^{(i+1)} = g_{mj}^{(i+1)} }[/math] и [math]\displaystyle{ g_{km}^{(i+1)} = g_{mk}^{(i+1)} }[/math], [math]\displaystyle{ m \ne j,k }[/math].
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов [math]\displaystyle{ g_{jj}^{(i+1)} }[/math] и [math]\displaystyle{ g_{kk}^{(i+1)} }[/math].
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц [math]\displaystyle{ G }[/math] и [math]\displaystyle{ R }[/math]


Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).

Ресурс параллелизма алгоритма
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:
- вычислить [math]\displaystyle{ \tau }[/math]
- вычислить [math]\displaystyle{ t }[/math]
- вычислить [math]\displaystyle{ c }[/math]
- вычислить [math]\displaystyle{ s }[/math]
- выполнить поворот матрицы [math]\displaystyle{ G }[/math] с параллельным выполнением [math]\displaystyle{ 2(n-2) }[/math] операций вычисления элементов матрицы [math]\displaystyle{ g_{jm}^{(i+1)} = g_{mj}^{(i+1)} }[/math] и [math]\displaystyle{ g_{km}^{(i+1)} = g_{mk}^{(i+1)} }[/math], [math]\displaystyle{ m \ne j,k }[/math], а также вычисления элементов [math]\displaystyle{ g_{jj}^{(i+1)} }[/math] и [math]\displaystyle{ g_{kk}^{(i+1)} }[/math].
Суммарное количество итераций равно [math]\displaystyle{ \frac{n(n-1)}{2} }[/math] (Различные варианты выбора [math]\displaystyle{ j }[/math] и [math]\displaystyle{ k }[/math]).
Асимптотически метод сходится квадратично.
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью [math]\displaystyle{ O(n^2) }[/math] , а при классификации по ширине ЯПФ — к алгоритмам со сложностью [math]\displaystyle{ O(n) }[/math].
Входные и выходные данные алгоритма
Входные данные: плотная матрица [math]\displaystyle{ G }[/math] размера [math]\displaystyle{ n }[/math]х[math]\displaystyle{ n }[/math], где [math]\displaystyle{ A= G^TG }[/math] – симметрическая матрица.
Объём входных данных: [math]\displaystyle{ n^2 }[/math] (т.к. для хранения матрицы [math]\displaystyle{ G }[/math] используем двумерный массив размера [math]\displaystyle{ n }[/math]х[math]\displaystyle{ n }[/math])
Выходные данные: [math]\displaystyle{ \sigma_{i} }[/math] - сингулярные числа, матрица [math]\displaystyle{ U }[/math] левых сингулярных векторов и матрица [math]\displaystyle{ V }[/math] правых сингулярных векторов.
Объём выходных данных: [math]\displaystyle{ 2n^2 + n }[/math] (т.к. необходимо хранить вектор сингулярных чисел длины [math]\displaystyle{ n }[/math], а также две матрицы [math]\displaystyle{ U, V }[/math] левых и правых сингулярных векторов размера [math]\displaystyle{ n }[/math]х[math]\displaystyle{ n }[/math]).
Свойства алгоритма
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для матриц [math]\displaystyle{ G }[/math], которые могут быть представлены в виде [math]\displaystyle{ G=DX }[/math], где [math]\displaystyle{ D }[/math] - диагональная, а [math]\displaystyle{ X }[/math] - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы[5].
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).
Программная реализация алгоритма
Особенности реализации последовательного алгоритма
Локальность данных и вычислений
Возможные способы и особенности параллельной реализации алгоритма
Масштабируемость алгоритма и его реализации
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на тестовой средe суперкомпьютера "Ломоносов", с использованием компилятора ICC и библиотеки impi/4.0.3. Алгоритм реализован на языке программирования C с использованием механизмов MPI.
Алгоритм работает по следующей схеме:
- На вход всем процессорам подается матрица [math]\displaystyle{ G }[/math].
- Для всех [math]\displaystyle{ j }[/math] и [math]\displaystyle{ k }[/math] таких, что [math]\displaystyle{ j \in [1,n-1] }[/math], [math]\displaystyle{ k \in [j+1,n] }[/math]
- Вычисляется элемент [math]\displaystyle{ a_{jk} }[/math] путем перемножения матриц [math]\displaystyle{ G^TG }[/math], где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.
- Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов [math]\displaystyle{ \tau, t, c, s }[/math].
- Затем, выполняется операция поворота, путем перемножения матриц [math]\displaystyle{ G }[/math] и [math]\displaystyle{ R }[/math]. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.
Данная схема повторяется до тех пор, пока матрица [math]\displaystyle{ A = G^TG }[/math] не станет достаточно близкой к диагональной.
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица [math]\displaystyle{ A }[/math]. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.
Набор и границы значений изменяемых параметров запуска реализации алгоритма:
- число процессоров [1 : 128] с шагом равным степени двойки;
- размер матрицы [256 : 1792] с шагом 256.
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:
- минимальная эффективность реализации 0,01%;
- максимальная эффективность реализации 16,52%.
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.


Построим оценки масштабируемости данной реализации метода Якоби:
- По числу процессов: при увеличении числа процессов эффективность на рассмотренной области изменений параметров запуска сначала увеличивается (самый пик достигается при 16 процессах), а затем начинает снижаться. Это характеризуется тем, что накладные расходы на параллельное выполнение (общение между процессами) начинает превалировать над вычислениями.
- По размеру задачи: при увеличении размера задачи эффективность возрастает. Это подтверждает предположение о том, что размер задачи сильно влияет на эффективность выполнения приложения. Оценка показывает, что с ростом размера задачи эффективность на рассмотренной области значений параметров запуска сильно увеличивается.
- По двум направлениям: при рассмотрении увеличения как вычислительной сложности, так и числа процессов на всей рассмотренной области значений эффективность увеличивается, но медленно и с перепадами.
Исследованная параллельная реализация метода Якоби
Динамические характеристики и эффективность реализации алгоритма
Выводы для классов архитектур
Существующие реализации алгоритма
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK [6], LINPACK/EISPACK [7], Intel MKL [8].
Так же функция Якоби реализована в пакете Matlab.
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.
Литература
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.
- ↑ http://algorithms.parallel.ru/
- ↑ Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)
- ↑ http://www.astro.tsu.ru/OsChMet/5_2.html
- ↑ Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)
- ↑ Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)
- ↑ http://www.netlib.org/scalapack/slug/
- ↑ http://www.netlib.org/linpack/
- ↑ https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA