私は次の操作を行い、収束するまで繰り返すようにしようとしている:numpyの行列の策略 - 逆回行列の合計
各X は私n x p
あり、そしてそれらの
r
がある
samples
と呼ばれるr x n x p
の配列に格納されます。 U
はn x n
、V
はp x p
である。 (私はmatrix normal distributionのMLEを取得しています) サイズはすべて潜在的に大きいishです。私は少なくとも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-ネスを活用似たような)のような何かをすることによって、逆を避けることができますが、そこPythonのループがだ、それがnumpyの妖精たちが泣きます。
また、私はPythonのループを行うことなく、すべてのx
ためsolve
を使用してA^-1 x
の配列を得ることができるようにsamples
を整形想像できるが、それはメモリの無駄だ大きな補助配列になります。
明示的な逆も、Pythonのループも、大きなaux配列もありません。この3つの中で最良のものを得るためにできる線形代数またはnumpyのトリックはありますか?それとも、Pythonループを高速言語で実装して呼び出すのが最善でしょうか? (これを直接Cythonに移植するだけで、多くのPythonメソッド呼び出しが必要になりますが、あまり問題なく、関連するblas/lapackルーチンを直接作成するのはあまり問題にならないでしょう)。
(結局のところ、私は実際に行列U
とV
を最終的には必要としません - その決定要因、または実際にはクロネッカー製品の決定要因になります。決定を出す、それははるかに高く評価されるだろう。)誰かがより多くのインスピレーションの答えを思いつくまでは私があなただったら
よく質問されています。私の脳は今日はうまく機能していませんが、最初から数学的な部分を投稿してmath.stackexchangeに投稿することをお勧めしたいと思います。あなたが明白なショートカットを見逃している場合に備えて。あなたが正しいと思う、*そこにいるように*感じるかもしれない*かもしれない* spdマトリックスのプロパティを悪用する方法かもしれないが、私はそれを見ることもできない。 – YXD
@MrE提案していただきありがとうございます。 [私もそこに投稿しました](http://math.stackexchange.com/q/298512/19147)。 – Dougal