Pitanje:
Kako uzeti uzorak iz normalne distribucije s poznatim srednjim vrijednostima i varijancom pomoću konvencionalnog programskog jezika?
Fixee
2011-10-02 02:03:32 UTC
view on stackexchange narkive permalink

Nikad nisam imao tečaj statistike, pa se nadam da pitam ovdje na pravom mjestu.

Pretpostavimo da imam samo dva podatka koji opisuju normalnu raspodjelu: srednji $ \ mu $ i varijance $ \ sigma ^ 2 $. Želim upotrijebiti računalo za nasumični uzorak iz ove distribucije tako da poštujem ove dvije statistike.

Prilično je očito da mogu podnijeti srednju vrijednost jednostavnom normalizacijom oko 0: samo dodajte $ \ mu $ u svaku uzorak prije izlaska uzorka. Ali ne vidim kako programski generirati uzorke da poštujem $ \ sigma ^ 2 $.

Moj program bit će na konvencionalnom programskom jeziku; Nemam pristup nijednom statističkom paketu.

Does your language has random number generator? Is this generator from uniform distribution only or it can generate from normal distribution too?
AilixggdwbCMT Pretty much every computer language comes with a random number generator. They are overwhelmingly uniform generators on some finite domain.
četiri odgovori:
NRH
2011-10-02 02:16:17 UTC
view on stackexchange narkive permalink

Ako možete uzeti uzorak iz zadane distribucije sa srednjom vrijednosti 0 i varijancom 1, tada možete lako uzeti uzorak iz transformacije lokacije mjerila te distribucije, koja ima srednje vrijednosti $ \ mu $ i varijancu $ \ sigma ^ 2 $. Ako je $ x $ uzorak iz srednje distribucije 0 i varijance 1, tada je $$ \ sigma x + \ mu $$ uzorak sa srednjom vrijednošću $ \ mu $ i varijancom $ \ sigma ^ 2 $. Dakle, sve što trebate učiniti je prilagoditi varijablu standardnom devijacijom $ \ sigma $ (kvadratni korijen varijance) prije dodavanja srednje vrijednosti $ \ mu $.

Kako zapravo dobivate simulaciju iz normalne distribucije sa srednjom vrijednosti 0 i varijancom 1, druga je priča. Zabavno je i zanimljivo znati primijeniti takve stvari, ali bez obzira koristite li statistički paket ili programski jezik ili ne, preporučit ću vam da nabavite i koristite prikladnu funkciju ili knjižnicu za generiranje slučajnih brojeva. Ako želite savjet o tome koju biblioteku koristiti, možda ćete htjeti dodati određene informacije o tome koji programski jezik (e) koristite.

Uredi: U svjetlu komentara, nekih drugih odgovora i činjenice da je Fixee prihvatio ovaj odgovor, dat ću još pojedinosti o tome kako se mogu koristiti transformacije jednoličnih varijabli za proizvodnju normalnih varijabli.

  • Jedna metoda, koja je već spomenuta u komentaru VitalStatistix , je Box-Mullerova metoda koja uzima dvije neovisne jednolike slučajne varijable i stvara dvije neovisne normalne slučajne varijable. Sličnu metodu koja izbjegava računanje dviju transcendentalnih funkcija sin i cos nauštrb još nekoliko simulacija objavio je kao odgovor francogrex .
  • Potpuno općenita metoda je transformacija jednolike slučajne varijable funkcijom inverzne raspodjele. Ako je $ U $ jednoliko raspoređen na $ [0,1] $, tada $$ \ Phi ^ {- 1} (U) $$ ima standardnu ​​normalnu raspodjelu. Iako ne postoji eksplicitna analitička formula za $ \ Phi ^ {- 1} $, ona se može izračunati preciznim numeričkim aproksimacijama. Trenutna implementacija u R-u (posljednju provjeru) koristi ovu ideju. Metoda je konceptualno vrlo jednostavna, ali zahtijeva preciznu implementaciju $ \ Phi ^ {- 1} $, koja vjerojatno nije toliko raširena kao (ostale) transcendentalne funkcije log , sin i cos.
  • Nekoliko odgovora spominje mogućnost korištenja središnjeg graničnog teorema za približavanje normalne raspodjele kao prosjeka jednoličnih slučajnih varijabli. To se općenito ne preporučuje. Izneseni argumenti, poput podudaranja srednje vrijednosti i varijance 1, i razmatranja potpore distribuciji nisu uvjerljivi. U vježbi 2.3 u "Upoznavanju Monte Carlo metoda s R" Christiana P. Roberta i Georgea Caselle ovaj se generator naziva zastarjelim, a aproksimacija vrlo lošim .
  • Postoji zbunjujući broj drugih ideja. Poglavlje 3, a posebno odjeljak 3.4, u "Umijeću računalnog programiranja", sv. 2 Donalda E. Knutha klasična je referenca o generiranju slučajnih brojeva. Brian Ripley napisao je Računalno generiranje slučajnih varijabli: Vodič, što bi moglo biti korisno. Preporučuje se i knjiga koju su Robert i Casella spomenuli, ili možda poglavlje 2 u njihovoj drugoj knjizi "Monte Carlo statističke metode".

