对于任一给定的矩阵A(m * n),都存在这样的分解:
其中, U是一个m * m的酉矩阵,S是一个m * n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值, V是一个n * n的酉矩阵。
求解解线性方程组
Ax=b
svd(A) = USV',令X=V'x,B=U'b,则有SX=B,由于S是对角阵,可轻易求出X,又由于V是正交阵,则x=VX,故而方程组得以解出。其中代表V的转置,A和b已知,值如下:
[U,S,V]=svd(A),其中U,S,V以及下面其余的值均是通过Matlab求解的
B = U'b
此时令SX=B,X易求出为X[i]=B[i]/S[i,i]
for i = 1: 3
X(i) = B(i) / S(i, i)
end
则x=VX
最终可以验证,x是Ax=b的解,Ax-b是一个零向量或值很小的向量。
SVD的一些性质
对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。也就是说:
其中k要比n小很多,V是n*k维,其转置为k*n维。
还以上例为例,上例中S以是按大到小排列,故此处直接取U的前两列,即U1(4,2),S取左上角,即S1(2,2),取V的前两列,即V1(3,2),否则要按对应关系取
B1 = U1' * b
此时令S1*X1=B1,由于S1是对角阵,故而X1易求出为X1[i]=B1[i]/S1[i,i]
for i = 1: 2
X1(i) = B1(i) / S1(i, i)
end
则x = V1 * X1
最终可以验证,x是Ax=b的近似解