ประมาณ


35

ฉันได้ดูการจำลอง Monte Carlo เมื่อเร็ว ๆ นี้และได้ใช้มันกับค่าคงที่โดยประมาณเช่นπ (วงกลมภายในสี่เหลี่ยมมุมฉากสัดส่วนตามสัดส่วน)

อย่างไรก็ตามฉันไม่สามารถคิดถึงวิธีการที่สอดคล้องกันในการประมาณค่าของe [หมายเลขของออยเลอร์] โดยใช้การรวม Monte Carlo

คุณมีพอยน์เตอร์เกี่ยวกับวิธีการนี้สามารถทำได้หรือไม่?


7
มีหลายวิธีหลายวิธีในการทำเช่นนี้ สิ่งนี้อาจจะเห็นได้ชัดโดยพิจารณาว่าRคำสั่ง2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))ทำอะไร (หากใช้ฟังก์ชั่นบันทึก Gamma รบกวนคุณแทนที่ด้วย2 + mean(1/factorial(ceiling(1/runif(1e5))-2))ซึ่งใช้เฉพาะการเพิ่มการคูณการหารและการตัดและละเว้นการเตือนการล้น) สิ่งที่น่าสนใจมากกว่าคือการจำลองที่มีประสิทธิภาพ : คุณสามารถลดจำนวนของ ขั้นตอนการคำนวณที่จำเป็นในการประมาณค่าeเพื่อความแม่นยำที่กำหนด?
whuber

4
ช่างเป็นคำถามที่น่ายินดี! ฉันหวังว่าจะได้อ่านคำตอบของผู้อื่น วิธีหนึ่งที่คุณสามารถดึงความสนใจไปที่คำถามนี้ - บางทีอาจจะมีอีกครึ่งโหลตอบ - คือการแก้ไขคำถามและขอคำตอบที่มีประสิทธิภาพตามที่ whuber แนะนำ นั่นเป็นเหมือน catnip สำหรับผู้ใช้ CV
Reinstate Monica

1
@EngrStudent ผมไม่แน่ใจว่าอนาล็อกเรขาคณิตที่มีอยู่สำหรับอีeมันก็ไม่ได้เป็นธรรมชาติ (เล่นสำนวนเจตนา) ปริมาณเรขาคณิตเช่นππ
Aksakal

6
@ Aksakal eเป็นปริมาณเชิงเรขาคณิตที่ยอดเยี่ยม ในระดับประถมศึกษาส่วนใหญ่จะปรากฏตามธรรมชาติในนิพจน์สำหรับพื้นที่ที่เกี่ยวข้องกับไฮเปอร์โบลา ในระดับที่สูงขึ้นเล็กน้อยจะเชื่อมโยงอย่างใกล้ชิดกับฟังก์ชั่นเป็นระยะรวมถึงฟังก์ชั่นตรีโกณมิติซึ่งมีเนื้อหาทางเรขาคณิตที่ชัดเจน ความท้าทายที่แท้จริงที่นี่ก็คือว่ามันเพียงเพื่อให้ง่ายในการจำลองค่าที่เกี่ยวข้องกับe !
whuber

2
@StatsStudent: ด้วยตัวเองไม่น่าสนใจ อย่างไรก็ตามหากสิ่งนี้นำไปสู่การประมาณปริมาณที่เป็นกลางเช่นexp { x 0 f ( y ) d G ( y ) }สิ่งนี้อาจพิสูจน์ได้ว่ามีประโยชน์มากที่สุดสำหรับอัลกอริทึม MCMC e
exp{0xf(y)dG(y)}
ซีอาน

คำตอบ:


34

วิธีที่ง่ายและสง่างามในการประมาณค่าโดย Monte Carlo ได้อธิบายไว้ในบทความนี้ กระดาษที่เป็นจริงเกี่ยวกับการเรียนการสอนอิเล็กทรอนิกส์ ดังนั้นวิธีการที่เหมาะสมที่สุดสำหรับเป้าหมายของคุณ ความคิดนี้ใช้แบบฝึกหัดจากตำราเรียนภาษารัสเซียยอดนิยมเรื่องทฤษฎีความน่าจะเป็นโดย Gnedenko ดู ex.22 ในหน้า 183ee