Na kraju, ispravno primijenjena metoda nije bolji od jednolikog generatora pseudo slučajnih brojeva koji se koristi. Osobno se više volim oslanjati na knjižnice za posebne namjene za koje smatram da su pouzdane. Gotovo se uvijek oslanjam na metode implementirane u R ili izravno u R ili putem API-ja u C / C ++. Očito je da ovo nije rješenje za sve, ali nisam dovoljno upoznat s drugim knjižnicama da bih preporučio alternative.

(+1) Good answer and advice for the OP.
I am not sure if I am making an unnecessary comment here, but, if you have only access to a uniform random number generator, then you can use the [Box-Muller Transform](http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform) to generate independent N(0,1) random numbers.In a nutshell, if U_1 and U_2 are independent draws from the Uniform(0,1) distribution then $$ \sqrt{-2 \log(U_1) } \cos(2\pi U_2)$$ and $$ \sqrt{-2 \log(U_1) }\sin(2\pi U_2)$$ are distributed as independent N(0,1) random variables. The basic idea
AilinnksgiCMT Not an unnecessary comment; a good one. The Box-Muller transform is probably the very easiest to program with minimal chance of inadvertently doing something bad. It's not the *fastest*, but it's competitive enough. That said, using an established code library is probably safer still, especially since the place where one is most likely to make a misstep is in how the *uniform random variate* inputs are generated!
@Vital: Hvala, ovo sam tražio. Ako svoj komentar želite pretvoriti u odgovor, rado bih ga podržao.
From the probability density function of normal distribution, $f(x) = e^{ \frac{-1}{2} {(\frac{x - \mu}{\sigma})}^2}$, substituting random values for x, with same $\mu$ and $\sigma$ should give you probability values drawn from the same distribution, isn't it?
@VitalStatistix, to je lijep komentar i čini se da je to ono što je OP tražio. Zašto to ne pretvoriti u odgovor i možda ga malo razraditi na općoj ideji korištenja transformacija jednoličnih slučajnih varijabli. Dvoumio sam se radeći to iz razloga što ga Cardinal spominje ponajviše zato što ne znam je li zadani generator uniforme iz * bilo kojeg * jezika dobar generator.
Dilip Sarwate
2011-10-03 21:59:55 UTC
view on stackexchange narkive permalink

Ovo je stvarno komentar na odgovor Michaela Lewa i komentar Fixeeja, ali objavljen je kao odgovor jer nemam reputaciju na ovoj stranici da komentiram.

