Jestem nowicjuszem w statystykach. Dokończę pracę magisterską z zakresu Algorytm ewolucyjny. Muszę wygenerować liczby losowe z rozkładu T lub rozkładu Laplace'a. Jak mogę to zrobić?
Byłoby mile widziane łatwe i proste wyjaśnienie.
Jestem nowicjuszem w statystykach. Dokończę pracę magisterską z zakresu Algorytm ewolucyjny. Muszę wygenerować liczby losowe z rozkładu T lub rozkładu Laplace'a. Jak mogę to zrobić?
Byłoby mile widziane łatwe i proste wyjaśnienie.
Oto jak to zrobić w Matlabie przy użyciu TINV z tego zestawu narzędzi statystycznych:
% # wybierz stopień swobodydf = 4; % # zauważ, że w razie potrzeby możesz również wybrać tablicę df% # utwórz wektor składający się z 100 000 równomiernie rozłożonych losowych zmiennychuni = rand (100000,1);% # wyszukaj odpowiednie wartości tout = tinv (uni, df);
W nowszej wersji Matlaba możesz po prostu użyć TRND do bezpośredniego tworzenia liczb losowych.
out = trnd (100000, df);
Oto histogram out
EDYTUJ Re: scalone pytanie
Matlab nie ma wbudowanej funkcji do rysowania liczb z rozkładu Laplace'a. Jest jednak funkcja LAPRND z Matlab File Exchange, która zapewnia dobrze napisaną implementację.
Prosta odpowiedź: użyj R i pobierz zmienne n
dla $ t $ -distribution z df
stopniami swobody przez rt (n, df) kod>. Jeśli nie używasz R, może możesz napisać, jakiego języka używasz, a inni mogą być w stanie dokładnie powiedzieć, co mają robić.
Jeśli nie używasz R lub innego języka z wbudowanym generatorem liczb losowych dla dystrybucji $ t $, ale masz dostęp do funkcji kwantyla , $ Q $, dla $ t $ -distribution i możesz wygenerować jednolitą losową zmienną $ U $ na $ [0,1] $, a następnie $ Q (U) $ następuje po $ t $ -distribution.
W przeciwnym razie spójrz na tę krótką sekcję na stronie Wikipedii.
Patrząc na artykuł w Wikipedii, napisałem funkcję do generowania zmiennych losowych z dsistribution Laplace'a. Oto ona:
function x = laplacernd (mu, b, sz)% LAPLACERND Generuje zmienne losowe Laplacian%% x = LAPLACERND (mu, b, sz) generuje zmienne losowe z Laplace% dystrybucja o parametrach mu i b. sz oznacza rozmiar% zwracanych zmiennych losowych. Zobacz [1] dla dystrybucji Laplace'a.%% [1] http://en.wikipedia.org/wiki/Laplace_distribution%% Ismail Ari, 2011if nargin < 1% Równe rozkładowi wykładniczemu skalowanemu o 1/2 mu = 0; endif nargin < 2 b = 1; endif nargin < 3 sz = 1; endu = rand (sz) - 0,5; x = mu - b * sign (u). * log (1-2 * abs (u));
A oto fragment kodu, aby go użyć
clc, clearmu = 30; b = 2; sz = [50000 1]; x = laplacernd ( mu, b, sz); hist (x, 100)
Najlepszym (najszybszym do uruchomienia, nie najszybszym w kodowaniu;) darmowym rozwiązaniem, jakie znalazłem w Matlabie, było owinięcie biblioteki R MATHLIB_STANDALONE c funkcją mex. Daje to dostęp do PRNG dystrybucji t R. Jedną z zalet tego podejścia jest to, że możesz również użyć tej samej sztuczki, aby uzyskać zmienne z niecentralnej dystrybucji t.
Drugim najlepszym darmowym rozwiązaniem było użycie implementacji trnd a oktawy >. Przeniesienie z oktawy okazało się dla mnie bardziej pracochłonne niż zawijanie kodu c.
Jak na mój gust, używanie jednolitego generowania przez rand
i odwracanie przez tinv
było o wiele za wolne. YMMV.
Możesz zastosować to samo podejście, które zostało opisane w odpowiedzi na Twoje pytanie dotyczące generowania liczb losowych z rozkładu t-Studenta. Najpierw wygeneruj równomiernie rozłożone liczby losowe z punktu (0,1), a następnie zastosuj funkcję odwrotnego rozkładu skumulowanego rozkładu Laplace'a, podaną w artykule na Wikipedii, do którego masz łącze.