Xấp xỉ


35

Gần đây tôi đã xem mô phỏng Monte Carlo và đã sử dụng nó để tính gần đúng các hằng số như (khoanh tròn trong một hình chữ nhật, diện tích tỷ lệ).π

Tuy nhiên, tôi không thể nghĩ ra một phương pháp tương ứng gần đúng giá trị của [số Euler] bằng cách sử dụng tích hợp Monte Carlo.e

Bạn có bất kỳ gợi ý về cách này có thể được thực hiện?


7
Có rất nhiều, rất nhiều, rất nhiều cách để làm điều này. Rằng điều này có thể trở nên rõ ràng bằng cách suy nghĩ về những gì Rlệnh 2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))làm. (Nếu sử dụng nhật ký Gamma chức năng làm phiền bạn, thay thế nó bằng cách 2 + mean(1/factorial(ceiling(1/runif(1e5))-2)), trong đó sử dụng chỉ Ngoài ra, nhân, chia, và cắt ngắn, và bỏ qua những lời cảnh báo tràn.) Những gì có thể là mối quan tâm lớn hơn sẽ là hiệu quả mô phỏng: bạn có thể giảm thiểu số lượng các bước tính toán cần thiết để ước tính với độ chính xác nào? e
whuber

4
Thật là một câu hỏi thú vị! Tôi mong được đọc câu trả lời của người khác. Một cách mà bạn thực sự có thể thu hút sự chú ý cho câu hỏi này - có lẽ là nửa tá câu trả lời khác - sẽ là sửa lại câu hỏi và yêu cầu hiệu quả câu trả lời , như whuber gợi ý. Điều đó giống như catnip cho người dùng CV.
Sycorax nói Phục hồi lại

1
@EngrStudent Tôi không chắc là tương tự hình học tồn tại cho e . Nó đơn giản không phải là một đại lượng hình học tự nhiên (ý định chơi chữ) như π .
Aksakal

6
@Aksakal e là một đại lượng hình học đặc biệt . Ở cấp độ cơ bản nhất, nó xuất hiện một cách tự nhiên trong các biểu thức cho các khu vực liên quan đến hyperbol. Ở cấp độ nâng cao hơn một chút, nó được kết nối mật thiết với tất cả các hàm tuần hoàn, bao gồm các hàm lượng giác, có nội dung hình học rõ ràng. Thách thức thực sự ở đây là thật dễ dàng để mô phỏng các giá trị liên quan đến e !
whuber

2
@StatsStudent: e tự nó không thú vị. Tuy nhiên, nếu điều này dẫn đến các công cụ ước tính không thiên vị về số lượng như
exp{0xf(y)dG(y)}
thì điều này có thể chứng minh hữu ích nhất cho các thuật toán MCMC.
Tây An

Câu trả lời:


34

Cách đơn giản và thanh lịch để ước tính e của Monte Carlo được mô tả trong bài viết này . Bài viết thực sự là về giảng dạy e . Do đó, cách tiếp cận có vẻ hoàn toàn phù hợp với mục tiêu của bạn. Ý tưởng này dựa trên một bài tập từ sách giáo khoa phổ biến của Nga về lý thuyết xác suất của Gnedenko. Xem ex.22 trên p.183

Nó xảy ra sao cho E[ξ]=e , trong đó ξ là biến ngẫu nhiên được xác định như sau. Đó là số tối thiểu nsao cho i=1nri>1ri là các số ngẫu nhiên từ phân phối đồng đều trên [0,1] . Đẹp phải không?!

Vì đó là một bài tập, tôi không chắc liệu tôi có tuyệt không khi đăng giải pháp (bằng chứng) ở đây :) Nếu bạn muốn tự mình chứng minh, đây là một mẹo: chương có tên là "Khoảnh khắc", nên chỉ ra bạn đi đúng hướng

Nếu bạn muốn tự thực hiện nó, thì đừng đọc thêm!

Đây là một thuật toán đơn giản cho mô phỏng Monte Carlo. Vẽ một số ngẫu nhiên thống nhất, sau đó một số khác và cứ thế cho đến khi tổng vượt quá 1. Số lượng randoms được rút ra là thử nghiệm đầu tiên của bạn. Hãy nói rằng bạn có:

 0.0180
 0.4596
 0.7920

