Monte Carlo Simülasyonu kullanarak yaklaşık


35

Son zamanlarda Monte Carlo simülasyonuna baktım ve onu ( yaklaşık bir dikdörtgen, orantılı alan içinde) gibi sabitleri yaklaşık olarak belirlemek için kullanıyorum .π

Bununla birlikte, Monte Carlo entegrasyonunu kullanarak [Euler sayısı] değerine yaklaşmak için uygun bir yöntem düşünemiyorum .e

Bunun nasıl yapılabileceği hakkında herhangi bir işaret var mı?


7
Bunu yapmanın çok, çok, çok yolu var. Bunun, Rkomutun ne yaptığını düşünerek açıkça ortaya çıkması muhtemeldir 2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1))). (Eğer logma Gamma işlevini kullanmak sizi rahatsız ediyorsa, yerine 2 + mean(1/factorial(ceiling(1/runif(1e5))-2))sadece toplama, çarpma, bölme ve kesme kullanan ve taşma uyarılarını dikkate almayan şekilde değiştirin.) En çok ilgi çeken şey ne olabilir ki verimli simülasyonlar: Herhangi bir kesinliği tahmin etmek için gerekli işlem basamakları ? e
whuber

4
Ne hoş bir soru! Başkalarının cevaplarını okumak için sabırsızlanıyorum. Bu soruya gerçekten dikkat çekmenin bir yolu - belki de yarım düzine başka bir cevap - soruyu gözden geçirip whuber'in önerdiği gibi etkili cevaplar almak olacaktır. CV kullanıcıları için catnip gibidir.
Monica

1
@EngrStudent Geometrik analoğun için var olduğundan emin değilim . Bu sadece gibi doğal (pun amaçlanan) bir geometrik miktar değildir . πeπ
Aksakal

6
@Aksakal bir bir derece geometrik miktar. En temel düzeyde, doğal olarak hiperbollerle ilgili alanlar için ifadelerde görünür. Biraz daha ileri bir seviyede, geometrik içeriği açık olan trigonometrik fonksiyonlar dahil olmak üzere tüm periyodik fonksiyonlarla yakından bağlantılıdır. Buradaki asıl zorluk , ile ilgili değerleri simüle etmenin çok kolay olmasıdır ! eee
whuber

2
@StatsStudent: kendi başına ilginç değil. Ancak, bu, gibi miktarların yansız tahmin edicilerine yol açarsa, bu MCMC algoritmaları için en yararlı olabilir. exp { x 0 f ( y ) d G ( y ) }e
exp{0xf(y)dG(y)}
Xi'an,

Yanıtlar:


34

Tahmin etmek basit ve zarif bir yolu Monte Carlo tarafından açıklanan bu yazıda . Bildiri aslında . Bu nedenle, yaklaşım hedefinize tam olarak uyuyor. Bu fikir, popüler bir Rus ders kitabından Gnedenko'nun olasılık teorisi konusundaki alıştırmasına dayanıyor. Bkz. S.283eee

Öyle olur ki, , aşağıdaki gibi tanımlanmış rastgele bir değişkendir. Asgari sayısıdır, öyle ki ve 'deki tekdüze dağılımdaki rasgele sayılardır . Güzel değil mi?ξ n n i = 1 r i > 1 r i [ 0 , 1 ]E[ξ]=eξni=1nri>1ri[0,1]

Bir alıştırma olduğundan, çözümü (kanıtı) buraya göndermenin benim için iyi olup olmadığından emin değilim :) Bunu kendin kanıtlamak istiyorsan, işte bir ipucu: bu bölüm, "Anlar" olarak adlandırılmalıdır; doğru yönde.

Kendin uygulamak istiyorsan, daha fazla okuma!

Bu, Monte Carlo simülasyonu için basit bir algoritmadır. Tekdüze bir rasgele çizin, ardından toplam 1'i geçinceye kadar bir başkasını çizin. Çizilen rastgele sayı ilk denemenizdir. Diyelim ki anladım:

 0.0180
 0.4596
 0.7920

