15

以下の関数を使用して、オプティマイザーから特定の推測ラムダのセットのベータを生成します。

実行すると、次の警告メッセージが表示されることがよくあります。

警告:マトリックスは、作業精度に対して特異です。NSS_betasで9でDElambdaで19でIndividual_Lambdasで36で

特異行列を形成するベータを解集合から除外できるようにしたいのですが、それをテストする方法がわかりませんか?

rcond()を使おうとしていますが、特異なものと特異でないものをどこでカットするのかわかりません。

確かに、Matlabが警告メッセージを生成している場合、行列が特異であるかどうかはすでにわかっているので、その変数が格納されている場所を見つけることができれば、それを使用できますか?

function betas=NSS_betas(lambda,data)

mats=data.mats2'; 
lambda=lambda;
yM=data.y2';
nObs=size(yM,1);
G= [ones(nObs,1) (1-exp(-mats./lambda(1)))./(mats./lambda(1)) ((1-exp(-mats./lambda(1)))./(mats./lambda(1))-exp(-mats./lambda(1))) ((1-exp(-mats./lambda(2)))./(mats./lambda(2))-exp(-mats./lambda(2)))];

betas=G\yM;
r=rcond(G);

end

アドバイスをありがとう:

ラムダ値を等しく設定して特異行列を与えた後、以下の3つの例すべてをテストしました

 if (~isinf(G))
  r=rank(G);
  r2=rcond(G);
  r3=min(svd(G)); 
 end

r = 3、r2 = 2.602085213965190e-16; r3 = 1.075949299504113e-15;

したがって、このテストでは、以下のようにベンチマーク値を取得すると仮定して、rank()とrcond()が機能しました。

しかし、近いが完全に等しくない2つの値がある場合はどうなりますか?

近すぎるものをどのように判断できますか?

4

5 に答える 5

14

rcondここに行く正しい方法です。マシンの精度がゼロに近い場合、行列は特異です。私は通常一緒に行きます:

if( rcond(A) < 1e-12 )
    % This matrix doesn't look good
end

ニーズに合った値を試すことができますが、MATLABで特異に近い行列の逆行列をとると、ガベージ結果が生成される可能性があります。

于 2012-10-22T07:09:02.980 に答える
11

rank(G)の結果をの列数と比較できますG。ランクが列の次元よりも小さい場合、特異行列が作成されます。

于 2012-10-21T20:27:32.173 に答える
3

これは次の方法でも確認できます。

min(svd(A))>eps

最小の特異値がeps、またはニーズに関連するその他の数値許容値よりも大きいことを確認します。(コードは1または0を返します)

ここにそれについてのより多くの情報があります...

于 2012-10-22T03:06:10.083 に答える
3

条件数(Maximal singular value/Minimal singular value)は別の良い方法です:

  cond(A)

を使用しsvdます。可能な限り1に近づける必要があります。値が非常に大きいということは、行列がほぼ特異であることを意味します。Infそれが正確に特異であることを意味します。

他の回答で言及されているほとんどすべての方法が何らかの形で使用されていることに注意してくださいsvd

于 2012-10-22T16:09:24.963 に答える
1

この問題のために設計された特別なツールがあり、適切には「ランクを明らかにする行列の因数分解」と呼ばれます。私の最善の(少し古いですが)知識では、n x n行列Aが正則であるかどうかを判断するのに十分な方法は、

det(A) <> 0 <=> rank(A) = n

Aのランクを明らかにするQR分解を使用します。

AP = QR

ここで、Qは直交、Pは順列行列、Rは対角要素の大きさが対角に沿って減少するという特性を持つ上三角行列です。

于 2017-04-09T07:42:09.050 に答える