使用 Matlab 的矩阵低秩近似

Matrix Low Rank Approximation using Matlab

考虑一个 256 x 256 矩阵 A。我熟悉如何使用 SVD 计算 A 的低秩近似值。

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

我的问题是如何创建一个向量 E 这样, E(k) = norm(A-Ak) 对于 k=1,2,3.....,256。即 E 是一个包含 256 个元素的列向量,每个元素是 norm(A-Ak)

答案很简单

diag(S)

为什么?

有一个theorem1表示矩阵A与其秩-k近似之间的误差Ak 有一个(谱)范数 2A 的第 k+1 个奇异值给出。也就是说,错误是由第一个not used奇异值给出的。是不是很棒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

1 其实我直到几分钟前才知道这个定理。我刚刚计算了 norm(A-Ak) 并注意到结果值在 S 中。 然后我想一定有一个定理可以证明这一点。

2 感谢@AlgebraicPavel 指正。

3代数很慷慨;她给予的往往比索取的多。”— Jean le Rond d'Alembert