基于Matlab的矩阵低秩逼近

Exc*_*Exc 3 matlab matrix linear-algebra svd

考虑256 x 256矩阵A.我很熟悉如何计算A使用SVD的低等级近似值.

通常在使用之后[U S V] = svd(A),我会用它Ak = U(:,1:k)*S(1:k,1:k)*V(:,1:k)';来得到等级k近似值A.

我的问题是如何创建一个矢量E, E(k) = norm(A-Ak)以便k=1,2,3.....,256.这是E一个256个元素的列向量,每个元素都是norm(A-Ak)

Lui*_*ndo 9

答案很简单

diag(S)
Run Code Online (Sandbox Code Playgroud)

为什么?

有一个定理1表明矩阵A与其秩k近似之间的误差Ak具有(谱)范数2,由k+1-th奇异值给出A.也就是说,误差由第一个未使用的奇异值给出.这不是一个很好的3结果吗?

例:

>> A = randn(8,8);
>> [U S V] = svd(A);
>> k = 5;
>> Ak = U(:,1:k)*S(1:k,1:k)*V(:,1:k)'; %'// rank-5 approximation 
>> norm(A-Ak) %// its associated error norm
ans =
    1.0590

>> k = 6;
>> Ak = U(:,1:k)*S(1:k,1:k)*V(:,1:k)'; %'// rank-6 approximation
>> norm(A-Ak) %// its associated error norm
ans =
    0.3924

>> diag(S).' %'// all error norms
ans =
    4.5528    3.2398    2.5863    2.2031    1.4252    1.0590    0.3924    0.1021
Run Code Online (Sandbox Code Playgroud)

1 实际上,直到几分钟前我才知道这个定理.我刚刚计算norm(A-Ak)并注意到结果值是S.然后我认为必须有一个定理来建立这个.

2 感谢@AlgebraicPavel进行更正.

3 " 代数是慷慨的;她经常给出比她更多的代词. "