2

私の問題は次のとおりです。(切り捨てられた) Karhunen-Loeve 変換を介してランダム プロセスのスペクトル分解を試みていますが、共分散行列は実際には行列の 1 パラメーター ファミリーであり、その方法を推定/視覚化する方法が必要です。私のランダムプロセスは、このパラメーターに依存します。これを行うには、numpy.linalg.eigh() によって生成された固有ベクトルを追跡する方法が必要です。

私の問題を理解してもらうために、おもちゃの問題の例を示します。点の集合 {xs} と、共分散 C(x,y) = 1/(1+a*(xy) を持つランダム プロセス R があるとします。 ^2) パラメータ a に依存します。範囲 [0,1] のグリッド ポイントのランダム サンプルと、特定の a (a=1 など) の選択について、共分散行列を作成し、以下を使用して Karhunen-Loeve 変換を実装できます。

num_x = 1000
xs = numpy.array([numpy.random.uniform() for i in range(num_x)])
z=numpy.random.standard_normal(num_x)
a0=1
def cov(x,y,a=a0): return 1/(1+a*(x-y)^2)
cov_m = numpy.array(map(lambda y: map(lambda x: cov(x,y),xs),xs))
w,v=numpy.linalg.eigh(cov_m)
R=numpy.dot(v,z*w^0.5)

これにより、各ランダム グリッド ポイント xs で定義された値を使用して R を実現できます。ただし、私ができる必要があるのは、特定の実現 (グリッド xs とランダム係数 z の特定の選択を意味する) のために、共分散関数のパラメーター a に対して R がどのように変化するかを追跡することです。

共分散行列をシンボリックに計算し、事後に a を指定できれば、これは簡単に実行できます。ただし、大規模な行列の場合、これは妥当なオプションではありません。別の方法は、numpy.linalg.eigh() によって返される各固有ベクトルを追跡する方法を見つけることです。残念ながら、numpy は常に最小の固有値を最初にリストするように並べ替えているようです。これは、a を変化させると、固有ベクトルが予想外に並べ替えられ、内積 numpy.dot(v,z*w^0.5) が同じ固有ベクトルに同じ係数を割り当てなくなることを意味します。

これを回避する方法はありますか?

(これは ASKSAGE からのクロスポストです。私の実装では Sage を使用していますが、質問は Sage 固有のものではなく、ここでより多くのアクティビティがあるように思われるため、再ポストすると思いました。クロスポストが受け入れられない場合はお詫びします。もしそうなら、これを削除してください。)

編集: 以下の会話に基づいて、この問題の性質についてさらに詳細を追加する必要があることがわかります。

Karhunen-Loeve 変換の背後にある考え方は、次のように、ランダム プロセス R(x) をスペクトル的に分解することです。

R(x) = \sum_{i} Z_i \lambda_i^{1/2} \phi^{(i)}(x),

ここで、各 Z_i は標準正規分布の iid 確率変数であり、各 \phi^{(i)}(x) は共分散行列の固有ベクトルの解によって決定される x の非ランダム関数であり、各 \lambda_i \phi^{(i)} に関連付けられた対応する固有値です。

パラメータ a に対する R の依存性を示すには、各 \phi^{(i)} に係数 Z_i を一意に割り当てることができる必要があります。すべての Z が同じように分散されているため、この割り当てをどのように行うかは問題ではありませんが、割り当ては一意である必要があり、パラメータ a に依存するため、対応する \lambda_i の値に依存することはできません。

解析的な解決策は簡単です。任意の a の固有ベクトルと固有値を計算し、Z を指定して R の特定の実現を選択し、R の実現がどのように a に依存するかを観察するだけです。(おもちゃのモデルの場合、R は通常、a が増加するにつれてより急速に変化します。)

ここでの問題は、これを数値的に実装する方法です。Numpy は計算中に固有ベクトルを明らかにスクランブルするため、一意にタグ付けする方法はありません。これを行う唯一の方法は、基礎となるコードを掘り下げて、何らかのタイプの任意のタグ付け機能を具体的に実装することだと思います。

