Próbuję wykonać następujące czynności i powtarzać aż do zbieżności:numpy oszustwo matrix - suma macierzy odwrotnych razy
gdzie każdy X i jest n x p
i istnieje r
z nich w macierzy r x n x p
o nazwie samples
. U
jest n x n
, jest p x p
. (Dostaję MLE od matrix normal distribution.) Rozmiary są potencjalnie duże-ish; Oczekuję rzeczy przynajmniej na zamówienie: r = 200
, n = 1000
, p = 1000
.
Mój obecny kod robi
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)
Działa to dobrze, ale oczywiście nigdy nie powinniśmy się rzeczywiście znaleźć odwrotność i pomnożyć przez niego rzeczy. Byłoby dobrze, gdybym mógł w jakiś sposób wykorzystać fakt, że U i V są symetryczne i pozytywne. Chciałbym móc po prostu obliczyć współczynnik Cholesky U i V w iteracji, ale nie wiem jak to zrobić z powodu sumy.
mogłem uniknąć odwrotność wykonując coś jak
V = sum(np.dot(x.T, scipy.linalg.solve(A, x)) for x in samples)
(lub coś podobnego, że wykorzystał PSD-ności), ale to nie jest to pętla Python, a to sprawia, że NumPy wróżki płakać.
mogłem również wyobrazić przekształcanie samples
w taki sposób, że mogę dostać tablicę A^-1 x
korzystając solve
dla każdego x
bez konieczności wykonywania pętli Pythona, ale to robi dużą tablicę pomocniczą, że to strata pamięci.
Czy istnieje algebra liniowa lub sztuczka numpy, którą mogę zrobić, aby uzyskać najlepsze z wszystkich trzech: brak wyraźnych odwrotności, brak pętli w Pythonie i brak dużych tablic Aux? A może mój najlepszy zakład implementacji tego z pętlą Python w szybszym języku i wywoływanie go? (Po prostu przeniesienie go bezpośrednio do Cythona mogłoby pomóc, ale nadal wymagałoby wielu wywołań w języku Python, ale może nie byłoby zbyt wielkim problemem, aby odpowiednie procedury blas/lapack były wykonywane bezproblemowo.)
(Jak się okazuje, naprawdę nie potrzebuję w końcu matryc U
i V
- tylko ich wyznaczniki, a właściwie tylko wyznacznik ich produktu Kroneckera. Więc jeśli ktoś ma sprytny pomysł na to, jak wykonać mniej pracy i wciąż dostać się uwarunkowania, które byłyby mile widziane.)
Ładnie napisane pytanie. Mój mózg nie funkcjonuje dobrze dzisiaj, ale chciałem po prostu polecić, abyś zamieścił przynajmniej części matematyczne od początku i na końcu do math.stackexchange.com na wypadek, gdy brakuje ci oczywistego skrótu. Masz rację, * wydaje się, że * może * być sposobem na wykorzystanie właściwości macierzy SPD, ale ja też tego nie widzę. – YXD
@MrE Dzięki za sugestię; [Wysłałem tam również] (http://math.stackexchange.com/q/298512/19147). – Dougal