特異値の受け入れ/拒否の基準は何ですか?


8

特異値分解を使用してシステムを解いています。特異値(スケーリング前)は次のとおりです。

1.82277e+29
1.95011e+27
1.15033e+23
1.45291e+21
4.79336e+17
7.48116e+15
8.31087e+12
1.71838e+11
5.63232e+08
2.17863e+08
9.02783e+07
1.72345e+07
1.73889e+05
8.09382e+02
2.16644e+00

すべての特異値と、それに関連する私のソリューションベクトルへの寄与を受け入れると、結果が悪くなることがわかりました。すべてを最大数でスケーリングし、次の特異値を生成します。

1.0
1.06986e-02
6.31091e-07
7.97089e-09
2.62971e-12
4.10428e-14
4.55948e-17
9.42732e-19
3.08998e-21
1.19523e-21
4.95281e-22
9.45510e-23
9.53980e-25
4.44040e-27
1.18854e-29

最善の解決策は、私が最後の二つが含まれている場合に悪くなり始めると、わずか約良好となる1019用語。

最後の2項を含めると、精度が大幅に低下します。何故ですか?特異値を含める/含めないための基準は何ですか?

m×nmnAX=BAAAX=AX

私のソリューションへの回答は、ノイズの多いデータをどれだけよく近似しているかで判断しています。

また、「良好」な適合であっても、ゼロに近いとうまく適合しないことにも気づきました(データの範囲はから10です)。何故ですか?1010


投稿またはコメントで作成したいタグについて言及した場合は、担当者の高い人が担当します。
David Z

@DavidKetcheson:これらの特定のタグが本当に必要かどうかはまだわかりません... たぶん、SVDに関する質問がたくさんあるときかもしれませんが、とりあえず、線形代数で十分なはずです。
JM 2011

回答:


11

max(m,n)ϵA2Am×nϵA2A

そうは言っても、JMが述べたように、形成を回避する方がはるかに安定しています。AHA

最初に、特異値分解を計算する必要 があります。次に、使用してを定義できます ここで

[U,Σ,V]=svd(A)
A=Vf(Σ)UH,
f(σ)={1/σ,σmax(m,n)ϵA2,0,otherwise

次に、解はとして計算できます

X=AB.

2
明示的で、行列2ノルムが最大の特異値と正確に同じであると言う方がいいと思います...また、は、しきい値基準を適用するために正方形である必要はありません(ただし、置き換える行列の場合はを使用)。Anmax(m,n)m×n
JM

1
A†= U f(Σ)* V 'の代わりにA†= V f(Σ)* U' であるべきではありませんか?
drjrm3

はい、ありがとうございました。私は数日前にエルミート行列の並列擬似逆ルーチンを書いたばかりで、一般的なケースとの違いを十分に考慮していなかったようです。
ジャックポールソン

2
疑似逆行列は、状況が悪い問題の解決策ではありませんが、役立つ傾向があります。高次多項式補間は悪条件で悪名高く、避けるのが最善です。ルンゲの現象に関するWikiの記事を読んでから、補間の別の基準に切り替えることをお勧めします(たとえば、区分的多項式やスプライン)。
ジャックポールソン、2011

1
このディスカッションは、元の質問とは関係ありません。疑わしい最小二乗近似の実装が収束するかどうかは、元の質問には関係ありません。まだ混乱している場合は、別の質問を投稿することをお勧めします。
Jack Poulson、2011

11

あぁ!いいえ、いいえ、何千回、なし

理由の人々がするSVDが正確である使用を避けるクロス積を形成するために有するマトリックス、このマトリックスの形成は、システムの線形悪条件形成するための素敵なレシピなので!分解が適用されることになって直接に。(私の以前の回答のいくつかも参照してください。)AAA

前に、特異値をゼロにするための通常の基準は、それらを最大の特異値とマシンイプシロンの積と比較することであると述べました。ただし、これは、クロス積マトリックスの形成によって疑わしくなります。分解をもう一度実行してみてください。今回は、クロス積マトリックスではなく、設計マトリックス自体で実行してください。他の方法は、分解の悪用です。


3
これは十分に賛成できません...これは、SVDテクニックを正しく使用する上で最も重要なポイントの1つです。の特異値は特異値の二乗であることを忘れないでください!ATAA
khinsen

正確に。小さな数を二乗すると、さらに小さな数になります。2ノルムの条件数が最大値と最小値の比であるという事実を考慮すると、これは、通常の方程式のアプローチが大規模なシステムでは悪い考えとなる理由を知る1つの方法です。
JM

2

ここの何人かの人々があなたの問題に貴重なヒントを提供してくれたと思います。

ただし、今後の参考のために、悪質な線形最小二乗問題を解決する方法についての質問は、この問題に関する膨大な文献を調べることで解決できます。

具体的には、TSVD(切り捨てられた特異値分解)をソリューションを取得する簡単な方法として使用できます: ここで、はi番目の特異値、およびは行列のi番目の列です分解からのと、は問題の右側、そして表記はエントリの複素共役を意味し、次に行に変換されますようなベクトル

xk=i=1kuiHbσivi
σiuiviUVUSVH=AbuHuHbスカラー(ドット積)を生成します。したがって、あなたの解はベクトルです。xk

この設定の主な問題は、かなり高価なSVDの計算を余儀なくされることを除いて、使用する特異値の数、つまりどのように選択するかです。繰り返しますが、これを行う方法はいくつかありますが、最も一般的な方法は、不一致の原理、一般化交差検証法、およびL曲線です。k

これらすべて(およびそれ以上)は、Matlabの優れたツールボックス正規化ツールに実装されています。ツールボックスは使いやすく、他のプログラミング言語に簡単に翻訳できます。

結論として、他のアプローチがより適切であると示唆する重要な洞察をアプリケーションに提供している他の人もいますが、上記はまだ必要な場合に問題を解決する方法に関する簡単な要約です。


おかげで、私はこれのほとんどを知っています。私は多くのリソースを検索してきました-問題は、使用しているベーシスセットを拡大するにつれて、ソリューションがどんどん悪化することです。これは、使用されている基底関数の数と比較して、基底セットが増加するにつれて拒否される特異値の数が増えるためであるという結論に達しました。つまり、n = 100の基底関数を使用した場合、95の特異値をスローする必要があり、これは10の基底セットを使用して1つの特異値のみをスローする場合よりも悪い結果をもたらします。
drjrm3 2011

そうです、まあ、他の人が示唆しているように、あなたはあなたの基底関数を見て、おそらくあなたのデータをよりよく近似する基底を見つけるべきです。スプラインはオプションかもしれません。クリギングもそうかもしれませんが、それはまったく異なるアプローチですが、いくつかの場面で私に良い結果をもたらしています。
OscarB 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.