มันเกิดขึ้นเพื่อให้โดยที่ξเป็นตัวแปรสุ่มที่กำหนดไว้ดังนี้ มันเป็นจำนวนขั้นต่ำของnดังกล่าวว่าΣ n ฉัน= 1 R ฉัน > 1และr ฉันเป็นตัวเลขที่สุ่มจากเครื่องแบบกระจายบน[ 0 , 1 ] สวยใช่มั้ย!E[ξ]=eξni=1nri>1ri[0,1]

เนื่องจากมันเป็นการออกกำลังกายฉันไม่แน่ใจว่ามันยอดเยี่ยมสำหรับฉันที่จะโพสต์คำตอบ (หลักฐาน) ที่นี่ :) ถ้าคุณต้องการพิสูจน์ด้วยตัวเองนี่คือเคล็ดลับ: บทที่เรียกว่า "ช่วงเวลา" ซึ่งควรชี้ คุณไปในทิศทางที่ถูกต้อง

หากคุณต้องการที่จะใช้มันด้วยตัวคุณเองอย่าอ่านต่อ!

นี่เป็นอัลกอริทึมที่ง่ายสำหรับการจำลอง Monte Carlo วาดชุดสุ่มจากนั้นอีกอันหนึ่งเรื่อย ๆ จนกระทั่งผลรวมเกิน 1 จำนวนแรนดอมที่ถูกสุ่มคือการทดลองครั้งแรกของคุณ สมมติว่าคุณได้รับ:

 0.0180
 0.4596
 0.7920

จากนั้นพิจารณาคดีครั้งแรกของคุณกลาย 3. ให้ทำการทดลองเหล่านี้และคุณจะพบว่ามีค่าเฉลี่ยที่คุณได้รับอีเมลe

รหัส MATLAB ผลการจำลองและฮิสโตแกรมติดตาม

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)

ผลลัพธ์และฮิสโตแกรม:

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

ป้อนคำอธิบายรูปภาพที่นี่

อัปเดต: ฉันอัปเดตรหัสของฉันเพื่อกำจัดอาร์เรย์ของผลการทดลองเพื่อที่จะไม่ใช้ RAM ฉันพิมพ์ประมาณการ PMF ด้วย

อัปเดต 2: นี่คือโซลูชัน Excel ของฉัน วางปุ่มใน Excel และเชื่อมโยงไปยังแมโคร VBA ต่อไปนี้:

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

ป้อนจำนวนการทดลองเช่น 1,000 ในเซลล์ D1 และคลิกปุ่ม ที่นี่หน้าจอควรมีลักษณะอย่างไรหลังจากเรียกใช้ครั้งแรก:

ป้อนคำอธิบายรูปภาพที่นี่

UPDATE 3: Silverfish เป็นแรงบันดาลใจให้ฉันไปอีกทางหนึ่งไม่ใช่สง่างามอย่างแรก มันคำนวณปริมาณของ n-simplexes โดยใช้ลำดับ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

บังเอิญเขาเขียนหนังสือเล่มแรกเกี่ยวกับวิธีการ Monte Carlo ฉันอ่านกลับในโรงเรียนมัธยม เป็นการแนะนำวิธีการที่ดีที่สุดในความคิดของฉัน

อัพเดท 4:

Silverfish ในความคิดเห็นแนะนำการใช้สูตร Excel อย่างง่าย นี่คือผลลัพธ์ที่คุณจะได้รับเมื่อเข้าใกล้ตัวเลขสุ่ม 1 ล้านตัวและการทดลอง 185K:

ป้อนคำอธิบายรูปภาพที่นี่

เห็นได้ชัดว่านี่ช้ากว่าการนำ Excel VBA ไปใช้ โดยเฉพาะอย่างยิ่งถ้าคุณแก้ไขโค้ด VBA ของฉันเพื่อไม่อัปเดตค่าของเซลล์ภายในลูปและทำเพียงครั้งเดียวเท่านั้นเมื่อมีการรวบรวมสถิติทั้งหมด

อัพเดท 5

วิธีการแก้ปัญหาของซีอาน# 3 มีความเกี่ยวข้องอย่างใกล้ชิด (หรือแม้กระทั่งในความหมายบางอย่างตามความเห็นของ jwg ในหัวข้อ) มันยากที่จะบอกว่าใครเป็นคนคิดไอเดียแรกคือ Forsythe หรือ Gnedenko ฉบับ 1950 ของ Gnedenko ในภาษารัสเซียไม่มีส่วนของปัญหาในบทต่างๆ ดังนั้นฉันไม่สามารถพบปัญหานี้ได้ในครั้งแรกที่มันอยู่ในรุ่นที่ใหม่กว่า อาจถูกเพิ่มเข้ามาในภายหลังหรือฝังไว้ในข้อความ

