Pytanie:
Generowanie liczb losowych przy użyciu rozkładu t lub rozkładu laplace
user
2011-05-21 23:53:14 UTC
view on stackexchange narkive permalink

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.

@crucified Masz na myśli jakiś pakiet statystyczny?
Chcę wdrożyć w MATLAB
@cruc Matlab ma odwrotną dystrybucję t: patrz http://www.mathworks.com/help/toolbox/stats/tinv.html. Wszystko, co musisz zrobić, to zastosować tę funkcję do jednolitej losowej zmiennej z zakresu (0,1).
Ponieważ `tinv` jest częścią zestawu narzędzi statystycznych, musiałbyś za to dodatkowo zapłacić, chyba że kwalifikujesz się do wersji studenckiej, w takim przypadku jest ona częścią pakietu.
** Szybko i brudno **: `sqrt (n) * randn (1) / norm (randn (n, 1))` wygeneruje zmienną rozłożoną $ t $ z $ n $ stopniami swobody. Jest to prawdopodobnie najszybszy kod, ale z pewnością nie najszybszy do wykonania, zwłaszcza jeśli potrzebujesz ich bardzo dużej liczby.
Nie do końca jestem pewien, dlaczego zadałeś pytanie o dystrybucję Laplace'a, ponieważ wyraźnie mówi ci, jak je wygenerować w linku, który podajesz w swoim pytaniu!
Pięć odpowiedzi:
Jonas
2011-05-22 01:47:24 UTC
view on stackexchange narkive permalink

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 enter image description here

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ę.

NRH
2011-05-22 00:05:30 UTC
view on stackexchange narkive permalink

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.

Proszę, wybacz moją ignorancję. Chcę to zrobić w Matlabie. Być może będę musiał użyć rozkładu t ze stopniami swobody w zakresie od 1 do 30. W wiki podany jest wzór tylko na 1, 2, 4 stopnie swobody. Czy istnieje uogólniona formuła funkcji kwantylowej? Czy mógłbyś podać wzory na inną parzystą liczbę stopni swobody?
@crucified, dla funkcji kwantyla $ t $ nie będzie zamknięta forma. Zobacz odnośniki G. W. Hilla wymienione [tutaj] (http://stat.ethz.ch/R-manual/R-patched/library/stats/html/TDist.html). Możesz również pobrać kod źródłowy dla [GSL] (http://www.gnu.org/software/gsl/) i wyszukać [odpowiednie funkcje] (http://www.gnu.org/software/gsl/ manual / html_node / The-t_002ddistribution.html). Sam nie szukałem, ale prawdopodobnie łatwo jest przenieść się na MATLAB.
@cardinal +1, zwłaszcza biorąc pod uwagę fakt, że istnieją powiązania GSL dla Octave.
petrichor
2011-06-15 16:14:10 UTC
view on stackexchange narkive permalink

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)  

Laplace distribution

shabbychef
2011-05-23 22:29:07 UTC
view on stackexchange narkive permalink

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.

mark999
2011-05-22 11:22:49 UTC
view on stackexchange narkive permalink

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.

** NB: ** To jest odpowiedź na drugie pytanie, które zostało następnie połączone z obecnym. Jak słusznie wskazuje @mark999, te dwa pytania są takie same, z wyjątkiem tego, że jedno dotyczy zmiennych Laplace'a, a oryginalne (to) dotyczy zmian t Studenta.
@whuber: może więc mieć sens, aby edytować to pytanie, aby uwzględnić dystrybucję Laplace'a.


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...