Sonra ilk denemeniz gerçekleşti 3. Bu denemeleri yapmaya devam edin ve ortalama olarak aldığınızı fark edeceksiniz .e

MATLAB kodu, simülasyon sonucu ve histogram izler.

N = 10000000;
n = N;
s = 0;
i = 0;
maxl = 0;
f = 0;
while n > 0
    s = s + rand;
    i = i + 1;
    if s > 1
        if i > maxl
            f(i) = 1;
            maxl = i;
        else
            f(i) = f(i) + 1;
        end
        i = 0;
        s = 0;
        n = n - 1;
    end
end

disp ((1:maxl)*f'/sum(f))
bar(f/sum(f))
grid on

f/sum(f)

Sonuç ve histogram:

2.7183


ans =

  Columns 1 through 8

         0    0.5000    0.3332    0.1250    0.0334    0.0070    0.0012    0.0002

  Columns 9 through 11

    0.0000    0.0000    0.0000

görüntü tanımını buraya girin

GÜNCELLEME: Deneme sonuçları dizisinden kurtulmak için RAM'imi almayan kodumu güncelledim. Ayrıca PMF tahminini yazdırdım.

Güncelleme 2: İşte benim Excel çözümüm. Excel'de bir düğme koyun ve aşağıdaki VBA makrosuna bağlayın:

Private Sub CommandButton1_Click()
n = Cells(1, 4).Value
Range("A:B").Value = ""
n = n
s = 0
i = 0
maxl = 0
Cells(1, 2).Value = "Frequency"
Cells(1, 1).Value = "n"
Cells(1, 3).Value = "# of trials"
Cells(2, 3).Value = "simulated e"
While n > 0
    s = s + Rnd()
    i = i + 1
    If s > 1 Then
        If i > maxl Then
            Cells(i, 1).Value = i
            Cells(i, 2).Value = 1
            maxl = i
        Else
            Cells(i, 1).Value = i
            Cells(i, 2).Value = Cells(i, 2).Value + 1
        End If
        i = 0
        s = 0
        n = n - 1
    End If
Wend


s = 0
For i = 2 To maxl
    s = s + Cells(i, 1) * Cells(i, 2)
Next


Cells(2, 4).Value = s / Cells(1, 4).Value

Rem bar (f / Sum(f))
Rem grid on

Rem f/sum(f)

End Sub

D1 hücresine 1000 gibi deneme sayısını girin ve düğmesine tıklayın. İlk ekrandan sonra ekranın nasıl görünmesi gerektiği:

görüntü tanımını buraya girin

GÜNCELLEME 3: Silverfish benden başka bir şekilde ilham verdi, ilki kadar zarif değil ama yine de havalı. Sobol dizileri kullanılarak n-simplekslerin hacimlerini hesapladı .

s = 2;
for i=2:10
    p=sobolset(i);
    N = 10000;
    X=net(p,N)';
    s = s + (sum(sum(X)<1)/N);
end
disp(s)

2.712800000000001

Tesadüf eseri ilk kitabı , lisede okuduğum Monte Carlo yöntemi üzerine yazdı . Bana göre bu yönteme en iyi giriş.

GÜNCELLEME 4:

Yorumdaki Silverfish basit bir Excel formül uygulaması önerdi. Yaklaşık 1 milyon rasgele sayı ve 185K denemesinden sonra yaklaşımında elde ettiğiniz sonuç budur:

görüntü tanımını buraya girin

Açıkçası, bu Excel VBA uygulamasından çok daha yavaştır. Özellikle, VBA kodumu döngü içindeki hücre değerlerini güncellemeyecek şekilde değiştirirseniz ve sadece tüm istatistikler toplandıktan sonra yapın.

GÜNCELLEME 5

Xi'an'ın 3 numaralı çözümü yakından ilişkilidir (veya jwg'nin konu hakkındaki yorumuna göre bir anlamda aynı). İlk Forsythe veya Gnedenko fikriyle kimin ortaya çıktığını söylemek zor. Gnedenko'nun 1950'deki Rusça orijinal baskısında Bölümler'de Sorunlar bölümleri yoktur. Dolayısıyla, bu sorunu daha sonraki basımlarda nerede olduğunu ilk bakışta bulamadım. Belki daha sonra eklenmiş veya metne gömülmüştür.

Xi'an'ın cevabında yorum yaptığım gibi, Forsythe'in yaklaşımı başka ilginç bir alanla bağlantılı: rastgele (IID) dizilerde tepe noktaları arasındaki mesafelerin dağılımı (extrema). Ortalama mesafe 3 olur. Forsythe'in yaklaşımındaki aşağı sekans bir dip ile sona erer, bu nedenle örneklemeye devam ederseniz bir noktada başka bir dip elde edersiniz, sonra başka bir şey vb.


Vay, bu harika! Bunun neden işe yaradığını açıklayan bir veya iki paragraf ekleyebilir misiniz?
Monica

7
(+1) Harika! Cevap, sadece tek tip simülasyonlara dayandığından en yüksek işareti hakediyor. Ve herhangi bir yaklaşım kullanmaz, ancak Monte Carlo'dan kaynaklanır. Gnedenko'ya tekrar bağlanması bir başka başarıdır.
Xi'an,

2
Güzel! İşte bir matematiğin aynısı olarak Mathematica kodu:
Mean[Table[ Length[NestWhileList[(Random[]+#) &, Random[], #<1&]], {10^6}]]
wolfies

4
@wolfies Xi'an'ın cevabına Rgönderdiğim çözümün şu doğrudan çevirisi yirmi kat daha hızlı:n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
whuber

1
Ben "ortalama neden ?" kendi başına bir soru olarak soru ; Taslak çözümümün (sorunun “bariz şekilde” görselleştirilmesi olarak hemen akla gelen şey) mutlaka Rus öğrencilerinin yapması gereken şekilde olmadığından şüpheleniyorum! Bu yüzden alternatif çözümler çok iyi karşılanacaktır. e
Silverfish 18

19

Aksakal'ın cevabını yükseltmeyi öneriyorum. Tarafsızdır ve sadece ünite düzgün sapma üretme yöntemine dayanır.

Cevabım keyfi olarak kesinleştirilebilir, ancak yine de gerçek değerinden uzak tutulur .e

Xi'an'ın cevabı doğru, ancak ben de onun bağımlılığı düşünüyorum amaçlı yaklaşık olduğunda fonksiyonun veya Poisson rasgele sapma doğurmanın bir yolu biraz dairesel olduğu .eloge

Bootstrapping tarafından tahminie

Bunun yerine, ön yükleme prosedürünü göz önünde bulundurun. Bir nesne büyük bir sayı olan bir örnek boyutu değiştirme ile çizilir . Her bir çekme oranında, olasılığı olmayan belirli bir nesneyi çizim olan ve orada gibi çizer. Belirli bir nesnenin tüm çizimlerden çıkarılma olasılığın- i 1 - n - 1 , n p = ( 1 - 1nni1n1np=(11n)n.

Çünkü şunu biliyoruz ki,

exp(1)=limn(11n)n

bu yüzden

exp(1)p^=i=1mIiBjm

Yani, tahmin edilmesi, spesifik bir gözlemin bootstrap kopyalarından çıkarılma olasılığını tahmin ederek, bu tür pek çok kopya arasında çoğaltmasından (yani, nesnelerin önyükleme parçalarındaki oluşumlarının oranı) tahmin ederek elde edilir .m B j ipmBji

Bu yaklaşımda iki hata kaynağı vardır. Sonlu her zaman sonuçların yaklaşık olduğu, yani tahminin yanlı olduğu anlamına gelir. Ek olarak, gerçek değer etrafında dalgalanacaktır, çünkü bu bir simülasyon.pnp^

Lisans veya yeterince küçük yapmak ile başka bir kişi yaklaşır çünkü ben biraz sevimli bu yaklaşımı bulmak bir kişinin tahmin olabilir aynı damarda, bir deste kart, küçük taşların bir yığın ya da el altında başka öğeler kullanarak bir pusula, düz bir kenar ve bazı kum taneleri kullanarak. Matematiğin, bilgisayar gibi modern kolaylıklardan ayrılabileceği zamanlar bence temiz.πeπ

Sonuçlar

Çeşitli önyükleme kopyalarının çoğaltılması için çeşitli simülasyonlar yaptım. Standart hatalar normal aralıklar kullanılarak tahmin edilir.

önyüklenmekte olan nesne sayısının seçiminin sonuçların kesinliği üzerinde mutlak bir üst sınır belirlediğine dikkat edin, çünkü Monte Carlo prosedürü ve sadece bağlı olduğunu tahmin ediyor . Ayar sadece bir "kaba" tahminini ihtiyaç ya çünkü sadece bilgisayarınızı encumber olacak gereksiz yere büyük olması veya önyargı nedeniyle Monte Carlo varyans tarafından gömülmek olacak çünkü. Bu sonuçlar ve , üçüncü ondalık basamağa kadar doğrudur.p p n n n e n = 10 3 p - 1enppnnen=103p1e

Bu çizim, seçiminin de stabilite için doğrudan ve derin sonuçlara sahip olduğunu göstermektedir . Mavi kesikli çizgi Şekil ve kırmızı çizgi göstermektedir . Beklendiği gibi, örneklem büyüklüğünün arttırılması daha doğru tahminler üretir . p s e smp^pep^görüntü tanımını buraya girin

Bunun için utanç verici derecede uzun bir R senaryosu yazdım. İyileştirme önerileri 20 dolarlık bir banknotun arkasına gönderilebilir.

library(boot)
library(plotrix)
n <- 1e3

## if p_hat is estimated with 0 variance (in the limit of infinite bootstraps), then the best estimate we can come up with is biased by exactly this much:
approx <- 1/((1-1/n)^n)

dat <- c("A", rep("B", n-1))
indicator <- function(x, ndx)   xor("A"%in%x[ndx], TRUE) ## Because we want to count when "A" is *not* in the bootstrap sample

p_hat <- function(dat, m=1e3){
    foo <- boot(data=dat, statistic=indicator, R=m) 
    1/mean(foo$t)
} 

reps <- replicate(100, p_hat(dat))

boxplot(reps)
abline(h=exp(1),col="red")

p_mean <- NULL
p_var <- NULL
for(i in 1:10){
    reps <- replicate(2^i, p_hat(dat))
    p_mean[i] <- mean(reps)
    p_var[i] <- sd(reps)
}
plotCI(2^(1:10), p_mean, uiw=qnorm(0.975)*p_var/sqrt(2^(1:10)),xlab="m", log="x", ylab=expression(hat(p)), main=expression(paste("Monte Carlo Estimates of ", tilde(e))))
abline(h=approx, col='red')

4
+1 Çok mantıklı. Yazdıysanız kodunuzu paylaşma şansınız var mı?
Antoni Parellada

2
Bu keyfi olarak doğru olsa da, sonuçta tatmin edici değil çünkü değil, sadece bir yaklaşımı simüle ediyor . ee
whuber

1
Emin. Sadece bir çoğunun diğerinin içindeki yinelenen bir aramayla bitmesi gerekiyordu, ki aslında şu ankiyle aynı.
Monica

1
@whuber Ben keyfi olarak doğru bir yaklaşım doğru bir yaklaşım yaklaşımı ve kendisinin bir keyfi doğru bir yaklaşım yaklaşımı arasındaki farkı gerçekten görmüyorum . ee
jwg

1
jwg Kavramsal olarak önemli olmasının yanı sıra pratik olarak da önemlidir, çünkü yaklaşık bir yaklaşıma bir yaklaşım uygulamak her iki yaklaşımın ne kadar doğru olduğunu takip etmeyi gerektirir. Ancak, her iki yaklaşım da kabul edilebilir derecede iyi olduğunda, genel yaklaşımın gerçekten iyi olduğu konusunda hemfikir olmalıyım.
whuber

14

1. Çözüm:

Poisson için dağılımı, Bu nedenle, eğer , , yani Poisson simülasyonu ile. Poisson simülasyonları üstel bir dağıtım üreticisinden türetilebilir (en verimli şekilde değilse).P(λ)

P(X=k)=λkk!eλ
XP(1)
P(X=0)=P(X=1)=e1
e1

Not 1: Yorumlarda tartışıldığı gibi, bir Poisson dağılımından veya eşdeğerde bir Üstel dağılımın simülasyonu bir log veya bir exp fonksiyonu içermeden hayal etmek zor olacağından, bu oldukça karmaşık bir argümandır ... Ama sonra W. Huber geldi. Bu cevabın kurtarılması, siparişe göre formalara dayalı en zarif bir çözüm. Ancak bu bir yaklaşımdır , üniform bir aralıkların dağılımı Beta , çünkü olan yakınsak için kadarU(i:n)U(i1:n)B(1,n)

P(n{U(i:n)U(i1:n)}1)=(11n)n
e1nsonsuzluğa büyür. Yorumlara cevap veren bir diğer yana, von Neumann'ın 1951 üstel jeneratörü sadece tek tip nesiller kullanır.

2. Çözüm:

sabitinin bir integral olarak temsil edilmesinin bir başka yolu , sonra , ayrıca bir dağılımıdır. Bu nedenle, yaklaştırmak için ikinci bir yaklaşım göre Dolayısıyla, Monte Carlo normal çiftleri simüle etmek ve sürelerinin sıklığını izlemektir . Bir anlamda, ... ' in sıklığı ile ilgili nin Monte Carlo yaklaşımının tam tersidir.e

X1,X2iidN(0,1)
(X12+X22)χ12
E(1/2)
P(X12+X222)=1{1exp(2/2)}=e1
e(X1,X2)X12+X222πX12+X22<1

3. Çözüm:

Benim Warwick Üniversitesi meslektaşım M. Pollock adlı başka Monte Carlo tahminini işaret Forsythe'ın yöntem : Fikir üniforma nesillerin dizisini çalıştırmaktır kadar . Karşılık gelen durdurma kural beklentisi homojen dizisi gitti zaman sayısıdır, daha sonra olasılığı ise tek olduğu ! ( Forsythe'ın yöntemi aslında şeklindeki herhangi bir yoğunluğa benzetmeyi amaçlar , bu nedenle ve yaklaşmaktan daha geneldir .)u1,u2,...un+1>unNeNe1expG(x)ee1

Bu, Gnedenko'nun Aksakal'ın cevabında kullanılan yaklaşımına oldukça paraleldir , bu yüzden birinin diğerinden kaynaklanıp kaynaklanmadığını merak ediyorum. En azından ikisi de olasılık kütlesi ile aynı dağılıma sahipdeğeri için .1/n!n

Forsythe'ın yönteminin hızlı bir R uygulaması, paralel işleme izin veren daha büyük bloklar lehine üniformaların sırasını izlemekten vazgeçmektir:

use=runif(n)
band=max(diff((1:(n-1))[diff(use)>0]))+1
bends=apply(apply((apply(matrix(use[1:((n%/%band)*band)],nrow=band),
2,diff)<0),2,cumprod),2,sum)

12
Poisson simülasyonunun nasıl yapıldığını bilmediği sürece, . e
Glen_b

5
R rpoiss () jeneratörünü çağırırsam, bilmiyormuş gibi yapabilirim . Daha ciddi, üretebilir üstel değişkenler [a kullanarak işlevini yerine ] toplamı aşana kadar ve elde edilen sayı eksi bir Poisson olan . E ( 1 ) günlüğü e 1 P ( 1 )eE(1)loge1P(1)
Xi'an,

5
Computing , ters işlem oldukları için computing ile aynıdır. Böyle bir işlevi hesaplamaktan çeşitli şekillerde kaçınabilirsiniz. İşte ilk cevabınıza göre bir çözüm: Sadece temel aritmetik kullanır. explogexpn <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)
whuber

3
Forsythe'in yönteminin Gnedenko'nunkiyle aynı olduğuna inanıyorum. Üniforma seçimi böyle az 1'den seçme aynıdır olduğunu den küçük ve biz başarılı olursak, şartlı muntazam biçimde dağıtılmaktadır ve 0Σ n x i X , n 1 - Σ n - 1 x i 1 - Σ n x i 1 - Σ n - 1 x ixnnxixn1n1xi1nxi1n1xi
JWG

3
Forsythe'ın yaklaşımının farkında değildim. Ancak, çok ilginç bir şeyle bağlantılı. Eğer de durmak yerine, örneklemeye devam ederseniz, dibe olan uzaklığın beklentisi tam olarak 3'tür.nn+1n
Aksakal

7

Çözüm değil ... sadece yorum kutusu için çok uzun bir yorum.

Aksakal

Aksakal, toplamı 1'i aşacak şekilde beklenen standart Üniforma çizimlerinin sayısını hesapladığımız bir çözüm yayınladı. Mathematica'da ilk formülasyonum şuydu:

mrM := NestWhileList[(Random[] + #) &, Random[], #<1 &]

Mean[Table[Length[mrM], {10^6}]] 

EDIT: Sadece hızlı bir oyun vardı ve aşağıdaki kod (aynı yöntem - ayrıca Mma'da - sadece farklı kod) 10 kat daha hızlı:

Mean[Table[Module[{u=Random[], t=1},  While[u<1, u=Random[]+u; t++]; t] , {10^6}]]

Xian / Whuber

Whuber, Xian'ın 1. çözümünü simüle etmek için hızlı bir kod önerdi:

R sürümü: n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)

Mma versiyonu: n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]

not ettiği ilk kod 20 kat daha hızlıdır (veya yukarıdaki yeni koddan iki kat daha hızlıdır).

Sadece eğlence için, her iki yaklaşımın da (istatistiksel anlamda) etkili olup olmadığını görmenin ilginç olacağını düşündüm. Bunu yapmak için, e kullanarak 2000 tahminini oluşturdum:

  • Aksakal yöntemi: dataA
  • Xian'ın yöntem 1 whuber kodunu kullanarak: dataB

... ikisi de Mathematica'da . Aşağıdaki diyagram, elde edilen dataA ve dataB veri setlerinin parametrik olmayan bir çekirdek yoğunluğu tahminini karşılaştırmaktadır.

görüntü tanımını buraya girin

Böylece, whuber'in kodu (kırmızı eğri) iki kat daha hızlı olmasına rağmen, yöntem 'güvenilir' görünmüyor.


Gerçek değerin bulunduğu yerdeki dikey çizgi bu görüntüyü büyük ölçüde iyileştirir.
Monica

1
Çok ilginç bir gözlem, teşekkür ederim. Yarı genişlik, simülasyonun boyutuna göre kuadratik olarak ölçekleneceğinden ve Xi'an'ın yönteminin yarı genişliğine Aksakal'ınkinin yaklaşık iki katı olduğundan, daha sonra dört kez tekrar eden sayılar bunları eşit derecede doğru yapar. Her bir yinelemede ne kadar çaba gerektiğine dair soru hala devam ediyor: eğer Xi'an'ın yönteminin bir yinelemesi, çabanın dörtte birinden az sürerse, bu yöntem hala daha verimli olacaktır.
whuber

1
nominal değeri yerine her iki yöntemde de gereken rastgele değişkenlerin gerçekleşmelerinin sayısını karşılaştırdığınızda durumun netleştiğini düşünüyorum . n
whuber

1
@whuber şunu yazdı: running four times as many iterations will make them equally accurate///// ..... Bununla hızlı bir şekilde oynadım: Xian Metodu 1'de kullanılan örnek noktaların sayısını 6 x çıkarmak (yani, sayının 6 katı puanlar) Aksaksal'a benzer bir eğri üretir. 10 6106106
kurtlar

1
Kod ile Aferin - bu konuda çok geliştirmek zor olacak.
whuber

2

Çok fazla miktarda numune gerektiren yöntem

Öncelikle normal bir dağılımdan örnekleme yapabilmeniz gerekir. fonksiyonunun kullanımını dışlayacağınızı veya bu fonksiyondan türetilmiş tabloları aradığınızı varsayarak , CLT üzerinden normal dağılımdan yaklaşık örnekler üretebilirsiniz. Örneğin, tek biçimli (0,1) bir dağılımdan örnek alabilirseniz, . Whuber ile sivri dışarı olarak, son tahmin yaklaşımı için numune boyutu yaklaşırken , yaklaşımların kullanılan tek tip numune sayısı olduğu gerekli olacaktır numune büyüklüğü olarak sonsuza yaklaşan.ˉ xf(x)=exex¯12n˙N(0,1)e

Şimdi, normal bir dağılımdan örnek alabilirseniz, yeterince büyük örneklerle, yoğunluğunun tutarlı tahminlerini alabilirsiniz . Bu, histogramlarla veya çekirdek yumuşatıcılarla yapılabilir (ancak hiçbir kuralınızı takip etmek için bir Gauss çekirdeği kullanmamaya dikkat edin !). Yoğunluk tahminlerinizin tutarlı olmasını sağlamak için df'nizin (histogramdaki kutu sayısının, daha yumuşak pencerenin tersinin) yaklaşmasına izin vermeniz gerekir, ancak örneklem boyutundan daha yavaş.e xN(0,1)ex

Şimdi, bir çok hesaplama gücüyle, , yani yoğunluğunu yaklaşık olarak hesaplayabilirsiniz . beri , için tahmininiz .φ ( x ) φ ( N(0,1)ϕ^(x)ϕ((2))=(2π)1/2e1e=ϕ^(2)2π

Tamamen istiyorsanız, daha önce tartıştığınız yöntemleri kullanarak ve bile tahmin edebilirsiniz .22π

Çok az sayıda numune gerektiren, ancak çok fazla sayıda sayısal hataya neden olan yöntem

Yaptığım bir yoruma göre tamamen saçma ama çok verimli bir cevap:

Let . Tanımla. Tanımla .Xuniform(1,1)Yn=|(x¯)n|e^=(1Yn)1/Yn

Bu çok hızlı bir şekilde birleşecek , ancak aynı zamanda aşırı sayısal hataya yol açacaktır .

whuber bunun tipik olarak exp işlevini çağıran güç işlevini kullandığını belirtti. Bu kesikli kaçınmakla olabilir bu şekilde, bir tam sayı olduğu ve güç tekrarlayan çarpma ile değiştirilebilir. Sanki o gerekecektir ait diskretize daha da ince alacağı ve ayrıklaştırma dışlamak zorunda kalacak . Bununla, tahminci teorik olarak (yani sayısal hatanın bulunmadığı dünya) dönüşür ve oldukça hızlıdır!Yn1/YnnYnYn=0e


2
Sonuçta bu değerlerin biliyorum çünkü CLT yaklaşımı tatmin edici daha az değil normalde dağıttı. Ancak, veya logaritmalara ihtiyaç duymadan Normal değişkenleri üretmenin birçok yolu vardır : Box-Muller yöntemi biridir. Bununla birlikte, bunun için trig fonksiyonları ve (temel seviyede) üstellerin aynı üstellerle aynı olması gerekiyor. e
whuber

1
@whuber: Box-Muller'ı, gerekli log dönüşümü nedeniyle doğrudan kitabımdaki üsteli kullanmamıştım. Ben ediyorum refleksle cos ve günah kabul edildi, ama ben bir an için karmaşık analiz, çok iyi noktaya unutmuştu çünkü sadece oldu.
Cliff AB

1
Ancak, oluşturulan normal yaklaşımın bu fikrin zayıf noktası olduğu fikrini tartışabilirim; yoğunluk tahmini daha da zayıf! İki parametreye sahip olma fikrini düşünebilirsiniz: , "yaklaşık normal" kullanılan sayı formaları ve , yoğunluğu tahmin etmek için kullanılan yaklaşık normların sayısı . Hem itibariyle ve yaklaşım , tahmincisi yaklaşacaktır . Aslında, yakınsama oranının daha sınırlı çok ; parametrik olmayan yoğunluk, yavaş yakınsama oranına sahip! n1n2ϕ(2)n1n2en2n1
Cliff AB

2

İşte oldukça yavaş olmasına rağmen, yapılabilecek başka bir yol. Verimlilik iddiasında bulunmuyorum ama bu alternatifi bütünlük ruhu içinde sunuyorum.

Contra Xi'an'ın cevabı, bu sorunun amaçları için, bir tek tip sözde rastgele değişken dizisi üretip kullanabileceğinizi ve daha sonra tahmin etmek gerek yani sen logaritmik veya üstel fonksiyonları ya da bu fonksiyonları kullanan tüm dağılımları) kullanamazsınız (temel aritmetik işlemleri kullanarak bazı yöntemle. Bu yöntem, tek tip rastgele değişkenleri içeren basit bir sonuçla motive edilir:nU1,,UnIID U(0,1)e

E(I(Ui1/e)Ui)=1/e1duu=1.

Bu sonucu kullanarak tahmin edilmesi :e Önce istatistiklerini elde etmek için önce örneklerini aşağıya doğru sıralayın: ve ardından kısmi toplamları tanımlarız:u(1)u(n)

Sn(k)1ni=1k1u(i)for all k=1,..,n.

Şimdi ve sipariş edilen tekdüze değişkenlerin interpolasyonu ile tahmin edin. Bu, aşağıdakiler için verilen için bir tahminci verir :1 / e emmin{k|S(k)1}1/ee

e^2u(m)+u(m+1).

Bu yöntem, (cut-off noktasının doğrusal enterpolasyon nedeniyle bazı küçük bir önyargı vardır ) ama için tutarlı bir tahmin olup . Yöntem oldukça kolay bir şekilde uygulanabilir, ancak deterministik hesaplamasından daha hesaplama açısından daha yoğun olan değerlerin sıralanmasını gerektirir . Bu yöntem yavaştır, çünkü değerlerin sıralanmasını içerir., e , e1/eee

R cinsinden uygulama: Tekdüze değerler üretmek için bu yöntem Rkullanılabilir runif. Kod aşağıdaki gibidir:

EST_EULER <- function(n) { U <- sort(runif(n), decreasing = TRUE);
                           S <- cumsum(1/U)/n;
                           m <- min(which(S >= 1));
                           2/(U[m-1]+U[m]); }

Bu kodu uygulamak, gerçek değerine yakınsama sağlar , ancak deterministik yöntemlere kıyasla çok yavaştır.e

set.seed(1234);

EST_EULER(10^3);
[1] 2.715426

EST_EULER(10^4);
[1] 2.678373

EST_EULER(10^5);
[1] 2.722868

EST_EULER(10^6); 
[1] 2.722207

EST_EULER(10^7);
[1] 2.718775

EST_EULER(10^8);
[1] 2.718434

> exp(1)
[1] 2.718282

e Üstel veya logaritma içeren herhangi bir dönüşümü kullanan herhangi bir yöntemden kaçınmak istediğimizi düşünüyorum. Tanımlarında üstelleri kullanan yoğunlukları kullanabilirsek, yoğunluğunu bir çağrı kullanarak cebirsel olarak bu türetmek mümkündür .e

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.