เมื่อฉันแสดงความคิดเห็นในคำตอบของซีอานแนวทางของ Forsythe เชื่อมโยงกับพื้นที่ที่น่าสนใจอื่น: การกระจายระยะทางระหว่างยอดเขา (extrema) ในลำดับสุ่ม (IID) ระยะทางเฉลี่ยเกิดขึ้นที่ 3. ลำดับลงในแนวทางของ Forsythe จบลงด้วยล่างดังนั้นถ้าคุณสุ่มตัวอย่างต่อไปคุณจะได้จุดต่ำสุดอีกจุดหนึ่งจากนั้นอีกจุดหนึ่งเป็นต้นคุณสามารถติดตามระยะห่างระหว่างพวกมันและสร้างการกระจายตัว


ว้าวเยี่ยมเลย! คุณสามารถเพิ่มย่อหน้าหนึ่งหรือสองอธิบายว่าทำไมงานนี้
Reinstate Monica

7
(+1) ยอดเยี่ยม! คำตอบควรได้รับเครื่องหมายสูงสุดเพราะมันขึ้นอยู่กับการจำลองสถานการณ์เหมือนกัน และไม่ใช้การประมาณค่าใด ๆ ยกเว้นอันเนื่องมาจาก Monte Carlo ว่ามันเชื่อมต่อกลับไป Gnedenko เป็นเงยต่อไป
ซีอาน

