基于单边Jacobi旋转的并行SVD算法

单边Jacobi方法的核心思想是采用一系列Jacobi平面旋转变换[1],对维度为m*n的矩阵A进行正交化, B=A(J1J2J3…),使得B中任意两列向量满足bj.T*bj=0,然后对Bm*n归一化得到

,Jacobi平面旋转变换的结构如公式(1)所示:

(i,j)表示消去元素在矩阵中的位置(c表示cosθ, s表示sinθ,θ称为旋转角)。可以证明JTJ=I, Jacobi旋转变换为正交变换。因为J(I,j,θ)仅仅影响与i和j相应行和列的元素,其他矩阵元素不会受到影响。因为V=J1J2J3…,是由一系列Jacobi旋转变换矩阵相乘而得,因此它本身也是正交矩阵。整理后就可以得到矩阵A的奇异值分解A=UΣ , 其中U与V是有A的左右奇异向量构成的酉矩阵,Σ是A的奇异值矩阵。对矩阵进行正交化时,仅仅i与j 列两列元素受到影响,具体变换过程如下:

由于bj.T*bj=0,有

又根据:

,解二元一次方程组得:

因为B中任意两列向量都要彼此正交之后,算法才可以收敛,因此一共需要对A进行N(N-1)/2次旋转才能使得矩阵中所有列之间都正交一次。由于Jacobi旋转变换中对c和s的计算是决定单边Jacobi方法收敛速度的主要原因之一,因此后续学者对此提出了多种改进方法。Hestens设计了一种新的单边 Jacobi方法。在该方法种,当矩阵A中向量||Ai||<||Aj||时,先交换两列元素,然后再利用平面旋转变换,按照循环序列对矩阵进行正交变换。这个方法可以保证最终求解的奇异值是按照非增序列排列好的。

由于该单边Jacobi平面旋转变换仅仅影响两列元素,因此通过合理划分,可以并行的对相互之间不存在依赖关系的列对进行变换。例如矩阵列数为4,可以分别对索引对(1,2)和(3,4), (1 ,3)和(2,4),,(1,4)和(2,3)同时变换,而不发生冲突。这样原来在同一时间段内对一个索引对的一次旋转变换变成现在对两个索引对的一组旋转变换。“一轮”也就是由原来的n(n-1)=6变为现在的n-1=3.为了保证在合理的迭代次数下并行的完成n(n-1)/2次旋转,需要设计一个“好的”数据交换序列。我们采用奇偶序列,按照该序列,在并行实现单边Jacobi方法时,最多可以同时对n/2个列对进行旋转变换,也就是一轮变换最少需要n(n为奇数)或n-1(n为偶数)个阶段完成。

奇偶序列通过不断交换索引而形成索引对。如图所示,在每一个阶段结束后,将原来形成的索引列对拆分并按照从左到右一次递增的顺序进行交换(交换仅仅发生在索引内部)。如果当前出在奇数阶段,则从左边第一个索引位置开始,一次向右,每两个索引形成一个索引对。如果当前出在偶数阶段,则从左边第二个索引位置开始,每两个索引形成一个索引对。在索引对产生的各个阶段,如果某一索引无法与其他索引形成列队,他将在本阶段孤立出来。按照这个方法,经过n个阶段就可以产生所有n(n-1)/2个索引对。并且最终的索引是按照从小到达的顺序进行排列的。

参考文献

1郭强.并行JACOBI方法求解矩阵奇异值的研究.苏州大学学位论文,2011

2.

朋友,为了幸福,请你保持一副热爱生活的心肠,

基于单边Jacobi旋转的并行SVD算法

相关文章:

你感兴趣的文章:

标签云: