使用 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)';
来获得 A
的 k
近似值。
我的问题是如何创建一个向量 E
这样,
E(k) = norm(A-Ak)
对于 k=1,2,3.....,256
。即 E
是一个包含 256 个元素的列向量,每个元素是 norm(A-Ak)
答案很简单
diag(S)
为什么?
有一个theorem1表示矩阵A
与其秩-k
近似之间的误差Ak
有一个(谱)范数 2 由 A
的第 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
考虑一个 256 x 256 矩阵 A
。我熟悉如何使用 SVD 计算 A
的低秩近似值。
通常在使用 [U S V] = svd(A)
之后,我会使用 Ak = U(:,1:k)*S(1:k,1:k)*V(:,1:k)';
来获得 A
的 k
近似值。
我的问题是如何创建一个向量 E
这样,
E(k) = norm(A-Ak)
对于 k=1,2,3.....,256
。即 E
是一个包含 256 个元素的列向量,每个元素是 norm(A-Ak)
答案很简单
diag(S)
为什么?
有一个theorem1表示矩阵A
与其秩-k
近似之间的误差Ak
有一个(谱)范数 2 由 A
的第 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