Sau đó, thử nghiệm đầu tiên của bạn được hiển thị 3. Tiếp tục thực hiện các thử nghiệm này và bạn sẽ nhận thấy rằng trung bình bạn nhận được e .

Mã MATLAB, kết quả mô phỏng và biểu đồ theo sau.

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)

Kết quả và biểu đồ:

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

nhập mô tả hình ảnh ở đây

CẬP NHẬT: Tôi đã cập nhật mã của mình để thoát khỏi mảng kết quả dùng thử để không mất RAM. Tôi cũng đã in dự toán PMF.

Cập nhật 2: Đây là giải pháp Excel của tôi. Đặt một nút trong Excel và liên kết nó với macro VBA sau:

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

Nhập số lượng thử nghiệm, chẳng hạn như 1000, trong ô D1 và nhấp vào nút. Đây là màn hình sẽ như thế nào sau lần chạy đầu tiên:

nhập mô tả hình ảnh ở đây

CẬP NHẬT 3: Silverfish truyền cảm hứng cho tôi theo một cách khác, không thanh lịch như cách đầu tiên nhưng vẫn mát mẻ. Nó đã tính toán khối lượng của n-Simplexes bằng các chuỗi Sobol .

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

Tình cờ anh viết cuốn sách đầu tiên về phương pháp Monte Carlo mà tôi đọc hồi còn học trung học. Theo ý kiến ​​của tôi, đây là phần giới thiệu tốt nhất.

CẬP NHẬT 4:

Silverfish trong các ý kiến ​​đề xuất một công thức Excel đơn giản. Đây là loại kết quả bạn nhận được với cách tiếp cận của anh ấy sau khoảng 1 triệu số ngẫu nhiên và 185 nghìn thử nghiệm:

nhập mô tả hình ảnh ở đây

Rõ ràng, điều này chậm hơn nhiều so với triển khai VBA của Excel. Đặc biệt, nếu bạn sửa đổi mã VBA của tôi để không cập nhật các giá trị ô bên trong vòng lặp và chỉ thực hiện khi tất cả các số liệu thống kê được thu thập.

CẬP NHẬT 5

Giải pháp số 3 của Xi'an có liên quan chặt chẽ (hoặc thậm chí giống nhau theo nghĩa nào đó theo nhận xét của jwg trong chuỗi). Thật khó để nói ai đã nghĩ ra ý tưởng đầu tiên Forsythe hay Gnedenko. Phiên bản gốc 1950 của Gnedenko bằng tiếng Nga không có phần Sự cố trong Chương. Vì vậy, tôi không thể tìm thấy vấn đề này ngay từ cái nhìn đầu tiên trong đó là phiên bản sau. Có lẽ nó đã được thêm vào sau hoặc chôn trong văn bản.

Như tôi đã nhận xét trong câu trả lời của Tây An, cách tiếp cận của Forsythe được liên kết với một lĩnh vực thú vị khác: sự phân bố khoảng cách giữa các đỉnh (cực trị) theo trình tự ngẫu nhiên (IID). Khoảng cách trung bình xảy ra là 3. Trình tự xuống trong cách tiếp cận của Forsythe kết thúc bằng một đáy, vì vậy nếu bạn tiếp tục lấy mẫu, bạn sẽ nhận được một đáy khác tại một số điểm, sau đó khác, v.v. Bạn có thể theo dõi khoảng cách giữa chúng và xây dựng phân phối.


Wow nó thật tuyệt! Bạn có thể thêm một hoặc hai đoạn giải thích lý do tại sao điều này hoạt động?
Sycorax nói Phục hồi lại

7
(+1) Rực rỡ! Câu trả lời xứng đáng với điểm cao nhất vì nó chỉ dựa vào mô phỏng thống nhất. Và không sử dụng bất kỳ xấp xỉ nào ngoài một do Monte Carlo. Rằng nó kết nối trở lại với Gnedenko là một lợi ích nữa.
Tây An

