Tôi đang cố gắng để làm như sau, và lặp lại cho đến khi hội tụ:NumPy ma trận thủ đoạn gian trá - tổng của ma trận nghịch đảo lần
nơi mỗi X i là n x p
, và có r
trong số họ trong một mảng r x n x p
được gọi là samples
. U
là n x n
, V
là p x p
. (Tôi nhận được MLE của một matrix normal distribution.) Các kích thước là tất cả khả năng lớn-ish; Tôi đang mong đợi những thứ ít nhất theo thứ tự của r = 200
, n = 1000
, p = 1000
.
mã hiện tại của tôi không
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)
này hoạt động ổn, nhưng tất nhiên bạn sẽ không bao giờ phải thực sự tìm nghịch đảo và nhân thứ bởi nó. Nó cũng sẽ tốt nếu tôi bằng cách nào đó có thể khai thác thực tế là U và V là đối xứng và xác định tích cực. Tôi rất muốn có thể tính toán hệ số Cholesky của U và V trong lần lặp lại, nhưng tôi không biết làm thế nào để làm điều đó vì tổng số.
tôi có thể tránh được nghịch đảo bằng cách làm một cái gì đó giống như
V = sum(np.dot(x.T, scipy.linalg.solve(A, x)) for x in samples)
(hoặc một cái gì đó tương tự mà khai thác psd-Ness), nhưng sau đó có một vòng lặp Python, và điều đó làm cho các nàng tiên NumPy khóc.
tôi cũng có thể tưởng tượng được định hình lại samples
theo cách như vậy mà tôi có thể nhận được một loạt các A^-1 x
sử dụng solve
cho mỗi x
mà không cần phải làm một vòng lặp Python, nhưng điều đó làm cho một mảng lớn phụ trợ đó là một sự lãng phí bộ nhớ. Có một số đại số tuyến tính hoặc mẹo vặt tôi có thể làm để có được tốt nhất trong cả ba: không có đảo ngược rõ ràng, không có vòng lặp Python, và không có mảng aux lớn nào không? Không. Hoặc là đặt cược tốt nhất của tôi thực hiện một với một vòng lặp Python trong một ngôn ngữ nhanh hơn và gọi ra nó? (Chỉ cần chuyển trực tiếp đến Cython có thể giúp ích, nhưng vẫn liên quan đến nhiều cuộc gọi phương thức Python; nhưng có thể sẽ không quá nhiều rắc rối để thực hiện các thủ tục liên quan đến blas/lapack trực tiếp mà không gặp quá nhiều rắc rối.)
(Khi nó quay ra, tôi không thực sự cần các ma trận U
và V
cuối cùng - chỉ là yếu tố quyết định của chúng, hoặc thực sự chỉ là yếu tố quyết định cho sản phẩm Kronecker của chúng. Vì vậy, nếu ai đó có ý tưởng thông minh về cách làm ít công việc hơn có được yếu tố quyết định ra ngoài, mà sẽ được nhiều đánh giá cao.)
Câu hỏi được viết độc đáo. Não của tôi không hoạt động tốt ngày hôm nay, nhưng tôi chỉ muốn khuyên bạn nên đăng ít nhất các phần toán học từ đầu và cuối đến math.stackexchange.com trong trường hợp bạn đang thiếu một phím tắt rõ ràng. Bạn đang phải, nó * cảm thấy * như có * có thể * là một cách để khai thác các thuộc tính ma trận spd nhưng tôi không thể nhìn thấy nó. – YXD
@MrE Cảm ơn bạn đã đề xuất; [Tôi cũng đã đăng nó ở đó] (http://math.stackexchange.com/q/298512/19147). – Dougal