2
Mean[Table[ Length[NestWhileList[(Random[]+#) &, Random[], #<1&]], {10^6}]]

4
@wolfies การแปลโดยตรงต่อไปนี้Rของคำตอบที่ฉันโพสต์ในคำตอบของซีอานเร็วกว่ายี่สิบเท่า:n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
whuber

1
e

19

ฉันแนะนำให้ upvoting คำตอบของ Aksakal มันไม่เอนเอียงและอาศัยวิธีการสร้างชุดเครื่องแบบเบี่ยงเบนเท่านั้น

e

loge

e

nni1n1np=(11n)n.

exp(1)=limn(11n)n

ดังนั้นเราจึงสามารถเขียน

exp(1)p^=i=1mIiBjm

นั่นคือการประมาณค่าของเรานั้นพบได้โดยการประมาณความน่าจะเป็นที่การสังเกตแบบจำเพาะถูกละเว้นจาก bootstrap จะทำซ้ำการจำลองแบบจำนวนมากเช่น - เศษส่วนของการเกิดขึ้นของวัตถุใน bootstrapspmBji

มีข้อผิดพลาดสองแหล่งในการประมาณนี้ Finiteจะหมายความว่าผลลัพธ์นั้นเป็นค่าประมาณเสมอนั่นคือการประเมินแบบเอนเอียง นอกจากนี้จะแกว่งไปมารอบ ๆ มูลค่าที่แท้จริงเพราะนี่เป็นการจำลองสถานการณ์np^

ผมพบว่าวิธีการนี้ค่อนข้างมีเสน่ห์เพราะระดับปริญญาตรีหรือบุคคลอื่นที่มีเล็ก ๆ น้อย ๆ พอที่จะทำอาจจะใกล้เคียงกับใช้ดาดฟ้าของบัตรกองหินขนาดเล็กหรือรายการอื่น ๆ ที่อยู่ในมือในหลอดเลือดดำเดียวกันเป็นคนที่สามารถประมาณการใช้เข็มทิศเส้นรอบวงและทรายบางเม็ด ฉันคิดว่ามันเรียบร้อยเมื่อคณิตศาสตร์สามารถแยกจากสิ่งอำนวยความสะดวกที่ทันสมัยเช่นคอมพิวเตอร์eπ

ผล

ฉันทำการจำลองหลายครั้งสำหรับจำนวนการจำลองการบูตที่แตกต่างกัน ข้อผิดพลาดมาตรฐานถูกประเมินโดยใช้ช่วงเวลาปกติ

โปรดทราบว่าทางเลือกของจำนวนของวัตถุที่ถูก bootstrapped ชุดขีด จำกัด บนแน่นอนในความถูกต้องของผลเพราะขั้นตอน Monte Carlo จะประเมินและขึ้นอยู่กับnการตั้งค่าให้มีขนาดใหญ่เกินความจำเป็นจะทำให้เครื่องคอมพิวเตอร์ของคุณเกิดขึ้นเนื่องจากคุณต้องการการประมาณคร่าวๆถึงหรือเพราะอคตินั้นจะล้นหลามเนื่องจากความแปรปรวนของ Monte Carlo ผลลัพธ์เหล่านี้มีไว้สำหรับและถูกต้องกับทศนิยมที่สามnppnnen=103p1e

พล็อตนี้แสดงให้เห็นว่าทางเลือกของมีผลกระทบโดยตรงและลึกซึ้งเพื่อความมั่นคงใน{p} สีฟ้าเส้นประแสดงและสายสีแดงแสดงให้เห็นว่าอีเป็นที่คาดหวังที่เพิ่มขึ้นขนาดของกลุ่มตัวอย่างผลิตประมาณการที่เคยถูกต้องมากขึ้น{p} mp^pep^ป้อนคำอธิบายรูปภาพที่นี่

ฉันเขียนสคริปต์ R อันยาวเหยียดสำหรับเรื่องนี้ ข้อเสนอแนะสำหรับการปรับปรุงสามารถส่งด้านหลังของการเรียกเก็บเงิน $ 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 มันสมเหตุสมผลมาก โอกาสใดที่คุณสามารถแบ่งปันรหัสของคุณหากคุณเขียนมัน?
Antoni Parellada

2
แม้ว่านี้จะมีความถูกต้องแม่นยำโดยพลการในท้ายที่สุดก็เป็นที่น่าพอใจเพราะเพียงจำลองประมาณไปมากกว่าตัวเอง ee
whuber

1
แน่ใจ คุณจะจบลงด้วยการโทรซ้ำหนึ่งครั้งภายในอีกสาย
Reinstate Monica

1
@whuber ฉันไม่เห็นความแตกต่างระหว่างการประมาณค่าที่ถูกต้องตามอำเภอใจกับการประมาณค่าที่แม่นยำโดยพลการกับและการประมาณค่าที่แม่นยำโดยพลการกับเอง ee
jwg

1
@jwg นอกจากจะมีความสำคัญทางความคิดแล้วมันยังมีความสำคัญในทางปฏิบัติเพราะการใช้การประมาณเพื่อประมาณนั้นจำเป็นต้องติดตามความแม่นยำของการประมาณค่าทั้งสอง แต่ฉันต้องยอมรับว่าเมื่อการประมาณทั้งสองเป็นที่ยอมรับได้ดีวิธีการโดยรวมก็ดี
whuber

14

โซลูชันที่ 1:

สำหรับการกระจาย Poisson ,ดังนั้นถ้า , ซึ่งหมายความว่าคุณสามารถประมาณโดยการจำลองปัวซอง และการจำลองปัวซองนั้นสามารถได้มาจากเครื่องกำเนิดไฟฟ้าแบบเอกซ์โพเนนเชียล (ถ้าไม่ใช่ในลักษณะที่มีประสิทธิภาพที่สุด)P(λ)

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

หมายเหตุ 1:ตามที่กล่าวไว้ในความคิดเห็นนี่เป็นข้อโต้แย้งที่ค่อนข้างซับซ้อนเนื่องจากการจำลองจากการแจกแจงแบบปัวซงหรือการแจกแจงแบบเอ็กซ์โพเนนเชียลอาจเป็นการยากที่จะจินตนาการโดยไม่ต้องเกี่ยวข้องกับ ฟังก์ชันบันทึกหรือฟังก์ชันexp ... การช่วยเหลือคำตอบนี้ด้วยวิธีแก้ปัญหาที่หรูหราที่สุดจากเครื่องแบบที่สั่ง ซึ่งเป็นการประมาณอย่างไรก็ตามเนื่องจากการกระจายของระยะห่างสม่ำเสมอเป็นเบต้าซึ่งหมายความว่าซึ่งรวมเป็นเป็นU(i:n)U(i1:n)B(1,n)

P(n{U(i:n)U(i1:n)}1)=(11n)n
e1nเติบโตเป็นอินฟินิตี้ ในฐานะที่เป็นคนอื่นนอกเหนือจากที่ตอบความคิดเห็นฟอนนอยมันน์ของเครื่องกำเนิดเลขชี้กำลัง 2494 ของฟอนนอยมันน์ใช้แค่รุ่นที่เหมือนกันเท่านั้น

โซลูชันที่ 2:

อีกวิธีหนึ่งในการบรรลุถึงการเป็นตัวแทนของค่าคงที่ในฐานะอินทิกรัลคือต้องระลึกไว้ว่าเมื่อแล้วซึ่งก็คือการกระจายดังนั้น วิธีที่สองเพื่อประมาณโดย Monte Carlo จึงจะจำลองคู่ปกติและตรวจสอบความถี่ครั้งที่2 ในทางตรงกันข้ามมันเป็นสิ่งที่ตรงกันข้ามกับ Monte Carlo ประมาณเกี่ยวข้องกับความถี่ของเวลา ...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:

ฉันเพื่อนร่วมงานของมหาวิทยาลัย Warwick เมตร Pollock ชี้ให้เห็นอีกประมาณ Monte Carlo เรียกว่าวิธีการของไซท์ : ความคิดที่จะเรียกใช้ลำดับของคนรุ่นเครื่องแบบจนกว่า{n} ความคาดหวังของกฎการหยุดที่สอดคล้องกัน, , ซึ่งเป็นจำนวนครั้งที่ลำดับของเครื่องแบบลงไปคือในขณะที่ความน่าจะเป็นที่เป็นเลขคี่คือ ! ( วิธีของฟอร์ซิ ธมีจุดมุ่งหมายเพื่อจำลองจากความหนาแน่นของรูปแบบดังนั้นจึงเป็นเรื่องทั่วไปมากกว่าการประมาณค่าและ )u1,u2,...un+1>unNeNe1expG(x)ee1

นี่ค่อนข้างจะขนานกับแนวทางของ Gnedenko ที่ใช้ในคำตอบของ Aksakalดังนั้นฉันจึงสงสัยว่าจะได้มาจากที่อื่น อย่างน้อยที่สุดทั้งคู่มีการแจกแจงแบบเดียวกันกับมวลความน่าจะเป็นสำหรับค่าn1/n!n

การนำ R ไปใช้อย่างรวดเร็วของวิธีการของ Forsythe คือการไม่ปฏิบัติตามลำดับเครื่องแบบอย่างแม่นยำในบล็อกขนาดใหญ่ซึ่งช่วยให้สามารถประมวลผลแบบขนานได้อย่างแม่นยำ:

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 โดยไม่ทราบว่าจe
Glen_b

5
ถ้าผมโทร R rpoiss () กำเนิดผมสามารถหลอกผมไม่ทราบว่าจอย่างจริงจังมากขึ้นคุณสามารถสร้างชี้แจง variates [ใช้ฟังก์ชั่นมากกว่า ] จนกว่าผลรวมเกินและจำนวนผลลบหนึ่งเป็น Poisson(1) eE(1)loge1P(1)
ซีอาน

5
การคำนวณมีความสำคัญอย่างยิ่งต่อการคำนวณเนื่องจากเป็นสิ่งที่ตรงกันข้าม คุณสามารถหลีกเลี่ยงการคำนวณฟังก์ชันดังกล่าวได้หลายวิธี ต่อไปนี้เป็นวิธีแก้ไขปัญหาตามคำตอบแรกของคุณ: ใช้เฉพาะคณิตศาสตร์ระดับต้นเท่านั้น logexpn <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)
whuber

3
ฉันเชื่อว่าวิธีของ Forsythe นั้นเหมือนกับของ Gnedenko การเลือกเครื่องแบบเช่นนั้นน้อยกว่า 1 จะเหมือนกับการเลือกเล็กกว่าและถ้าเราประสบความสำเร็จมีการกระจายอย่างมีเงื่อนไขระหว่างและ 0xnnxixn1n1xi1nxi1n1xi
jwg

3
ฉันไม่ทราบวิธีการของ Forsythe อย่างไรก็ตามมันเชื่อมโยงกับสิ่งอื่นที่น่าสนใจมาก ถ้าแทนที่จะหยุดที่คุณสุ่มตัวอย่างต่อไปความคาดหวังของระยะทางจากถึงด้านล่างถัดไปคือ 3 อย่างแน่นอนnn+1n
Aksakal

7

ไม่ใช่วิธีการแก้ปัญหา ... เป็นเพียงความคิดเห็นด่วนที่ยาวเกินไปสำหรับช่องแสดงความคิดเห็น

Aksakal

Aksakal โพสต์วิธีแก้ปัญหาที่เราคำนวณจำนวนที่คาดหวังของภาพวาดชุดมาตรฐานที่ต้องดำเนินการเช่นผลรวมของพวกเขาจะเกิน 1 ในMathematicaสูตรแรกของฉันคือ

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

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

แก้ไข: เพิ่งเล่นอย่างรวดเร็วกับนี้และรหัสต่อไปนี้ (วิธีเดียวกัน - ใน Mma - รหัสที่แตกต่างกันเพียง) จะเร็วขึ้นประมาณ 10 เท่า:

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

ซีอาน / Whuber

Whuber แนะนำให้ใช้รหัสเย็นเร็วเพื่อจำลองวิธีแก้ปัญหาของ Xian 1:

รุ่น R: n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)

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

ซึ่งเขาบันทึกเร็วกว่าโค้ดแรก 20 เท่า (หรือเร็วกว่าโค้ดใหม่ด้านบนประมาณสองเท่า)

เพื่อความสนุกฉันคิดว่ามันน่าสนใจที่จะดูว่าทั้งสองวิธีนั้นมีประสิทธิภาพหรือไม่ (ในแง่สถิติ) ในการทำเช่นนั้นฉันสร้างการประมาณ 2,000 ครั้งโดยใช้:

  • วิธีการของ Aksakal: dataA
  • วิธีการของซีอาน 1 โดยใช้รหัส whuber: dataB

... ทั้งในMathematica แผนภาพต่อไปนี้เปรียบเทียบความหนาแน่นเคอร์เนลที่ไม่ใช่พารามิเตอร์ของชุดข้อมูล dataA และ dataB ที่เป็นผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นในขณะที่โค้ดของ whuber (เส้นโค้งสีแดง) นั้นเร็วเป็นสองเท่า แต่วิธีนี้ดูเหมือนจะไม่น่าเชื่อถือ


เส้นแนวตั้งที่ตำแหน่งของมูลค่าที่แท้จริงจะปรับปรุงภาพนี้อย่างมากมาย
Reinstate Monica

1
มันเป็นข้อสังเกตที่น่าสนใจมากขอบคุณ เนื่องจากความกว้างครึ่งหนึ่งจะเพิ่มขึ้นสองเท่าด้วยขนาดของการจำลองและวิธีการครึ่งความกว้างของซีอานนั้นประมาณสองเท่าของ Aksakal จากนั้นการทำงานสี่ครั้งเนื่องจากการทำซ้ำหลายครั้งจะทำให้พวกเขามีความแม่นยำเท่าเทียมกัน คำถามที่ว่าต้องใช้ความพยายามมากแค่ไหนในการทำซ้ำแต่ละครั้ง: หากการวนซ้ำหนึ่งครั้งของวิธีการของซีอานใช้เวลาน้อยกว่าหนึ่งในสี่ของความพยายามวิธีการนั้นจะยังคงมีประสิทธิภาพมากขึ้น
whuber

1
ผมเชื่อว่าสถานการณ์จะชัดเจนเมื่อคุณเปรียบเทียบตัวเลขของความเข้าใจของตัวแปรสุ่มจำเป็นต้องใช้ในวิธีการทั้งสองมากกว่าค่าเล็กน้อยจากnn
whuber

1
@whuber wrote: running four times as many iterations will make them equally accurate///// ..... เพียงแค่เล่นอย่างรวดเร็วกับสิ่งนี้: การเพิ่มจำนวนจุดตัวอย่างที่ใช้ใน Xian's Method 1 จากเป็น 6 x (เช่น 6 เท่าของจำนวน คะแนน) สร้างเส้นโค้งที่คล้ายกับอักษั 106106
wolfies

1
ทำได้ดีมากด้วยรหัส - มันจะเป็นการยากที่จะปรับปรุงให้ดีขึ้น
whuber

2

วิธีที่ต้องการปริมาณตัวอย่างที่ไม่ดี

ก่อนอื่นคุณต้องสามารถสุ่มตัวอย่างจากการแจกแจงแบบปกติ สมมติว่าคุณกำลังจะแยกการใช้ฟังก์ชันหรือค้นหาตารางที่ได้จากฟังก์ชันนั้นคุณสามารถสร้างตัวอย่างโดยประมาณจากการแจกแจงแบบปกติผ่าน CLT ตัวอย่างเช่นถ้าคุณจะได้ลิ้มลองจากเครื่องแบบ (0,1) กระจายแล้ว(0,1) ดังที่ได้กล่าวไว้โดย whuber เพื่อให้มีวิธีการประมาณค่าสุดท้ายเมื่อขนาดของกลุ่มตัวอย่างเข้าใกล้จะต้องมีจำนวนชุดตัวอย่างที่ใช้วิธีเมื่อขนาดของกลุ่มตัวอย่างเข้าใกล้อนันต์f(x)=exx¯12n˙N(0,1)e

ตอนนี้ถ้าคุณสามารถลิ้มลองจากการกระจายปกติกับกลุ่มตัวอย่างขนาดใหญ่พอที่คุณจะได้รับการประมาณการที่สอดคล้องกันของความหนาแน่นของ(0,1) สิ่งนี้สามารถทำได้ด้วยฮิสโทแกรมหรือเคอร์เนลที่ราบรื่น (แต่ระวังอย่าใช้เคอร์เนล Gaussian เพื่อทำตามกฏnoของคุณ!) เพื่อให้การประมาณการความหนาแน่นของคุณสอดคล้องกันคุณจะต้องให้ df ของคุณ (จำนวนของถังขยะในฮิสโตแกรมผกผันของหน้าต่างเพื่อความราบรื่น) เข้าใกล้อนันต์ แต่ช้ากว่าขนาดตัวอย่างN(0,1)ex

ดังนั้นตอนนี้ที่มีจำนวนมากของการใช้พลังงานในการคำนวณคุณสามารถใกล้เคียงกับความหนาแน่นของคือ(x) เนื่องจากประมาณการของคุณสำหรับปี่}N(0,1)ϕ^(x)ϕ((2))=(2π)1/2e1e=ϕ^(2)2π

หากคุณต้องการใช้ถั่วอย่างสมบูรณ์คุณสามารถประมาณและโดยใช้วิธีที่คุณกล่าวถึงก่อนหน้านี้22π

วิธีที่ต้องการตัวอย่างน้อยมาก แต่ก่อให้เกิดข้อผิดพลาดตัวเลขที่ไม่ดี

คำตอบที่โง่ แต่มีประสิทธิภาพมากโดยอิงจากความคิดเห็นที่ฉันทำ:

Let1) กำหนด. กำหนดy_n}Xuniform(1,1)Yn=|(x¯)n|e^=(1Yn)1/Yn