問題を簡潔に言えば、関連付けられた固有値の大きさに依存しない、numpy によって生成された固有ベクトルを順序付ける方法が必要です。

これを行う方法はありますか?

更新: この問題に対する部分的な回答を見つけることができましたが、完全な回答を得るにはさらに調査を行う必要があります。これには独自のアルゴリズムを実装する必要があるようです。

私が検討しているタイプの行列の場合、Lanczos アルゴリズム (初期ベクトルの特定の選択に対して) は決定論的であり、ステップはパラメーターの選択に依存しません。これにより、固有値を解くための対称的な三重対角行列が得られます。

ここでは分割統治が機能する可能性があります。関連する固有値とは無関係に固有ベクトルを追跡できるバージョンを実装できるようです。少なくとも「分割」部分は、決定論的でパラメータに依存しない方法で実装できますが、確実に知るには、アルゴリズムの「征服」部分についてもっと学ぶ必要があります。

4

2 に答える 2

1

少し調べた結果、この問題に対する 2 つの部分的な答えを見つけることができました。

1 つ目は、ゼロの固有ベクトルを持たない実対称行列 (非縮退を指定する必要がある場合もあります) の場合、固有値とは無関係に固定された順序で固有値ペアを生成する固有値ペア問題を解くためのアルゴリズムを生成することが実行可能であるということです。マトリックスの選択。一定の開始ベクトルが与えられると、ランチョス アルゴリズムは、決定論的な方法で、任意の実対称行列の三重対角行列を生成します。分割統治アルゴリズムの「分割」部分も同様に決定論的です。つまり、反復回数が行列の要素の値に依存するアルゴリズムの唯一の部分は「征服」部分であり、永年方程式:

1+\sum_j^m w_j^2/(d_j-\lambda)=0

したがって、2x2 ブロックごとに、問題は、実際には元の行列の値に依存しない方法で、永年方程式の 2 つの根を並べ替える方法に要約されます。

2 番目の部分的な解決策は、実装がはるかに簡単ですが、失敗する傾向があります。振り返ってみると、それも明らかです。

同じ行列の 2 つの異なる固有ベクトルは、常に互いに直交します。したがって、固有ベクトルが 1 つのパラメーター a の関数として滑らかに変化する場合、次のようになります。

v_i(a).v_j(a+da) = \delta_{ij} + O(da)

したがって、これにより、パラメーター a の変化に応じて固有ベクトル間の自然なマッピングが得られます。

これは、David Zwicker と jorgeca が固有ベクトルのペア間のグローバル距離を測定することを提案したアイデアに似ていますが、実装ははるかに簡単です。ただし、これを実装すると、固有ベクトルが急速に変化する領域や、パラメーター a の変化が大きすぎる場合に失敗する傾向があります。

また、固有値の交差で何が起こるかという問題は興味深いものです。なぜなら、そのような交差ごとにシステムが縮退するからです。ただし、縮退にまたがる許可された固有ベクトルのセット内には、内積条件を満たす 2 つがあり、縮退にまたがる基底として使用できるため、マッピングが維持されます。

もちろん、これは、固有ベクトルをパラメーター空間上の滑らかな連続関数として扱うことが正しいと仮定していますが、(jorgeca が指摘したように) 仮定できるかどうかはわかりません。

于 2013-06-14T16:32:03.220 に答える
-1

私がよく理解している場合、実変数 t の連続関数であるエントリによって与えられる行列 A(t) の固有値 \lambda(t) を探しています。

本を参照することをお勧めします。

[1] R. Bathia: マトリックス分析、スプリンガー。第六章?

[2] T. Kato: 線形作用素の摂動論の簡単な紹介、第 II 章の定理 5.2。

[3] D. Hinrichsen、A. Pritchard: 数学システム理論、Vol。1、系 4.1.19。

于 2014-02-12T20:24:10.173 に答える