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ξn∑ni=1ri>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Ü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Ü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:
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.
R
komutun ne yaptığını düşünerek açıkça ortaya çıkması muhtemeldir2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
. (Eğer logma Gamma işlevini kullanmak sizi rahatsız ediyorsa, yerine2 + 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ı ?