나는 다음을 수행하고, 수렴 할 때까지 반복하기 위해 노력하고있어 :NumPy와 매트릭스 속임수 - 역 번 행렬의 합
각 X 내가는 n x p
이며, 그 중 r
가있는 경우 samples
이라는 r x n x p
배열에 있습니다. U
은 n x n
, V
은 p x p
입니다. (나는 matrix normal distribution의 MLE를 얻고있다.) 크기는 모두 잠재적으로 크다. 나는 적어도 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의 Cholesky 팩터를 계산할 수 있기를 원하지만, 합계 때문에이를 수행하는 방법을 모르겠습니다.
나는
V = sum(np.dot(x.T, scipy.linalg.solve(A, x)) for x in samples)
(또는 PSD-다움을 악용 그 비슷한)과 같은 작업을 수행하여 역을 피하기,하지만 거기에 파이썬 루프, 그리고 그는 NumPy와 요정 울려요 수 있습니다.
나는 또한 내가 파이썬 루프를 할 필요없이 모든 x
에 대한 solve
를 사용 A^-1 x
의 배열을 얻을 수있는 방식으로 samples
을 재편 상상할 수 있지만, 메모리의 낭비 큰 보조 배열을 만든다.
명시 적 반전 없음, 파이썬 루핑 없음, 큰 aux 배열 없음을 모두 만족하기 위해 할 수있는 선형 대수 또는 numpy 트릭이 있습니까? 아니면 더 빠른 언어로 파이썬 루프를 구현하고 호출하는 것이 최선의 방법일까요? (Cython으로 직접 이식하는 것만으로도 도움이 될 수 있지만 여전히 많은 Python 메서드 호출이 필요하지만 어쨌든 너무 많은 문제없이 관련 blas/lapack 루틴을 직접 작성하는 것은 그리 어렵지 않을 수 있습니다.)
(실제로 밝혀진 바 최종적으로 행렬 U
과 V
은 실제로 필요하지 않으며 단지 결정 요인이거나 크로 네커 제품의 결정 요인 일뿐입니다. 따라서 작업량을 줄이는 방법에 대한 영리한 아이디어가 있다면 결정 요인을 얻을, 그것은 많이 주시면 감사하겠습니다.) 누군가가 더 영감 대답과 함께 때까지 내가 당신이라면
멋지게 작성된 질문입니다. 제 두뇌가 잘 작동하지는 않지만 적어도 처음부터 수학적 부분을 게시하고 math.stackexchange로 끝내는 것이 좋습니다.당신이 명백한 지름길을 놓치고있는 경우에 대비해. 당신 말이 맞아요, 거기 *처럼 *있을 수도 * SPD 매트릭스 속성을 악용하는 방법이 될 수도 있지만 그것을 볼 수 없습니다. – YXD
@MrE 제안에 감사드립니다. [나는 그것도 거기 게시했습니다] (http://math.stackexchange.com/q/298512/19147). – Dougal