Mensimulasikan undian dari Distribusi Seragam menggunakan undian dari Distribusi Normal

15

Saya baru-baru ini membeli sumber data wawancara sains di mana salah satu pertanyaan probabilitas adalah sebagai berikut:

Diberikan draw dari distribusi normal dengan parameter yang diketahui, bagaimana Anda bisa mensimulasikan draw dari distribusi yang seragam?

Proses pemikiran asli saya adalah bahwa, untuk variabel acak diskrit, kita dapat memecah distribusi normal menjadi sub-sub K yang unik di mana setiap subbagian memiliki area yang sama di bawah kurva normal. Kemudian kita bisa menentukan nilai K mana yang diambil oleh variabel dengan mengenali area kurva normal yang variabelnya jatuh.

Tapi ini hanya akan bekerja untuk variabel acak diskrit. Saya melakukan penelitian tentang bagaimana kita dapat melakukan hal yang sama untuk variabel acak kontinu, tetapi sayangnya saya hanya bisa menemukan teknik seperti inverse transform sampling yang akan digunakan sebagai input variabel acak seragam, dan dapat menampilkan variabel acak dari beberapa distribusi lainnya. Saya berpikir bahwa mungkin kita bisa melakukan proses ini secara terbalik untuk mendapatkan variabel acak yang seragam?

Saya juga berpikir tentang kemungkinan menggunakan variabel acak Normal sebagai input ke generator kongruensi linear, tapi saya tidak yakin apakah ini akan berhasil.

Adakah pemikiran tentang bagaimana saya dapat mendekati pertanyaan ini?

wellington
sumber

Jawaban:

30

