Özel bir dağıtımdan rastgele örnekler oluşturma


16

R kullanarak özel bir pdf rastgele örnekleri oluşturmaya çalışıyorum. Benim pdf:

fX(x)=32(1-x2),0x1

Tek tip örnekler ürettim ve sonra özel dağıtımıma dönüştürmeye çalıştım. Bunu dağıtımımın ( ) bularak ve tek biçimli örneğe ( ) ayarlayıp x için çözerek yaptım .FX(x)ux

FX(x)=Pr[Xx]=0x32(1y2)dy=32(xx33)

Yukarıdaki dağılımına sahip rasgele örnek oluşturmak için, muntazam bir örnek almak u[0,1] ve çözmek x de

32(x-x33)=u

Uyguladım Rve beklenen dağılımı alamıyorum. Anlayışımdaki kusura işaret eden var mı?

nsamples <- 1000;
x <- runif(nsamples);

f <- function(x, u) { 
  return(3/2*(x-x^3/3) - u);
}

z <- c();
for (i in 1:nsamples) {
  # find the root within (0,1) 
  r <- uniroot(f, c(0,1), tol = 0.0001, u = x[i])$root;
  z <- c(z, r);
}

1
Bir kodlama hatası olmalı. R kullanmıyorum, bu yüzden hatanın tam olarak ne olduğunu söyleyemem - ama sadece çözümünüzü kodladım (her zaman 0 ve 1 arasında bulunan kübik polinomun orta kökünü almaya dikkat ederek) ve Örnekler ve beklenen dağılım arasında iyi bir anlaşma sağladım. Kök bulucunuzla ilgili bir sorun olabilir mi? Aldığınız örneklerle ilgili sorun nedir?
jpillow

(Bu arada çok verimli değil) kodunuzu denedim ve beklenen dağıtım olsun.
Aniko

@jpillow ve @Aniko Benim hatam. Kullandığımda nsamples <- 1e6iyi bir eşleşti.
Anand

2
@Anand bir yolu, gözlemlemektir arasında, izin doğrudan hesap açısından . x ux=2günah(arcsin(u)/3)xu
whuber

Yanıtlar:


11

Kodunuzun çalıştığını anladınız gibi görünüyor, ancak @Aniko, verimliliğini artırabileceğinizi belirtti. En büyük hız kazancınız muhtemelen zbir döngü içinde büyümemeniz için hafızayı önceden ayırmaktan gelir . z <- rep(NA, nsamples)Hile yapmak gibi bir şey olmalı. vapply()Açık bir döngü yerine (döndürülen değişken türünü belirtir) kullanarak küçük bir hız kazancı elde edebilirsiniz ( uygulama ailesinde büyük bir SO sorusu vardır ).

> nsamples <- 1E5
> x <- runif(nsamples)
> f <- function(x, u) 1.5 * (x - (x^3) / 3) - u
> z <- c()
> 
> # original version
> system.time({
+ for (i in 1:nsamples) {
+   # find the root within (0,1) 
+   r <- uniroot(f, c(0,1), tol = 0.0001, u = x[i])$root
+   z <- c(z, r)
+ }
+ })
   user  system elapsed 
  49.88    0.00   50.54 
> 
> # original version with pre-allocation
> z.pre <- rep(NA, nsamples)
> system.time({
+ for (i in 1:nsamples) {
+   # find the root within (0,1) 
+   z.pre[i] <- uniroot(f, c(0,1), tol = 0.0001, u = x[i])$root
+   }
+ })
   user  system elapsed 
   7.55    0.01    7.78 
> 
> 
> 
> # my version with sapply
> my.uniroot <- function(x) uniroot(f, c(0, 1), tol = 0.0001, u = x)$root
> system.time({
+   r <- vapply(x, my.uniroot, numeric(1))
+ })
   user  system elapsed 
   6.61    0.02    6.74 
> 
> # same results
> head(z)
[1] 0.7803198 0.2860108 0.5153724 0.2479611 0.3451658 0.4682738
> head(z.pre)
[1] 0.7803198 0.2860108 0.5153724 0.2479611 0.3451658 0.4682738
> head(r)
[1] 0.7803198 0.2860108 0.5153724 0.2479611 0.3451658 0.4682738

Ve ;her satırın sonunda (MATLAB dönüşümü mü yapıyorsunuz?)


Ayrıntılı cevabınız ve işaret ettiğiniz için teşekkürler vapply. Çok uzun zamandır kodlama yapıyorum C/C++ve bu ;üzüntü sebebi !
Anand

1
+1 unirootDoğrudan bir çözümle değiştirmek , işleri üç kat daha fazla hızlandırır gibi görünüyor : Saniyede yaklaşık elde etmekte sorun yaşamamalısınız . 107
whuber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.