Zbroj dvanaest neovisne slučajne varijable ravnomjerno raspoređene na $ [0, 1] $ imaju prosječno 6 $, a varijance 1 $. Drugim riječima, $$ E \ left [\ sum_ {i = 1} ^ {12} X_i \ right] = \ sum_ {i = 1} ^ {12} E [X_i] = 12 \ times \ frac {1} {2} = 6 $$ i $$ \ text {var} \ lijevo [\ sum_ {i = 1} ^ {12} X_i \ desno] = \ sum_ {i = 1} ^ {12} \ text {var} [X_i] = 12 \ times \ frac {1} {12} = 1. $$ CLT se zatim može koristiti za utvrđivanje da je raspodjela $ \ sum_ {i = 1} ^ {12} X_i - 6 $ približno standardna normalna raspodjela.U usporedbi s deset varijabli koje su razmatrali Michael Lew i Fixee, potrebna su dva dodatna poziva generatora slučajnih brojeva, ali izbjegavamo dijeljenje s $ \ sqrt {10/12} $ da bismo dobili željena varijanca jedinice. Također je vrijedno zapamtiti da $ \ sum_ {i = 1} ^ {12} X_i - 6 $ može poprimiti vrijednosti samo u rasponu $ [- 6, 6] $ i time ekstremno (vrlo nisko- vjerojatnost) vrijednosti koje se razlikuju od srednje vrijednosti za više od 6 USD standardna odstupanja neće se ponavljati. To je često problem u simulacijama računalnih i komunikacijskih sustava gdje su događaji vrlo male vjerojatnosti od velikog interesa.

francogrex
2011-10-02 14:23:36 UTC
view on stackexchange narkive permalink

Uz odgovor NRH-a, ako još uvijek nemate načina generirati slučajne uzorke iz "standardne normalne raspodjele" N (0,1), dolje je dobar i jednostavan način (budući da spominjete da ne imaju statistički paket, funkcije u nastavku trebaju biti dostupne u većini standardnih programskih jezika).

1. Generirajte u i v kao dva jednoliko raspodijeljena slučajna broja u rasponu od -1 do 1 by
u = 2 r1 - 1 i v = 2 r2 - 1

2.izračunaj w = u ^ 2 + v ^ 2 ako je w> 1 povratak na 1

3.povratak u * z i y = v * z s z = sqrt (-2ln (w) / w) Uzorak koda izgledao bi ovako:

  u = 2 * random () - 1; v = 2 * random () - 1; w = pow (u, 2) + pow (v, 2); if (w < 1) {z = sqrt ((- 2 * log (w)) / w); x = u * z; y = v * z; }  

, a zatim upotrijebite ono što je MHR predložio gore da biste dobili slučajno odstupanje od N (mu, sigma ^ 2) .

