1

n*n単純に、正定行列を同一の行列Bに分割したいと思いますn*r。ここで、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)再びあります。

4

1 に答える 1

3

次の例があるとします。

n = 4;
rng(0)
A = rand(n,n);
B = A * A';

行列Bがフル ランクの場合、より少ない次元を使用して元の行列を正確にカバーすることはできません。したがって、近似することしかできません。ここでの重要なアイデアは、再構成エラーを最小限に抑えることです。

固有値分解Bを使用して固有ベクトルに分解できます。MATLAB で使用できますが、後で固有値と対応する固有ベクトルを並べ替える必要があります。代わりに、特異値分解を好み、MATLABで使用します。SVD は、低ランク行列近似における再構成誤差の最適解を与えることに注意してください。eigsvd

[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

それは良い近似のようです。

于 2012-05-16T07:02:05.200 に答える