สิ่งนี้จะมาบรรจบกันอย่างรวดเร็ว แต่ยังพบข้อผิดพลาดทางตัวเลขที่รุนแรง

whuber ชี้ให้เห็นว่าสิ่งนี้ใช้ฟังก์ชั่นพลังงานซึ่งโดยปกติจะเรียกฟังก์ชั่นประสบการณ์ สิ่งนี้อาจถูกด้วยการเช่นเป็นจำนวนเต็มและพลังงานสามารถแทนที่ด้วยการคูณซ้ำ มันจะต้องเป็นที่ , discretizing ของจะได้รับปลีกย่อยและปลีกย่อยและไม่ต่อเนื่องจะมีการยกเว้น0 ด้วยสิ่งนี้ตัวประมาณตามหลักวิชา (เช่นโลกที่ไม่มีข้อผิดพลาดที่เป็นตัวเลข) จะมาบรรจบกันกับและเร็วมาก! 1 / Y n n →การY n Y n = 0 อีYn1/YnnYnYn=0e


2
วิธีการ CLT นั้นน้อยกว่าที่น่าพอใจเพราะในที่สุดคุณก็รู้ว่าค่าเหล่านี้ไม่ได้ถูกแจกจ่ายแบบปกติ แต่มีหลายวิธีในการสร้างตัวแปรปกติโดยไม่จำเป็นต้องมีหรือลอการิทึม: วิธี Box-Muller เป็นวิธีหนึ่ง แม้ว่าหนึ่งนั้นจะต้องใช้ฟังก์ชันตรีโกณมิติและ (ในระดับพื้นฐาน) เหล่านั้นจะเหมือนกับ exponentials e
whuber

