rcond()
がゼロに近い、条件の悪い行列があるため、その行列の逆行列は正しくありません。 pinv()
を使用してみましたが、問題は解決しません。これは私が逆を取っている方法です:
X = (A)\(b);
私はこの問題の解決策を探し、マトリックスを改善するための このリンク (最後の解決策)を見つけました。そこでの解決策は、これを使用することを提案しています:
A_new = A_old + c*eye(size(A_old));
どこ c > 0
。これまでのところ、この手法を採用することで、行列A
の条件を改善し、結果の解の見栄えを良くすることができます。ただし、c
のさまざまな値を使用して調査したところ、結果のソリューションは、選択したc
の値によって異なります。
c
の値を手動で調査する以外に、最適なソリューションが得られるc
の値を自動的に見つける方法はありますか?
離散逆理論では、反転しようとしている行列c
の対角線に小さな値A
を追加することを、反転の減衰と呼び、追加する小さな値c
Marquardt-Levenberg係数と呼ばれます。行列Aの固有値がゼロまたはゼロに近い場合があります。これにより、行列は特異になります。対角要素に小さな減衰係数を追加すると、安定します。 c
の値が大きいほど、減衰が大きいほど、行列の反転はより安定しますが、真の解からは遠く離れています。 c
の値が小さいほど、減衰が小さくなり、反転行列が真の反転行列に近くなりますが、不安定になる可能性があります。時々使用される「適応減衰」手法の1つは、テスト値c
から始めて、行列A
を反転し、次にcの値を減らし、再び反転を行うなどです。 A
が再び特異になるために、逆行列で奇妙な値を取得したときに停止します。これはあなたの質問に正確に答えるとは思いませんが、コメントに入れるには長すぎました。
コメントですでに指摘されているように、あなたの質問への答えはあなたのアプリケーションに決定的に依存します。単位行列の小さな倍数を追加することは正しいことかもしれませんが、そうではないかもしれません。あなたが私たちに伝える必要があることを決定するために:このマトリックスはどのようにして生じたのですか?そして、あなたは何のために逆数が必要ですか?
2つの一般的なケースは次のとおりです。
行列A
を正確に知っている場合、たとえばこれは一般線形モデル_b = A * X
_の計画行列であるため、変更することはお勧めできません。この場合、行列は線形連立方程式を定義します。行列が特異である場合、これはこのシステムに一意の解がないことを意味します。無限に多くの可能な解から1つを選択するには、さまざまな戦略があります。_X = A \ b
_は可能な限り多くのゼロ係数を持つ解を選択し、X = pinv(A) * b
は最小のL2ノルムを持つ解を選択します。 pinv
のドキュメントの例を参照してください。
行列A
がデータから推定される場合、たとえばLDA分類器の共分散行列であり、真の値が特異ではなく、特異性は推定に十分なデータポイントがないためであると考える理由があります。次に、正規化または「縮小」を適用して、単位行列は一般的な戦略です。この場合、 SchäferandStrimmer(2005) は、データ自体から最適な正則化係数を推定する方法を説明します。
しかし、他の答えを持つ他のケースもあると確信しています。