Chciałbym być w stanie efektywnie generować macierze korelacji dodatnich-półprzewodnikowych (PSD). Moja metoda gwałtownie zwalnia, gdy zwiększam rozmiar generowanych macierzy.
- Czy możesz zasugerować jakieś skuteczne rozwiązania? Jeśli znasz jakieś przykłady w Matlabie, byłbym bardzo wdzięczny.
- W jaki sposób przy generowaniu macierzy korelacji PSD wybrałbyś parametry opisujące macierze do wygenerowania? Średnia korelacja, standardowe odchylenie korelacji, wartości własne?
random-generation
correlation-matrix
Eduardas
źródło
źródło
Odpowiedzi:
Możesz to zrobić wstecz: każda macierz (zbiór wszystkich symetrycznych macierzy PSD) może zostać rozłożona jako p × pC∈Rp++ p×p
Aby uzyskać , najpierw wygeneruj losową podstawę (gdzie są wektorami losowymi, zwykle w ). Stamtąd użyj procesu ortogonalizacji Gram-Schmidta, aby uzyskać( V 1 , . . . , V s ) v I ( - 1 , 1 ) ( U 1 , . . . . , U t ) = OO (v1,...,vp) vi (−1,1) (u1,....,up)=O
Wreszcie, jest macierzami ukośnymi, których elementy są dodatnie (znowu jest to łatwe do wygenerowania: wygeneruj liczb losowych, wyprostuj je, posortuj i umieść na przekątnej macierzy po ).p p pD p p p
źródło
Artykuł Generowanie losowych macierzy korelacji na podstawie metody winorośli i rozszerzonej cebuli autorstwa Lewandowskiego, Kurowickiej i Joe (LKJ), 2009, zapewnia ujednolicone traktowanie i opis dwóch skutecznych metod generowania macierzy losowej korelacji. Obie metody pozwalają na generowanie macierzy z jednolitego rozkładu w ściśle określonym sensie zdefiniowanym poniżej, są łatwe do wdrożenia, szybkie i mają dodatkową zaletę polegającą na zabawnych nazwach.
Prawdziwa macierz symetryczna o rozmiarze z elementami na przekątnej ma unikalne elementy poza przekątną, więc można ją sparametryzować jako punkt w . Każdy punkt w tej przestrzeni odpowiada macierzy symetrycznej, ale nie wszystkie z nich są dodatnio określone (ponieważ muszą to być macierze korelacji). Macierze korelacji tworzą zatem podzbiór (właściwie połączony wypukły podzbiór), i obie metody mogą generować punkty z jednolitego rozkładu w tym podzbiorze.d×d d(d−1)/2 Rd(d−1)/2 Rd(d−1)/2
Przedstawię własną implementację MATLAB dla każdej metody i zilustruję je .d=100
Metoda cebuli
Metoda cebulowa pochodzi z innego artykułu (nr 3 w LKJ) i zawdzięcza swoją nazwę faktowi, że macierze korelacji są generowane zaczynając od macierzy i rosnąc ją kolumna po kolumnie i rząd po rzędzie. Wynikowy rozkład jest jednolity. Naprawdę nie rozumiem matematyki za tą metodą (i tak wolę drugą metodę), ale oto wynik:1×1
Tu i poniżej tytuł każdej podploty pokazuje najmniejsze i największe wartości własne oraz wyznacznik (iloczyn wszystkich wartości własnych). Oto kod:
Metoda rozszerzonej cebuli
LKJ nieznacznie zmodyfikuje tę metodę, aby móc próbkować macierze korelacji z rozkładu proporcjonalnego do . Im większa , tym większa będzie wyznacznik, co oznacza, że generowane macierze korelacji będą coraz bardziej zbliżały się do matrycy tożsamości. Wartość odpowiada rozkładowi jednorodnemu. Na poniższym rysunku macierze są generowane z .C [detC]η−1 η η=1 η=1,10,100,1000,10000,100000
Z jakiegoś powodu, aby uzyskać wyznacznik tego samego rzędu wielkości co w metodzie z wanilią, muszę a nie (jak twierdzi LKJ). Nie jestem pewien, gdzie jest błąd.η=0 η=1
Metoda winorośli
Metoda Vine została pierwotnie zasugerowana przez Joe (J w LKJ) i ulepszona przez LKJ. Bardziej mi się podoba, ponieważ jest koncepcyjnie łatwiejszy, a także łatwiejszy do modyfikacji. Chodzi o to, aby wygenerować częściowe korelacje (są one niezależne i mogą mieć dowolne wartości z bez żadnych ograniczeń), a następnie przekształcić je w surowe korelacje za pomocą wzoru rekurencyjnego. Wygodnie jest zorganizować obliczenia w określonej kolejności, a ten wykres jest znany jako „winorośl”. Co ważne, jeśli próbkuje się korelacje częściowe z poszczególnych rozkładów beta (różnych dla różnych komórek w macierzy), wówczas uzyskana macierz będzie rozkładana równomiernie. Tutaj ponownie LKJ wprowadza dodatkowy parametr aby pobrać próbkę z rozkładu proporcjonalnego dod(d−1)/2 [−1,1] η [detC]η−1 . Wynik jest identyczny z rozszerzoną cebulą:
Metoda winorośli z ręcznym próbkowaniem korelacji cząstkowych
Jak widać powyżej, równomierny rozkład daje prawie diagonalne macierze korelacji. Ale można łatwo zmodyfikować metodę winorośli, aby uzyskać silniejsze korelacje (nie jest to opisane w pracy LKJ, ale jest proste): w tym celu należy próbkować korelacje częściowe z rozkładu skoncentrowanego wokół . Poniżej próbuję je z rozkładu beta (przeskalowanego z na ) za pomocą . Im mniejsze parametry rozkładu beta, tym bardziej jest ono skoncentrowane w pobliżu krawędzi.±1 [0,1] [−1,1] α=β=50,20,10,5,2,1
Zauważ, że w tym przypadku nie ma gwarancji, że rozkład będzie niezmienny w permutacji, więc dodatkowo generuję losowo wiersze i kolumny po wygenerowaniu.
Oto, jak histogramy elementów nie przekątnych wyglądają dla powyższych matryc (wariancja rozkładu monotonicznie wzrasta):
Aktualizacja: przy użyciu losowych czynników
Jedna bardzo prosta metoda generowania macierzy losowych korelacji z pewnymi silnymi korelacjami została zastosowana w odpowiedzi przez @shabbychef i chciałbym to również zilustrować tutaj. Chodzi o to, aby losowo wygenerować kilka ( ) ładunków czynnikowych (losowa macierz wielkości), utworzyć macierz kowariancji (który oczywiście nie będzie pełnej rangi ) i dodaj do niej losową macierz ukośną z dodatnimi elementami, aby pełna ranga. Otrzymaną macierz kowariancji można znormalizować, aby stała się macierzą korelacji, pozwalającW k x d W W ⊤ D B = W W ⊤ + D C = E - 1 / 2 B E - 1 / 2 PL B K = 100 , 50 , 20 , 10 , 5 , 1k<d W k×d WW⊤ D B=WW⊤+D C=E−1/2BE−1/2 Gdzie jest macierzą diagonalną o tej samej przekątnej, co . To jest bardzo proste i załatwia sprawę. Oto kilka przykładowych macierzy korelacji dla :E B k=100,50,20,10,5,1
I kod:
Oto kod opakowania używany do generowania liczb:
źródło
Jeszcze prostszym charakterystyki jest to, że dla rzeczywistej macierzy , jest dodatnia półokreśloną. Aby zrozumieć, dlaczego tak jest, wystarczy udowodnić, że dla wszystkich wektorów (oczywiście o odpowiednim rozmiarze). Jest to trywialne:co jest nieujemne. Więc w Matlabie po prostu spróbujA ATA yT(ATA)y≥0 y yT(ATA)y=(Ay)TAy=||Ay||
W zależności od aplikacji może to nie zapewniać odpowiedniej dystrybucji wartości własnych; Odpowiedź Kwaka jest pod tym względem znacznie lepsza. Wartości własne
X
wytworzone przez ten fragment kodu powinny być zgodne z rozkładem Marchenko-Pastur.Powiedzmy, że do symulacji macierzy korelacji zapasów może być potrzebne nieco inne podejście:
źródło
W odmianie odpowiedzi kwaka: wygeneruj macierz diagonalną z losowymi nieujemnymi wartościami własnymi z wybranego rozkładu, a następnie wykonaj transformację podobieństwa z pseudolosową macierzą rozproszoną przez Haara .A = Q D Q T QD A=QDQT Q
źródło
Nie określono rozkładu macierzy. Dwa popularne to Wishart i odwrotne rozkłady Wishart. Rozkładu Bartlett daje Cholesky'iego faktoryzacji macierzy losowo Wishart (która może być również skutecznie rozwiązać w celu uzyskania losowo odwrotną Wishart matrycy).
W rzeczywistości przestrzeń Choleskiego jest wygodnym sposobem generowania innych rodzajów losowych macierzy PSD, ponieważ wystarczy upewnić się, że przekątna nie jest ujemna.
źródło
Najprostszą metodą jest powyższa, która jest symulacją losowego zestawu danych i obliczeniem Gramiana . Słowo ostrzeżenia: wynikowa macierz nie będzie jednorodnie losowa, ponieważ jej rozkład, powiedzmy, będzie miał obroty nie rozmieszczone zgodnie z miarą Haara. Jeśli chcesz mieć „równomiernie rozmieszczone” matryce PSD, możesz zastosować dowolne z opisanych tutaj podejść .UTSU
źródło
Jeśli chcesz mieć większą kontrolę nad wygenerowaną symetryczną matrycą PSD, np. Wygenerować zestaw danych do weryfikacji syntetycznej, masz do dyspozycji szereg parametrów. Symetryczna macierz PSD odpowiada hiper-elipsie w przestrzeni N-wymiarowej, ze wszystkimi powiązanymi stopniami swobody:
Tak więc dla macierzy dwuwymiarowej (tj. Elipsy 2d) będziesz mieć 1 obrót + 2 osie = 3 parametry.
źródło
Tanim i wesołym podejściem, którego użyłem do testowania, jest wygenerowanie m N (0,1) n wektorów V [k], a następnie użycie P = d * I + Suma {V [k] * V [k] '} jako macierz psd nxn. Przy m <n będzie to liczba pojedyncza dla d = 0, a dla małego d będzie miała wysoką liczbę warunkową.
źródło