1
@whuber: ฉันไม่ได้ใช้ Box-Muller เนื่องจากการบันทึกที่จำเป็นต้องเปลี่ยนโดยตรงเพื่อชี้แจงในหนังสือของฉัน ฉันจะอนุญาตให้สะท้อนคอสและบาปได้ แต่นั่นเป็นเพียงเพราะฉันลืมเรื่องการวิเคราะห์ที่ซับซ้อนไปสักครู่จุดที่ดีมาก
Cliff AB

1
อย่างไรก็ตามฉันจะโต้แย้งกับความคิดที่ว่าการประมาณปกติที่สร้างขึ้นเป็นจุดอ่อนของความคิดนี้ การประเมินความหนาแน่นลดลงแม้แต่น้อย! คุณสามารถคิดว่าแนวคิดของการมีสองพารามิเตอร์นี้:เครื่องแบบจำนวนที่ใช้ใน "ห้วงปกติ" และจำนวนปกติห้วงที่ใช้ประเมินความหนาแน่นที่{2}) ขณะที่ทั้งสองและวิธี , ประมาณการจะเข้าหาอีในความเป็นจริงผมมั่นใจมากอัตราการบรรจบกันจะมากขึ้น จำกัด โดยกว่า ; ความหนาแน่นแบบไม่อิงพารามิเตอร์มีอัตราการลู่เข้าที่ช้า! n 2 ϕ ( n1n2n1n2en2n1ϕ(2)n1n2en2n1
Cliff AB

2

นี่เป็นอีกวิธีหนึ่งที่สามารถทำได้แม้ว่าจะค่อนข้างช้า ฉันไม่อ้างสิทธิ์อย่างมีประสิทธิภาพ แต่เสนอทางเลือกนี้ด้วยจิตวิญญาณแห่งความสมบูรณ์

Contra ซีอานคำตอบของผมจะถือว่าสำหรับวัตถุประสงค์ของคำถามนี้ว่าคุณมีความสามารถที่จะสร้างและใช้ลำดับของตัวแปรสุ่มหลอกเครื่องแบบและคุณต้องประมาณค่าด้วยวิธีการบางอย่างโดยใช้การคำนวณทางคณิตศาสตร์ขั้นพื้นฐาน (เช่นคุณไม่สามารถใช้ฟังก์ชันลอการิทึมหรือเลขชี้กำลังหรือการแจกแจงใด ๆ ที่ใช้ฟังก์ชันเหล่านี้) วิธีการปัจจุบันนี้ได้รับแรงจูงใจจากผลลัพธ์ง่ายๆที่เกี่ยวข้องกับตัวแปรสุ่มแบบสม่ำเสมอ:U 1 , , U nIID U ( 0 , 1 ) e nU1,,UnIID U(0,1)e

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

การประมาณโดยใช้ผลลัพธ์นี้:eอันดับแรกเราสั่งตัวอย่างค่าลงในลำดับจากมากไปน้อยเพื่อรับสถิติการสั่งซื้อจากนั้นเราจะกำหนดผลรวมบางส่วน:u(1)u(n)

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

ตอนนี้ให้จากนั้นประมาณโดยการประมาณค่าของตัวแปรชุดคำสั่ง นี่เป็นตัวประมาณค่าสำหรับ โดย:1 / e emmin{k|S(k)1}1/ee

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

วิธีการนี้มีบางอคติเล็กน้อย (เนื่องจากการสอดแทรกเชิงเส้นของจุดตัดสำหรับ ) แต่มันก็เป็นประมาณการที่สอดคล้องกันสำหรับอีวิธีการที่สามารถดำเนินการได้ค่อนข้างง่าย แต่ต้องใช้การเรียงลำดับของค่าซึ่งเป็นคอมพิวเตอร์ที่เข้มข้นกว่าการคำนวณที่กำหนดของอีวิธีนี้ช้าเพราะมันเกี่ยวข้องกับการเรียงลำดับของค่าe e1/eee

การใช้งานใน R: วิธีนี้สามารถนำไปใช้ในการRใช้runifเพื่อสร้างค่าสม่ำเสมอ รหัสดังต่อไปนี้:

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

การใช้รหัสนี้จะให้การบรรจบกับมูลค่าที่แท้จริงของแต่มันช้ามากเมื่อเทียบกับวิธีการที่กำหนดไว้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ฉันใช้มุมมองที่เราต้องการหลีกเลี่ยงวิธีการที่ใช้ประโยชน์จากการแปลงใด ๆ ที่เกี่ยวข้องกับการชี้แจงหรือลอการิทึม หากเราสามารถใช้ความหนาแน่นที่ใช้เลขชี้กำลังในคำจำกัดความของพวกเขาแล้วมันเป็นไปได้ที่จะได้รับจากพีชคณิตเหล่านี้โดยใช้การเรียกความหนาแน่นe

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.