When I posted my answer above I didn't notice that AilifatbgyCMT gave you the Box-Muller Transform algorithm. The one I give above is also as good I suppose.
Could you please explain the reason for generating normal variates from uniform distribution (other than from an algorithmic perspective) and not just using the pdf of a Gaussian/Normal distribution directly? Or is it totally wrong?
AilihbhxerCMT One reason: The Marsaglia's polar method is useful when you only have a RNG that generates uniform deviates.
AilitgzxniCMT it is the easiest way. You can also generate from the pdf directly using for example the "acceptance rejection" method. I posted for you a simple [example](http://francoatgrex.tripod.com) on my [site](http://francoatgrex.tripod.com) (because not enough space in the comment box here).
Michael Lew
2011-10-03 03:32:30 UTC
view on stackexchange narkive permalink

Normalna raspodjela nastaje kad se zbroji puno slučajnih vrijednosti slične raspodjele (mislim međusobno slične). Ako zbrojite deset ili više jednoliko raspodijeljenih slučajnih vrijednosti, zbroj je gotovo gotovo normalno raspodijeljen. (Dodajte više od deset ako želite da bude još normalnije, ali deset je dovoljno za gotovo sve svrhe.)

Recite da su vaše jednolike slučajne vrijednosti jednoliko raspodijeljene između 0 i 1. Zbroj će tada biti biti između 0 i 10. Od zbroja oduzmite 5, a sredina rezultirajuće raspodjele bit će 0. Sada rezultat dijelite sa standardnim odstupanjem (gotovo) normalne raspodjele i pomnožite rezultat sa željenim standardnim odstupanjem. Nažalost, nisam siguran koja je standardna devijacija zbroja deset jednoliko slučajnih odstupanja, ali ako imamo sreće, netko će nam to reći u komentaru!

Više volim razgovarati sa studentima o normalnoj raspodjeli tim izrazima, jer korisnost pretpostavke normalne raspodjele u mnogim sustavima u potpunosti proizlazi iz svojstva da zbrojevi mnogih slučajnih utjecaja dovode do normalne raspodjele.

Ovdje koristite Centralnu granicu Thm (da se gomila slučajnih varijabli iid zbraja u normalnu slučajnu varijablu). Nisam ovo uzeo u obzir jer sam mislio da će biti presporo, ali vi kažete da je dovoljno 10 ?! Ovo je bolje od izračunavanja dnevnika i sin / cos i sqrt!
Također, srednja vrijednost uniforme r.v. na [0,1] iznosi 0,5 s varijancom 1/12. Ako zbrojite 10, dobivate srednju vrijednost 5 i varijancu 10/12 = 5/6.
S pedagoškog stajališta ova metoda omogućuje lijepu, korisnu raspravu i demonstraciju. Međutim, snažno bih obeshrabrio bilo koga da koristi ovaj pristup u praksi.
@Fixee: Morate biti sigurni i uravnotežiti izračunavanje $ \ log $, $ \ sin $, $ \ cos $ i kvadratnog korijena s generiranjem dodatnih jednoličnih slučajnih varijabli. Na primjer, Intel CPU imaju sve ove četiri funkcije kao ugrađene operacije koje se izvode u hardveru. Kvadratni korijen temeljna je "aritmetička" operacija prema IEEE 754 standardima.
@cardinal: Dobra poanta! Ali u nekim procesorima nemate ove upute (a puno je posla obaviti Taylor seriju kako bi ih izračunali), dok je Linearni kongruionalni generator vrlo jeftin / jednostavan za implementaciju. Dakle, pretpostavljam da to ovisi o vašoj postavci, kako vi kažete. :)
@Fixee: Nadam se da još uvijek nitko ne koristi LCG za jednoliko generiranje pseudo slučajnih varijabli. Također, sumnjam da se [CORDIC] (http://en.wikipedia.org/wiki/CORDIC) vjerojatnije koristi za $ \ sin $ i $ \ cos $ od Taylorovih serija u većini implementacija, iako postoji neka C biblioteka implementacije koje koriste Taylorovu seriju. Funkcija $ \ log $ možda je najveći smrad među njima, ali čini mi se da se sjećam da sam vidio i neke implementacije slične CORDIC-u. Znam da $ \ exp $ može biti izvedeno s * vrlo * racionalnim aproksimacijama niskog reda nakon odgovarajuće deflacije ulaza.
Prema mom iskustvu, @cardinal: je više nego dovoljno brz za opću upotrebu. Zašto obeshrabriti njegovu upotrebu ako daje željenu distribuciju, lako je razumjeti i dovoljno je brza? Nije me briga koliko jako radi moj mikroprocesor ...
@Michael: Proglašavanje da daje "ispravnu" distribuciju pomalo se proteže, pogotovo jer aproksimacijska distribucija ima kompaktnu podršku i, u mnogim aplikacijama, * brine * o tome koliko učinkovito varijable mogu biti generirane. :) Poanta je u tome što postoji nekoliko * puno * boljih opcija. Ali, ipak mislim da pedagoški pruža nešto korisno.
Slažem se s kardinalovim upozorenjima, ali korisna poveznica koja nadopunjuje ovaj odgovor je [Irwin-Hall distribucija] (https://en.wikipedia.org/wiki/Irwin%E2%80%93Hall_distribution) na Wikipediji (zbroj jednoličnih slučajnih varijabli).


Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 3.0 licenci pod kojom se distribuira.
Loading...