次の例があるとします。
n = 4;
rng(0)
A = rand(n,n);
B = A * A';
行列B
がフル ランクの場合、より少ない次元を使用して元の行列を正確にカバーすることはできません。したがって、近似することしかできません。ここでの重要なアイデアは、再構成エラーを最小限に抑えることです。
固有値分解B
を使用して固有ベクトルに分解できます。MATLAB で使用できますが、後で固有値と対応する固有ベクトルを並べ替える必要があります。代わりに、特異値分解を好み、MATLABで使用します。SVD は、低ランク行列近似における再構成誤差の最適解を与えることに注意してください。eig
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 には 4 列ではなく 2 列があります。データが相関している場合、ゲインはさらに小さくなります。結果は次のとおりです。
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
それは良い近似のようです。