6

非常に大きな行列が与えられました (行列の値を変更できません)。(共分散) 行列の逆数を計算する必要があります。

時々私は言うエラーを受け取ります

 Matrix is close to singular or badly scaled.
     Results may be inaccurate

これらの状況では、det の値が 0 を返すことがわかります。

(共分散行列の)逆数を計算する前に、detの値を確認して、このようなことを実行したい

covarianceFea=cov(fea_class);
covdet=det(covarianceFea);
if(covdet ==0)
    covdet=covdet+.00001;
    %calculate the covariance using this new det
end 

新しい det を使用して、これを使用して共分散行列の逆数を計算する方法はありますか?

4

3 に答える 3

17

はぁ。特異点を決定するための行列式の計算は、ばかげたことです。まったくそうです。特に大規模なマトリックスの場合はそうです。申し訳ありませんが、そうです。なんで?はい、いくつかの本はあなたにそうするように言います。多分あなたのインストラクターでさえ。

分析的特異点は 1 つのことです。しかし、特異点の数値決定はどうだろうか? シンボリック ツールを使用していない限り、MATLAB は浮動小数点演算を使用します。これは、数値を浮動小数点の倍精度値として格納することを意味します。これらの数値は、以下よりも小さくすることはできません

>> realmin
ans =
  2.2251e-308

(実際には、MATLAB はそれより少し低くなります。非正規化数に関しては、約 1e-323 まで下がる可能性があります。) それよりも小さい数を格納しようとすると、MATLAB はそれをゼロと見なします。

>> A = 1e-323
A =
  9.8813e-324

>> A = 1e-324
A =
     0

大きなマトリックスではどうなりますか? たとえば、次の行列は特異ですか。

M = eye(1000);

M は恒等行列であるため、明らかに非特異です。実際、det はそれが非特異であることを示唆しています。

>> det(M)
ans =
     1

ただし、定数を掛けます。それはそれを非特異にしますか?いいえ!!!!!!!!!!!!!!!!!!!!!!!!もちろん違います。でもとにかくやってみる。

>>     det(M*0.1)
ans =
     0

うーん。それは奇妙です。MATLAB は、行列式がゼロであることを教えてくれます。しかし、行列式が 1e-1000 であることはわかっています。ああ、そうです。1e-1000 は、MATLAB が double として格納できることを示した最小の数値よりもかなり小さくなっています。したがって、行列式は明らかに非ゼロですが、アンダーフローします。行列は特異ですか?もちろん違います。しかし、det の使用はここで失敗しますか? もちろんそうなるでしょう、そしてこれは完全に予想されています。

代わりに、特異点を判断するための優れたツールを使用してください。cond や rank などのツールを使用します。たとえば、ランクをだますことはできますか?

>> rank(M)
ans =
        1000

>> rank(M*.1)
ans =
        1000

スケーリングするかどうかに関係なく、ランクはこれが完全なランク行列であることを認識していることを確認してください。同じことが cond にも当てはまり、M の条件数を計算します。

>> cond(M)
ans =
     1

>> cond(M*.1)
ans =
     1

浮動小数点演算の世界へようこそ。ところで、浮動小数点演算を使用するほぼすべての計算のツールとしての det のことは忘れてください。ほとんどの場合、これは不適切な選択です。

于 2011-10-09T13:33:00.763 に答える
5
于 2011-10-09T14:17:23.397 に答える
1

このようなシナリオでは、逆数を計算することはあまり良い考えではありません。どうしてもやる必要がある場合は、これを使用して表示精度を上げることをお勧めします。

format long;

他の提案は、マトリックスのSVDを使用して、そこで特異値をいじることです。

A = U∑V'
inv(A) = V*inv(∑)*U'

∑ は、0 に近い対角エントリの 1 つが表示される対角行列です。何らかの近似値が必要な場合は、この数値をいじってみてください。

于 2011-10-09T11:16:37.180 に答える