只是我想将一个n*n
正定矩阵划分为一个相同的n*r
矩阵 B,其中 r 是任意的,换句话说:
B*B^T=A
(n*r)*(n*r)^T=(n*n)
编辑:我认为这是我的错,无法描述我的问题。让B
是一个维度为 的矩阵(n*r)
。A=f(B^T*B)
将其赋予A 为的函数(n*n)
。我知道这个函数将保持矩阵的秩,换句话说rank(A)=rank(B'*B)
。现在我想提取新的B
. 所以新B
的(n*r)
又来了。
只是我想将一个n*n
正定矩阵划分为一个相同的n*r
矩阵 B,其中 r 是任意的,换句话说:
B*B^T=A
(n*r)*(n*r)^T=(n*n)
编辑:我认为这是我的错,无法描述我的问题。让B
是一个维度为 的矩阵(n*r)
。A=f(B^T*B)
将其赋予A 为的函数(n*n)
。我知道这个函数将保持矩阵的秩,换句话说rank(A)=rank(B'*B)
。现在我想提取新的B
. 所以新B
的(n*r)
又来了。
假设您有以下示例:
n = 4;
rng(0)
A = rand(n,n);
B = A * A';
如果矩阵B
是满秩的,则不能使用更少的维度完全覆盖原始矩阵。所以,你只能近似它。这里的关键思想是最小化重建误差。
您可以B
使用特征值分解将其分解为特征向量。您可以eig
在 MATLAB 中使用,但之后需要对特征值和相应的特征向量进行排序。相反,我更喜欢奇异值分解并svd
在 MATLAB 中使用。请注意,SVD 给出了低秩矩阵逼近中重构误差的最优解。
[U,S,~] = svd(B);
U = U * sqrt(S);
我们现在知道了B = U * U'
。请参阅此处的 SVD 和特征值分解之间的关系。
正如我所说,我们需要近似它。我选择覆盖总方差 99% 的维度如下:
coverage = cumsum(diag(S.^2));
coverage = coverage ./ norm(S,'fro')^2;
[~, nEig] = max(coverage > 0.99);
U2 = U(:,1:nEig);
在这种情况下,U2 有 2 列而不是 4 列。如果数据是相关的,那么收益会更少。结果如下:
B
B1 = U*U'
B2 = U2*U2'
B =
2.8966 2.1881 1.1965 2.1551
2.1881 1.9966 0.6827 1.8861
1.1965 0.6827 0.7590 0.5348
2.1551 1.8861 0.5348 2.0955
B1 =
2.8966 2.1881 1.1965 2.1551
2.1881 1.9966 0.6827 1.8861
1.1965 0.6827 0.7590 0.5348
2.1551 1.8861 0.5348 2.0955
B2 =
2.8896 2.2134 1.1966 2.1385
2.2134 1.9018 0.6836 1.9495
1.1966 0.6836 0.7586 0.5339
2.1385 1.9495 0.5339 2.0528
这似乎是一个很好的近似值。