web-dev-qa-db-ja.com

悪条件のマトリックスの改善

rcond() がゼロに近い、条件の悪い行列があるため、その行列の逆行列は正しくありません。 pinv() を使用してみましたが、問題は解決しません。これは私が逆を取っている方法です:

X = (A)\(b);

私はこの問題の解決策を探し、マトリックスを改善するための このリンク (最後の解決策)を見つけました。そこでの解決策は、これを使用することを提案しています:

A_new = A_old + c*eye(size(A_old));

どこ c > 0。これまでのところ、この手法を採用することで、行列Aの条件を改善し、結果の解の見栄えを良くすることができます。ただし、cのさまざまな値を使用して調査したところ、結果のソリューションは、選択したcの値によって異なります。

cの値を手動で調査する以外に、最適なソリューションが得られるcの値を自動的に見つける方法はありますか?

13
user238469

離散逆理論では、反転しようとしている行列cの対角線に小さな値Aを追加することを、反転の減衰と呼び、追加する小さな値c Marquardt-Levenberg係数と呼ばれます。行列Aの固有値がゼロまたはゼロに近い場合があります。これにより、行列は特異になります。対角要素に小さな減衰係数を追加すると、安定します。 cの値が大きいほど、減衰が大きいほど、行列の反転はより安定しますが、真の解からは遠く離れています。 cの値が小さいほど、減衰が小さくなり、反転行列が真の反転行列に近くなりますが、不安定になる可能性があります。時々使用される「適応減衰」手法の1つは、テスト値cから始めて、行列Aを反転し、次にcの値を減らし、再び反転を行うなどです。 Aが再び特異になるために、逆行列で奇妙な値を取得したときに停止します。これはあなたの質問に正確に答えるとは思いませんが、コメントに入れるには長すぎました。

13
Guddu

コメントですでに指摘されているように、あなたの質問への答えはあなたのアプリケーションに決定的に依存します。単位行列の小さな倍数を追加することは正しいことかもしれませんが、そうではないかもしれません。あなたが私たちに伝える必要があることを決定するために:このマトリックスはどのようにして生じたのですか?そして、あなたは何のために逆数が必要ですか?

2つの一般的なケースは次のとおりです。

  • 行列Aを正確に知っている場合、たとえばこれは一般線形モデル_b = A * X_の計画行列であるため、変更することはお勧めできません。この場合、行列は線形連立方程式を定義します。行列が特異である場合、これはこのシステムに一意の解がないことを意味します。無限に多くの可能な解から1つを選択するには、さまざまな戦略があります。_X = A \ b_は可能な限り多くのゼロ係数を持つ解を選択し、X = pinv(A) * bは最小のL2ノルムを持つ解を選択します。 pinv のドキュメントの例を参照してください。

  • 行列Aがデータから推定される場合、たとえばLDA分類器の共分散行列であり、真の値が特異ではなく、特異性は推定に十分なデータポイントがないためであると考える理由があります。次に、正規化または「縮小」を適用して、単位行列は一般的な戦略です。この場合、 SchäferandStrimmer(2005) は、データ自体から最適な正則化係数を推定する方法を説明します。

しかし、他の答えを持つ他のケースもあると確信しています。

10
A. Donda

Aの対角線に小さな値を追加することは、最小二乗問題Ax=bにL2ノルム 正則化 項を導入することとほぼ同じです。これは、残余と追加された制約を最小化しようとするものです。

min ||Ax-b||^2 + lambda*||x||^2

ここで、lamdbaは、制約を最小化する場合と残余ノルムを最小化する場合の重みを制御します。

通常、このパラメーターは、ある種の 相互検証 手法を使用して選択されます。

6
Amro