私の問題は次のとおりです。(切り捨てられた) 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 アルゴリズム (初期ベクトルの特定の選択に対して) は決定論的であり、ステップはパラメーターの選択に依存しません。これにより、固有値を解くための対称的な三重対角行列が得られます。
ここでは分割統治が機能する可能性があります。関連する固有値とは無関係に固有ベクトルを追跡できるバージョンを実装できるようです。少なくとも「分割」部分は、決定論的でパラメータに依存しない方法で実装できますが、確実に知るには、アルゴリズムの「征服」部分についてもっと学ぶ必要があります。