任意矩阵的奇异值分解(SVD)之原理简介

奇异值分解(singular value decomposition, SVD):

       将矩阵分解为奇异向量(singular vector)和奇异值(singular value)。通过奇异值分解,我们会得到一些与特征分解相同类型的信息。然而,奇异值分解有更广泛的应用。每个实数矩阵都有一个奇异值分解,但不一定都有特征分解。例如,非方阵的矩阵没有特征分解,这是我们只能使用奇异值分解。

将矩阵A分解成三个矩阵的乘积:A=UDVT。

假设A是一个m*n的矩阵,那么U是一个m*m的矩阵,D是一个m*n的矩阵,V是一个n*n矩阵。

这些矩阵中的每一个经定义后都拥有特殊的结构。矩阵U和V都被定义为正交矩阵,而矩阵D被定义为对角矩阵。注意,矩阵D不一定是方阵。对角矩阵D对角线上的元素被称为矩阵A的奇异值(singular value)。矩阵U的列向量被称为左奇异向量(left singular vector),矩阵V的列向量被称为右奇异向量(right singular vector)。A的左奇异向量是AAT的特征向量。A的右奇异向量是ATA的特征向量。A的非零奇异值是ATA特征值的平方根,同时也是AAT特征值的平方根。

奇异值分解(singular value decomposition)是线性代数中一种重要的矩阵分解,在信号处理、统计学等领域有重要应用。奇异值分解能够用于任意m*n矩阵,而特征分解只能适用于特定类型的方阵,故奇异值分解的适用范围更广。

---------------------------以上内容摘自: 《深度学习中文版》 和  维基百科

基于雅克比(Jacobi)方法对矩阵进行奇异值分解操作步骤(参考OpenCV中实现):

(1)、对原始矩阵A(m*n)进行判断,若m

(2)、初始化临时变量D、U、Vt:D为奇异值,为n行1列;U为左奇异向量,为m行m列;Vt为转置后的右奇异向量,为n行n列;并初始化D、U、Vt值均为0;

(3)、初始化临时变量A′:A′为m行m列,并将A的值赋值给A′,A′中多余元素赋初值为0;

(4)、由A′、D、Vt开始进行基于Jacobi方法的奇异值分解;

(5)、设置临时变量W,长度为n,将A′中前n行中,每行元素的平方和赋值给W;

(6)、设置Vt为单位矩阵;

(7)、循环计算旋转矩阵,并更新A′、W、Vt对应位置的值;最大循环次数为std::max(m, 30);

(8)、重置W值为A′中前n行,每行元素平方和的开方;

(9)、将W中元素按照从大到小排序,排序后的W即为D中主对角线元素值;

(10)、按照(9)中对W的排序规则对A′和Vt进行排序;

(11)、计算A′中值;

(12)、最终的A′和Vt即为所求的左、右奇异向量。

转自:https://blog.csdn.net/fengbingchun/article/details/72853757,更多矩阵奇异值分解简介及C++/OpenCV/Eigen的三种实现见该网址

你可能感兴趣的:(算法)