Dalam semangat menggunakan perhitungan aljabar sederhana yang tidak terkait dengan perhitungan distribusi Normal , saya akan condong ke arah berikut. Mereka dipesan seperti yang saya pikirkan (dan karena itu diperlukan untuk menjadi lebih dan lebih kreatif), tetapi saya telah menyimpan yang terbaik - dan yang paling mengejutkan - untuk bertahan lama.

  1. Membalikkan teknik Box-Mueller : dari setiap pasangan normals , dua seragam independen dapat dibangun sebagai atan2 ( Y , X ) (pada interval [ - π , π ] ) dan exp ( - ( X 2(X,Y)atan2(Y,X)[π,π] (pada interval [ 0 , 1 ] ).exp((X2+Y2)/2)[0,1]

  2. Ambil normals dalam kelompok dua dan jumlah kuadrat mereka untuk mendapatkan urutan varian Yχ22 . Ekspresi yangdiperoleh dari pasanganY1,Y2,,Yi,

    Xi=Y2iY2i1+Y2i

    akan memiliki distribusi , yang seragam.Beta(1,1)

    Bahwa ini hanya membutuhkan dasar, aritmatika sederhana harus jelas.

  3. Karena distribusi yang tepat dari koefisien korelasi Pearson dari sampel empat pasang dari standar bivariat, distribusi normal terdistribusi secara seragam pada , kita dapat dengan mudah mengambil normals dalam kelompok empat pasang (yaitu, delapan nilai dalam setiap set) dan kembalikan koefisien korelasi pasangan ini. (Ini melibatkan aritmatika sederhana ditambah dua operasi root kuadrat.)[1,1]

  4. Telah diketahui sejak zaman kuno bahwa proyeksi silindris bola (permukaan dalam tiga ruang) adalah luas yang sama . Ini menyiratkan bahwa dalam proyeksi distribusi seragam pada bola, baik koordinat horizontal (sesuai dengan bujur) maupun koordinat vertikal (sesuai dengan lintang) akan memiliki distribusi seragam. Karena standar distribusi trivariat Normal adalah simetris bola, proyeksi ke bola adalah seragam. Memperoleh garis bujur pada dasarnya adalah perhitungan yang sama dengan sudut dalam metode Box-Mueller ( qv ), tetapi garis lintang yang diproyeksikan adalah baru. Proyeksi ke bola hanya menormalkan tiga koordinat dan pada titik itu z adalah garis lintang yang diproyeksikan. Jadi, ambil varian Normal dalam kelompok tiga, X 3 i - 2 , X 3 i -(x,y,z)z , dan hitungX3i2,X3i1,X3i

    X3iX3i22+X3i12+X3i2

    untuk .saya=1,2,3,...

  5. Karena sebagian besar sistem komputasi mewakili angka dalam biner , generasi angka seragam biasanya dimulai dengan memproduksi bilangan bulat terdistribusi secara merata antara dan 2 32 - 1 untuk jumlah bit dan H untuk tanda (yaitu, H ( x ) = 1 ketika x > 0 dan H ( x ) = 0 sebaliknya) kita dapat mengekspresikan nilai seragam yang dinormalisasi dalam [0232-1 (atau daya tinggi terkait dengan panjang kata komputer) dan mengubah ukurannya sesuai kebutuhan. Bilangan bulat tersebut direpresentasikan secara internal sebagai string 32 digit biner. Kita dapat memperoleh bit acak independen dengan membandingkan variabel Normal dengan mediannya. Dengan demikian, cukup untuk memecah variabel Normal menjadi kelompok-kelompok ukuran yang sama dengan jumlah bit yang diinginkan, membandingkan masing-masing bit dengan rata-rata, dan merakit urutan hasil true / false yang dihasilkan menjadi angka biner. Menulis k232kHH(x)=1x>0H(x)=0 dengan rumus[0,1)

    j=0k1H(Xkij)2j1.

    Variasi dapat ditarik dariXn setiap distribusi kontinu yang rata-rata adalah (seperti normal standar); mereka diproses dalam kelompok k dengan masing-masing kelompok menghasilkan satu nilai seragam semu.0k

  6. Pengambilan sampel penolakan adalah cara standar, fleksibel, kuat untuk menggambar variasi acak dari distribusi sewenang-wenang. Misalkan target distribusi memiliki PDF . Nilai Y diambil menurut distribusi lain dengan PDF g . Pada langkah penolakan, nilai seragam U yang terletak antara 0 dan g ( Y ) diambil secara independen dari Y dan dibandingkan denganfYgU0g(Y)Y : jika lebih kecil, Yf(Y)Ydipertahankan tetapi sebaliknya proses ini diulang. Pendekatan ini tampaknya melingkar: bagaimana kita menghasilkan varian seragam dengan proses yang membutuhkan variate seragam untuk memulainya?

    Jawabannya adalah kita tidak benar-benar membutuhkan variasi yang seragam untuk melakukan langkah penolakan. Sebagai gantinya (dengan asumsi ) kita dapat membalik koin yang adil untuk mendapatkan 0 atau 1 secara acak. Ini akan ditafsirkan sebagai bit pertama dalam representasi biner dari variate seragam U dalam interval [ 0 , 1 ) . Ketika hasilnya adalah 0 , yang berarti 0 U < 1 / 2 ; jika tidak, 1 / 2 U < 1 . g(Y)001U[0,1)00U<1/21/2U<1 Separuh dari waktu, ini cukup untuk memutuskan langkah penolakan: jika tapi koin adalah 0 , Y harus diterima; jika f ( Y ) / g ( Y ) < 1 / 2 tapi koin adalah 1 , Y harus ditolak; jika tidak, kita perlu membalik koin lagi untuk mendapatkan bit U berikutnya . Karena - berapapun nilainya f ( Yf(Y)/g(Y)1/20Yf(Y)/g(Y)<1/21YU memiliki - ada 1 / 2 kesempatan untuk menghentikan setelah setiap lain, jumlah yang diharapkan dari membalik hanya 1 / 2 ( 1 ) + 1 / 4 ( 2 ) + 1 / 8 ( 3 ) + + 2 - n ( n ) + = 2 .f(Y)/g(Y)1/21/2(1)+1/4(2)+1/8(3)++2n(n)+=2

    Sampling penolakan bisa bermanfaat (dan efisien) asalkan jumlah penolakan yang diharapkan kecil. Kita dapat mencapai ini dengan mencocokkan persegi panjang terbesar yang mungkin (mewakili distribusi seragam) di bawah PDF Normal.

    Normal and Uniform PDFs

    Menggunakan Kalkulus untuk mengoptimalkan daerah persegi panjang, Anda akan menemukan bahwa titik ujungnya harus berada di , di mana ketinggiannya sama dengan exp ( - 1 / 2 ) / ±1, menjadikan luasnya sedikit lebih besar dari0,48. Dengan menggunakan kerapatan Normal standar ini sebagaigdan menolak semua nilai di luar interval[-1,1]secara otomatis, dan jika tidak menerapkan prosedur penolakan, kita akan mendapatkan variasi seragam dalam[-1,1] secaraefisien:exp(1/2)/2π0.2419710.48g[1,1][1,1]

    • Dalam fraksi saat itu, varian Normal berada di luar [ - 1 , 1 ]2Φ(1)0.317[1,1] dan langsung ditolak. ( adalah CDF Normal standar.)Φ

    • Dalam sisa fraksi waktu, prosedur penolakan biner harus diikuti, membutuhkan dua varian Normal rata-rata.

    • Prosedur keseluruhan membutuhkan rata-rata langkah.1/(2exp(1/2)/2π)2.07

    The expected number of Normal variates needed to produce each uniform result works out to

    2eπ(12Φ(1))2.82137.

    Although that is pretty efficient, note that (1) computation of the Normal PDF requires computing an exponential and (2) the value Φ(1) must be precomputed once and for all. It's still a little less calculation than the Box-Mueller method (q.v.).

  7. The order statistics of a uniform distribution have exponential gaps. Since the sum of squares of two Normals (of zero mean) is exponential, we may generate a realization of n independent uniforms by summing the squares of pairs of such Normals, computing the cumulative sum of these, rescaling the results to fall in the interval [0,1], and dropping the last one (which will always equal 1). This is a pleasing approach because it requires only squaring, summing, and (at the end) a single division.

    The n values will automatically be in ascending order. If such a sorting is desired, this method is computationally superior to all the others insofar as it avoids the O(nlog(n)) cost of a sort. If a sequence of independent uniforms is needed, however, then sorting these n values randomly will do the trick. Since (as seen in the Box-Mueller method, q.v.) the ratios of each pair of Normals are independent of the sum of squares of each pair, we already have the means to obtain that random permutation: order the cumulative sums by the corresponding ratios. (If n is very large, this process could be carried out in smaller groups of k with little loss of efficiency, since each group needs only 2(k+1)kkO(nlog(k))O(n)2n(1+1/k)n uniform values.)

  8. [0,1] (by taking only the fractional parts of the values), we thereby obtain a distribution that is uniform for all practical purposes. This is extremely efficient, requiring one of the simplest arithmetic operations of all: simply round each Normal variate down to the nearest integer and retain the excess. The simplicity of this approach becomes compelling when we examine a practical R implementation:

    rnorm(n, sd=10) %% 1
    

    reliably produces n uniform values in the range [0,1] at the cost of just n Normal variates and almost no computation.

    (Even when the standard deviation is 1, the PDF of this approximation varies from a uniform PDF, as shown in the following figure, by less than one part in 108! To detect it reliably would require a sample of 1016 values--that's already beyond the capability of any standard test of randomness. With a larger standard deviation the non-uniformity is so small it cannot even be calculated. For instance, with an SD of 10 as shown in the code, the maximum deviation from a uniform PDF is only 10857.)

    Approximate PDF


In every case Normal variables "with known parameters" can easily be recentered and rescaled into the Standard Normals assumed above. Afterwards, the resulting uniformly distributed values can be recentered and rescaled to cover any desired interval. These require only basic arithmetic operations.

The ease of these constructions is evidenced by the following R code, which uses only one or two lines for most of them. Their correctness is witnessed by the resulting near-uniform histograms based on 100,000 independent values in each case (requiring around 12 seconds for all seven simulations). For reference--in case you are worried about the amount of variation appearing in any of these plots--a histogram of uniform values simulated with R's uniform random number generator is included at the end.

Histograms

All these simulations were tested for uniformity using a χ2 test based on 1000 bins; none could be considered significantly non-uniform (the lowest p-value was 3%--for the results generated by R's actual uniform number generator!).

set.seed(17)
n <- 1e5
y <- matrix(rnorm(floor(n/2)*2), nrow=2)
x <- c(atan2(y[2,], y[1,])/(2*pi) + 1/2, exp(-(y[1,]^2+y[2,]^2)/2))
hist(x, main="Box-Mueller")

y <- apply(array(rnorm(4*n), c(2,2,n)), c(3,2), function(z) sum(z^2))
x <- y[,2] / (y[,1]+y[,2])
hist(x, main="Beta")

x <- apply(array(rnorm(8*n), c(4,2,n)), 3, function(y) cor(y[,1], y[,2]))
hist(x, main="Correlation")

n.bits <- 32; x <-  (2^-(1:n.bits)) %*% matrix(rnorm(n*n.bits) > 0, n.bits)
hist(x, main="Binary")

y <- matrix(rnorm(n*3), 3)
x <- y[1, ] / sqrt(apply(y, 2, function(x) sum(x^2)))
hist(x, main="Equal area")

accept <- function(p) { # Using random normals, return TRUE with chance `p`
  p.bit <- x <- 0
  while(p.bit == x) {
    p.bit <- p >= 1/2
    x <- rnorm(1) >= 0
    p <- (2*p) %% 1
  }
  return(x == 0)
}
y <- rnorm(ceiling(n * sqrt(exp(1)*pi/2))) # This aims to produce `n` uniforms
y <- y[abs(y) < 1]
x <- y[sapply(y, function(x) accept(exp((x^2-1)/2)))]
hist(x, main="Rejection")

y <- matrix(rnorm(2*(n+1))^2, 2)
x <- cumsum(y)[seq(2, 2*(n+1), 2)]
x <- x[-(n+1)] / x[n+1]
x <- x[order(y[2,-(n+1)]/y[1,-(n+1)])] 
hist(x, main="Ordered")

x <- rnorm(n) %% 1 # (Use SD of 5 or greater in practice)
hist(x, main="Modular")

x <- runif(n)      # Reference distribution
hist(x, main="Uniform")
whuber
sumber
2
(+1) If I were asking this question in an interview, I'd modify it to ask about the case where the parameters are fixed, but unknown, which strikes me as more interesting. The Pearson correlation approach (#3) goes through unchanged, but is perhaps slightly esoteric. The Beta approach (#2) requires only slight modification by considering the squares of differences of disjoint pairs. Similarly, Z=(X1X2)/(X3X4) is standard Cauchy (regardless of the mean and variance of X), which has a nice cdf.
cardinal
1
More generally, the principle is to find a pivotal quantity from the sample with a computationally amenable cdf. This ties in nicely with constructing confidence intervals and hypothesis tests, with the twist that we might seek to optimize the number of elements used rather than the latter cases which focus more on maximizing the information from a fixed sample size.
cardinal
@Cardinal Thank you for the interesting comments, as well as the ninth method (Cauchy). Even finding a pivotal quantity is unnecessary when only a good approximation is sought. For instance, (8) works perfectly well if you reserve a small number of initial results to establish a rough scale.
whuber
8

You can use a trick very similar to what you mention. Let's say that XN(μ,σ2) is a normal random variable with known parameters. Then we know its distribution function, Φμ,σ2, and Φμ,σ2(X) will be uniformly distributed on (0,1). To prove this, note that for d(0,1) we see that

P(Φμ,σ2(X)d)=P(XΦμ,σ21(d))=d.

The above probability is clearly zero for non-positive d and 1 for d1. This is enough to show that Φμ,σ2(X) has a uniform distribution on (0,1) as we have shown that the corresponding measures are equal for a generator of the Borel σ-algebra on R. Thus, you can just tranform the normally distributed data by the distribution function and you'll get uniformly distributed data.

swmo
sumber
4
It's the inverse of inverse transform sampling!
Roger Fan
Could you possibly elaborate on the second sentence of your second paragraph? I am having trouble understanding the following: "This is enough to show that Φμ,σ2(X) has a uniform distribution on (0,1) as we have shown that the corresponding measures are equal for a generator of the Borel σ-algebra on ℝ."
wellington
To show that some real random variable, X, has a uniform distribution, we should show that its corresponding measure, X(P) equals that of the uniform distribution for all measurable sets of the real line. However, it's actually enough to consider some generator of the σ-algebra, due to a uniqueness of measures-theorem. If they are equal on sets of the generator, they'll be equal for all measurable sets. This is just a measure-theoretic attachment to the answer.
swmo