首先我们看一下wiki上关于奇异值分解的理论描述:
1. 理论描述
假设M是一个m×n阶矩阵,其中的元素全部属于域K,也就是实数域或复数域。如此则存在一个分解使得
其中U是m×m阶酉矩阵;Σ是m×n阶非负实数对角矩阵;而V*,即V的共轭转置,是n×n阶酉矩阵。这样的分解就称作M的奇异值分解。Σ对角线上的元素Σi,i即为M的奇异值。
常见的做法是将奇异值由大而小排列。如此Σ便能由M唯一确定了。(虽然U和V仍然不能确定。)
2. 直观的解释
在矩阵M的奇异值分解中
- V的列(columns)组成一套对
的正交"输入"或"分析"的基向量。这些向量是
的特征向量。
- U的列(columns)组成一套对
的正交"输出"的基向量。这些向量是
的特征向量。
- Σ对角线上的元素是奇异值,可视为是在输入与输出间进行的标量的"膨胀控制"。这些是
及
的特征值的非零平方根,并与U和V的行向量相对应。
3. 具体的matlab运算详解如下:
矩阵奇异值分解:
假设待分解矩阵为 M(m,n), 分解获得的的矩阵为 U, S, V.
SVD matlab函数原型为:
[U, S, V] = svd(M); 则 U(m,m), S(m, n), V(n, n).
对于Svds 函数:
[U, S, V] = svds(M); 则 U(m,6), S(6,6), V(n, 6).
默认情况下是取最大的6个特征值,SVDS(A) 返回的就是svds返回的就是最大的6个特征值及其对应的特征行向量和特征列向量。然而Svds是可以根据需求进行定制:
[U, S, V] = svds(M, k); 则U(m,k), S(k,k), V(n, k). 此时svds返回的就是最大的k个特征值及其对应的特征行向量和列向量。
在PROPACK 这个库中,有一个lansvd的函数名,此函数功能类似于svds函数,但是比svds更加灵活, svds只可以返回最大的k个特征值,Lansvd还可以返回最小的K个特征值。
[U,S,V] =LANSVD(A,K,'L',...) computes the K largest singular values. 该函数计算最大的K个特征值。
[U,S,V] = LANSVD(A,K,'S',...) computesthe K smallest singular values. 计算最小的K个特征值。
Lansvd在默认情况下,也是返回最大的6个特征值及其对应的特征向量。默认情况下,Svds和Lansvd 计算出来的特征值S是一样的。
4. 总结
在matlab中,SVD, SVDS 和lansvd函数本质上都是一样的。只是SVD得到的是全分解返回的全部特征值, Svds和lansvd 是可以灵活定制的,他们默认都是返回最大的6个特征值。其中Svds可以返回最大的K个特征值, lansvd更加灵活,可以返回最大或者最小的K个特征值。
[u,d,v]=svds(A,10)将得到最大的10个特征值及其对应的最大特征行向量和特征列向量,
[u,d,v]=svds(A,10,0)将得到最小的10个特征值及其对应的特征行向量和特征列向量,
[u,d,v]=svds(A,10,2)将得到与2最接近的10个特征值及其对应的特征行向量和特征列向量。
相比svd,svds的可定制性更强。
奇异值分解非常有用,对于矩阵A(m*n),存在U(m*m),V(n*n),S(m*n),满足A = U*S*V’。
U和V中分别是A的奇异向量,而S是A的奇异值。
AA'的正交单位特征向量组成U,特征值组成S'S,
A'A的正交单位特征向量组成V,特征值(与AA'相同)组成SS'。