私は次のことを行おうとしています、そして収束するまで繰り返します:
ここで、各X iはn x p
であり、 。と呼ばれる配列r
にそれらがあります。です、です。(行列正規分布のMLEを取得しています。)サイズはすべて潜在的に大きいです。私は少なくとも、、、のオーダーで物事を期待して います。r x n x p
samples
U
n x n
V
p x p
r = 200
n = 1000
p = 1000
私の現在のコードは
V = np.einsum('aji,jk,akl->il', samples, np.linalg.inv(U) / (r*n), samples)
U = np.einsum('aij,jk,alk->il', samples, np.linalg.inv(V) / (r*p), samples)
これは問題なく機能しますが、もちろん、実際に逆を見つけてそれを乗算することは想定されていません。UとVが対称で正定値であるという事実をどうにかして利用できれば、それも良いことです。反復でUとVのコレスキー係数を計算できるようにしたいと思いますが、合計のため、その方法がわかりません。
私は次のようなことをすることで逆を避けることができます
V = sum(np.dot(x.T, scipy.linalg.solve(A, x)) for x in samples)
(またはpsd-nessを利用した類似のもの)が、Pythonループがあり、それは厄介な妖精を泣かせます。
また、Pythonループを実行せずに、すべてに使用samples
する配列を取得できるような方法で再形成することも想像できますが、それはメモリの浪費である大きな補助配列になります。A^-1 x
solve
x
3つすべてを最大限に活用するために実行できる線形代数または厄介なトリックはありますか?明示的な逆関数、Pythonループ、および大きなaux配列はありませんか?それとも、Pythonループを備えたものをより高速な言語で実装し、それを呼び出すのが最善の策ですか?(Cythonに直接移植するだけでも役立つ場合がありますが、それでも多くのPythonメソッド呼び出しが必要になります。ただし、関連するblas / lapackルーチンをそれほど問題なく直接作成するのはそれほど問題ではないでしょう。)
(結局のところ、私は実際には行列式を必要とせずU
、V
最終的には行列式だけ、または実際にはクロネッカー積の行列式だけを必要とします。したがって、誰かがより少ない作業を行い、それでも決定要因が出て、それは大いにありがたいです。)