2
Mát mẻ! Dưới đây là Mathematica mã cho cùng, như một lớp lót:
Mean[Table[ Length[NestWhileList[(Random[]+#) &, Random[], #<1&]], {10^6}]]
wolfies

4
@wolfies Bản dịch trực tiếp sau đây của Rgiải pháp tôi đã đăng trong câu trả lời của Xi'an nhanh hơn hai mươi lần:n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
whuber

1
Tôi đã đăng "tại sao có nghĩa là ?" câu hỏi như một câu hỏi theo đúng nghĩa của nó ; Tôi nghi ngờ giải pháp phác thảo của tôi (đó là điều ngay lập tức nảy ra trong đầu vì sự trực quan hóa "rõ ràng" của vấn đề) không nhất thiết là cách mà các sinh viên Nga dự định làm điều đó! Vì vậy, giải pháp thay thế sẽ rất được hoan nghênh. e
Cá bạc

19

Tôi đề nghị nâng cao câu trả lời của Aksakal. Nó không thiên vị và chỉ dựa vào một phương pháp tạo ra sự lệch lạc đơn vị.

Câu trả lời của tôi có thể được thực hiện một cách tùy tiện, nhưng vẫn bị sai lệch so với giá trị thực của .e

Câu trả lời của Xi'an là chính xác, nhưng tôi nghĩ rằng sự phụ thuộc của nó vào chức năng hoặc cách tạo ra các sai lệch ngẫu nhiên Poisson là một vòng tròn khi mục đích là để xấp xỉ e .loge

Ước tính bằng Bootstrappinge

Thay vào đó, hãy xem xét thủ tục bootstrapping. Người ta có một số lượng lớn các đối tượng được vẽ thay thế cho kích thước mẫu là n . Ở mỗi lần vẽ, xác suất không vẽ một đối tượng cụ thể i1 - n - 1 và có n lần rút như vậy. Xác suất mà một đối tượng cụ thể bị bỏ qua trong tất cả các lần rút là p = ( 1 - 1nni1n1np=(11n)n.

Bởi vì tôi giả sử chúng ta biết rằng

exp(1)=limn(11n)n

vì vậy chúng tôi cũng có thể viết

exp(1)p^=i=1mIiBjm

Đó là, ước tính của chúng tôi được tìm thấy bằng cách ước tính xác suất bỏ qua một quan sát cụ thể từ m bootstrap sao chép B j qua nhiều lần sao chép như vậy - tức là tỷ lệ xuất hiện của đối tượng i trong bootstraps.pmBji

Có hai nguồn lỗi trong phép tính gần đúng này. Finite sẽ luôn có nghĩa là các kết quả là gần đúng, tức là ước tính bị sai lệch. Thêm vào đó, pnp^ sẽ dao động xung quanh giá trị thực sự vì đây là một mô phỏng.

Tôi thấy phương pháp này có phần quyến rũ vì một đại học hoặc một người khác với đủ ít để làm có thể xấp xỉ sử dụng một cỗ bài, một đống đá nhỏ, hoặc bất kỳ vật dụng khác trong tầm tay, trong bối cảnh đó như một người có thể ước tính π sử dụng một la bàn, một cạnh thẳng và một số hạt cát. Tôi nghĩ thật gọn gàng khi toán học có thể được tách ra khỏi các tiện ích hiện đại như máy tính.eπ

Các kết quả

Tôi đã tiến hành một số mô phỏng cho số lần sao chép bootstrap khác nhau. Lỗi tiêu chuẩn được ước tính bằng cách sử dụng khoảng thời gian bình thường.

Lưu ý rằng việc chọn số lượng đối tượng được bootstrapping đặt giới hạn trên tuyệt đối cho độ chính xác của kết quả vì quy trình Monte Carlo đang ước tính pp chỉ phụ thuộc vào n . Đặt n thành lớn không cần thiết sẽ chỉ làm tắc nghẽn máy tính của bạn, bởi vì bạn chỉ cần một xấp xỉ "thô" cho e hoặc vì độ lệch sẽ bị thay đổi do phương sai do Monte Carlo. Các kết quả này cho n = 10 3p - 1e là chính xác đến chữ số thập phân thứ ba.nppnnen=103p1e

Âm mưu này cho thấy rằng sự lựa chọn của có hậu quả trực tiếp và sâu sắc đối với sự ổn định trong p . Đường đứt nét màu xanh hiển thị p và đường màu đỏ hiển thị e . Đúng như dự đoán, tăng kích thước mẫu sản xuất ước tính hơn bao giờ hết chính xác p . mp^pep^nhập mô tả hình ảnh ở đây

Tôi đã viết một kịch bản R dài đáng xấu hổ cho việc này. Đề xuất cải tiến có thể được gửi ở mặt sau của hóa đơn $ 20.

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 Nó rất có ý nghĩa. Bất kỳ cơ hội bạn có thể chia sẻ mã của bạn nếu bạn đã viết nó?
Antoni Parellada

2
Mặc dù điều này có thể chính xác tùy ý, cuối cùng nó không đạt yêu cầu vì nó chỉ mô phỏng một xấp xỉ với chứ không phải chính e . ee
whuber

1
Chắc chắn rồi. Bạn sẽ chỉ kết thúc với một cuộc gọi lặp lại bên trong một cuộc gọi khác, về cơ bản giống như chúng ta có bây giờ.
Sycorax nói Phục hồi lại

1
ee

1
@jwg Ngoài việc quan trọng về mặt khái niệm, nó còn thực sự quan trọng bởi vì việc thực hiện một xấp xỉ gần đúng đòi hỏi phải theo dõi mức độ chính xác của hai trong hai xấp xỉ này. Nhưng tôi sẽ phải đồng ý rằng khi cả hai xấp xỉ đều tốt, thì cách tiếp cận tổng thể thực sự tốt.
whuber

14

Giải pháp 1:

P(λ)

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

U(i:n)U(i1:n)B(1,n)

P(n{U(i:n)U(i1:n)}1)=(11n)n
e1n

Giải pháp 2:

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

Giải pháp 3:

u1,u2,...un+1>unNeNe1expG(x)ee1

1/n!n

Việc triển khai R nhanh chóng theo phương pháp của Forsythe là từ bỏ chính xác chuỗi đồng phục có lợi cho các khối lớn hơn, cho phép xử lý song song:

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
e

5
eE(1)loge1P(1)

5
đăng nhậpđiểm kinh nghiệmn <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)

3
xnnxtôixn1-Σn-1xtôi1-Σnxtôi1-Σn-1xtôi

3
n+1n

7

Không phải là một giải pháp ... chỉ là một nhận xét nhanh mà quá dài cho hộp bình luận.

Aksakal

Aksakal đã đăng một giải pháp trong đó chúng tôi tính toán số lượng bản vẽ Đồng phục tiêu chuẩn dự kiến ​​phải được thực hiện, sao cho tổng của chúng sẽ vượt quá 1. Trong Mathematica , công thức đầu tiên của tôi là:

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

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

EDIT: Chỉ cần chơi nhanh với điều này và đoạn mã sau (cùng phương thức - cũng trong Mma - chỉ là mã khác) nhanh hơn khoảng 10 lần:

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

Tây An / Whuber

Whuber đã đề xuất mã mát nhanh để mô phỏng giải pháp của Xian 1:

Phiên bản R: n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)

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

mà ông lưu ý là mã đầu tiên nhanh hơn 20 lần (hoặc nhanh gấp khoảng hai lần mã mới ở trên).

Chỉ để cho vui, tôi nghĩ sẽ rất thú vị để xem liệu cả hai cách tiếp cận đều hiệu quả (theo nghĩa thống kê). Để làm như vậy, tôi đã tạo ra 2000 ước tính của e bằng cách sử dụng:

  • Phương pháp của Aksakal: dataA
  • Phương pháp 1 của Xian sử dụng mã whuber: dataB

... cả trong Mathicala . Sơ đồ sau đây tương phản với ước tính mật độ hạt nhân không theo tỷ lệ của các tập dữ liệu dataA và dataB kết quả.

nhập mô tả hình ảnh ở đây

Vì vậy, trong khi mã của trình duyệt (đường cong màu đỏ) nhanh gấp khoảng hai lần, thì phương thức này dường như không 'đáng tin cậy'.


Một đường thẳng đứng ở vị trí của giá trị thực sẽ cải thiện đáng kể hình ảnh này.
Sycorax nói Phục hồi lại

1
Đó là một quan sát rất thú vị, cảm ơn bạn. Vì nửa chiều rộng sẽ chia tỷ lệ bậc hai với kích thước mô phỏng và nửa chiều rộng của phương pháp của Xi'an gấp khoảng hai lần so với Aksakal, sau đó chạy gấp bốn lần số lần lặp sẽ làm cho chúng chính xác như nhau. Câu hỏi về bao nhiêu nỗ lực là cần thiết trong mỗi lần lặp lại: nếu một lần lặp phương pháp của Xi'an mất ít hơn một phần tư nỗ lực, thì phương pháp đó vẫn hiệu quả hơn.
whuber

1
Tôi tin rằng tình huống trở nên rõ ràng khi bạn so sánh số lượng thực hiện các biến ngẫu nhiên được yêu cầu trong cả hai phương thức thay vì giá trị danh nghĩa của n.
whuber

1
@whuber đã viết: running four times as many iterations will make them equally accurate///// ..... Chỉ cần chơi nhanh với điều này: tăng số lượng điểm mẫu được sử dụng trong Phương pháp 1 của Xian từ106 đến 6 x 106 (tức là gấp 6 lần số điểm) tạo ra một đường cong tương tự như Aksaksal.
sói 7/2/2016

1
Được thực hiện tốt với mã - sẽ rất khó để cải thiện nhiều về điều đó.
whuber

2

Phương pháp đòi hỏi một lượng mẫu vô duyên

Trước tiên, bạn cần có thể lấy mẫu từ một phân phối bình thường. Giả sử bạn sẽ loại trừ việc sử dụng hàmf(x)= =exhoặc tìm kiếm các bảng có nguồn gốc từ chức năng đó, bạn có thể tạo các mẫu gần đúng từ phân phối bình thường thông qua CLT. Ví dụ: nếu bạn có thể lấy mẫu từ phân phối (0,1) thống nhất, thìx¯12n~˙N(0,1). Như được chỉ ra bởi whuber, để có phương pháp ước tính cuối cùnge khi kích thước mẫu tiếp cận , nó sẽ được yêu cầu rằng số lượng mẫu thống nhất được sử dụng phương pháp tiếp cận khi kích thước mẫu tiến đến vô cùng.

Bây giờ, nếu bạn có thể lấy mẫu từ một phân phối bình thường, với các mẫu đủ lớn, bạn có thể nhận được các ước tính nhất quán về mật độ của N(0,1). Điều này có thể được thực hiện với biểu đồ hoặc trình làm mịn kernel (nhưng hãy cẩn thận không sử dụng kernel Gaussian để làm theoexqui định!). Để có được ước tính mật độ của bạn là nhất quán, bạn sẽ cần để df (số thùng trong biểu đồ, nghịch đảo của cửa sổ cho mượt mà hơn) tiếp cận vô hạn, nhưng chậm hơn kích thước mẫu.

Vì vậy, bây giờ, với rất nhiều sức mạnh tính toán, bạn có thể xấp xỉ mật độ của một N(0,1), I E φ^(x). Kể từ khiφ((2))= =(2π)-1/2e-1, ước tính của bạn cho e= =φ^(2)2π.

Nếu bạn muốn đi hoàn toàn hạt dẻ, bạn thậm chí có thể ước tính 22π sử dụng các phương pháp bạn đã thảo luận trước đó.

Phương pháp yêu cầu rất ít mẫu, nhưng gây ra một số lỗi vô duyên

Một câu trả lời hoàn toàn ngớ ngẩn, nhưng rất hiệu quả, dựa trên một nhận xét tôi đã đưa ra:

Để cho X~đồng phục(-1,1). Định nghĩaYn= =|(x¯)n|. Định nghĩae^= =(1-Yn)-1/Yn.

Điều này sẽ hội tụ rất nhanh, nhưng cũng gặp phải lỗi số cực lớn.

whuber chỉ ra rằng cái này sử dụng hàm power, thường gọi hàm exp. Điều này có thể được bỏ qua bằng cách rời rạcYn, như vậy mà 1/Ynlà một số nguyên và sức mạnh có thể được thay thế bằng phép nhân lặp lại. Nó sẽ được yêu cầu như làn, sự rời rạc của Yn sẽ trở nên tốt hơn và tốt hơn, và sự rời rạc sẽ phải loại trừ Yn= =0. Với điều này, theo ước tính về mặt lý thuyết (tức là thế giới không tồn tại lỗi số) sẽ hội tụe, và khá nhanh!


2
Cách tiếp cận CLT chưa thỏa đáng vì cuối cùng bạn biết những giá trị này thường không được phân phối. Nhưng có rất nhiều cách để tạo ra các biến thể Bình thường mà không cầnehoặc logarit: phương thức Box-Muller là một. Tuy nhiên, cái đó đòi hỏi các hàm lượng giác và (ở mức cơ bản), chúng giống như hàm mũ.
whuber

1
@whuber: Tôi đã không sử dụng Box-Muller do biến đổi nhật ký được yêu cầu quá trực tiếp theo cấp số nhân trong cuốn sách của tôi. Theo phản xạ tôi sẽ cho phép cos và tội lỗi, nhưng đó chỉ là do tôi đã quên mất việc phân tích phức tạp trong một thời điểm, vì vậy điểm tốt.
Vách đá AB

1
Tuy nhiên, tôi sẽ tranh luận với ý tưởng rằng xấp xỉ bình thường được tạo ra là điểm yếu của ý tưởng này; ước tính mật độ thậm chí còn yếu hơn! Bạn có thể nghĩ về ý tưởng này có hai tham số:n1, số lượng đồng phục được sử dụng trong "bình thường gần đúng" của bạn và n2 số lượng các quy tắc xấp xỉ được sử dụng ước tính mật độ tại φ(2). Như cả hain1n2 tiếp cận , người ước tính sẽ tiếp cận e. Trên thực tế, tôi rất tự tin rằng tốc độ hội tụ sẽ bị hạn chế hơn nhiều bởin2 hơn n1; mật độ không tham số có tốc độ hội tụ chậm!
Vách đá AB

2

Đây là một cách khác có thể được thực hiện, mặc dù nó khá chậm. Tôi không tuyên bố về hiệu quả, nhưng đưa ra sự thay thế này trên tinh thần hoàn thiện.

Câu trả lời của Contra Tây An , tôi sẽ giả sử cho các mục đích của câu hỏi này rằng bạn có thể tạo và sử dụng một chuỗin biến giả ngẫu nhiên thống nhất Bạn1,,Bạnn~IID U(0,1) và sau đó bạn cần ước tính e bằng một số phương pháp sử dụng các phép toán số học cơ bản (nghĩa là, bạn không thể sử dụng các hàm logarit hoặc hàm mũ hoặc bất kỳ phân phối nào sử dụng các hàm này). Phương pháp hiện tại được thúc đẩy bởi một kết quả đơn giản liên quan đến các biến ngẫu nhiên thống nhất:

E(tôi(Bạntôi1/e)Bạntôi)= =1/e1dbạnbạn= =1.

Dự toán esử dụng kết quả này: Trước tiên, chúng tôi sắp xếp các giá trị mẫu theo thứ tự giảm dần để có được số liệu thống kê đơn hàngbạn(1)bạn(n) và sau đó chúng tôi xác định các khoản tiền một phần:

Sn(k)1nΣtôi= =1k1bạn(tôi)cho tất cả k= =1,..,n.

Bây giờ, hãy để mtối thiểu{k|S(k)1} và sau đó ước tính 1/ebằng cách nội suy các biến thống nhất theo thứ tự. Điều này đưa ra một ước tính choe được cho bởi:

e^2bạn(m)+bạn(m+1).

Phương pháp này có một số sai lệch nhỏ (do nội suy tuyến tính của điểm giới hạn cho 1/e) nhưng nó là một công cụ ước tính phù hợp cho e. Phương pháp có thể được thực hiện khá dễ dàng nhưng nó đòi hỏi phải sắp xếp các giá trị, tính toán chuyên sâu hơn so với tính toán xác định củae. Phương pháp này chậm, vì nó liên quan đến việc sắp xếp các giá trị.

Triển khai trong R: Phương thức có thể được thực hiện Rbằng cách sử dụng runifđể tạo các giá trị đồng nhất. Mã như sau:

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]); }

Việc triển khai mã này mang lại sự hội tụ cho giá trị thực của e, nhưng nó rất chậm so với các phương pháp xác định.

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

Tôi đưa ra quan điểm rằng chúng tôi muốn tránh mọi phương pháp sử dụng bất kỳ phép biến đổi nào liên quan đến hàm mũ hoặc logarit. Nếu chúng ta có thể sử dụng mật độ sử dụng hàm mũ theo định nghĩa của chúng thì có thể rút ra đượce từ những đại số này bằng cách sử dụng một cuộc gọi mật độ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.