คำถามของฉันเป็นแรงบันดาลใจR 's rexp()
ในตัวเครื่องกำเนิดไฟฟ้าจำนวนสุ่มชี้แจงฟังก์ชั่น เมื่อพยายามที่จะสร้างการกระจายชี้แจงตัวเลขสุ่มตำราหลายแนะนำผกผันเปลี่ยนวิธีการตามที่ระบุไว้ในหน้านี้วิกิพีเดีย ฉันรู้ว่ามีวิธีการอื่นเพื่อให้งานนี้สำเร็จ โดยเฉพาะอย่างยิ่งR 's รหัสที่มาใช้วิธีการที่ระบุไว้ในกระดาษโดย Ahrens & หิวโหย (1972)
ฉันมั่นใจว่าวิธี Ahrens-Dieter (AD) นั้นถูกต้อง ยังฉันไม่เห็นประโยชน์ของการใช้วิธีการของพวกเขาเมื่อเทียบกับวิธีการแปลงผกผัน (IT) โฆษณาไม่เพียง แต่ซับซ้อนในการติดตั้งมากกว่าไอที ดูเหมือนจะไม่ได้รับประโยชน์ความเร็วอย่างใดอย่างหนึ่ง นี่คือรหัสRของฉันที่จะเปรียบเทียบทั้งสองวิธีแล้วตามด้วยผลลัพธ์
invTrans <- function(n)
-log(runif(n))
print("For the inverse transform:")
print(system.time(invTrans(1e8)))
print("For the Ahrens-Dieter algorithm:")
print(system.time(rexp(1e8)))
ผล:
[1] "For the inverse transform:"
user system elapsed
4.227 0.266 4.597
[1] "For the Ahrens-Dieter algorithm:"
user system elapsed
4.919 0.265 5.213
การเปรียบเทียบโค้ดสำหรับสองวิธีนั้น AD จะสุ่มตัวเลขสุ่มอย่างน้อยสองชุด (พร้อมฟังก์ชันCunif_rand()
) เพื่อรับหมายเลขสุ่มเอ็กซ์โพเนนเชียลหนึ่งหมายเลข มันต้องการตัวเลขสุ่มที่เหมือนกันเพียงชุดเดียวเท่านั้น สันนิษฐานว่าทีมR core ตัดสินใจที่จะไม่ใช้ IT เพราะมันคิดว่าการลอการิทึมอาจช้ากว่าการสร้างตัวเลขสุ่มที่สม่ำเสมอกว่า ฉันเข้าใจว่าความเร็วในการถ่ายลอการิทึมนั้นขึ้นอยู่กับเครื่องจักร แต่อย่างน้อยสำหรับฉันตรงกันข้ามก็เป็นจริง บางทีอาจมีปัญหาเกี่ยวกับความแม่นยำเชิงตัวเลขของ IT เกี่ยวกับความเป็นเอกฐานของลอการิทึมที่ 0? แต่แล้ว
ซอร์สโค้ดR sexp.cเผยให้เห็นว่าการดำเนินการโฆษณายังสูญเสียความแม่นยำตัวเลขเพราะบางส่วนต่อไปนี้รหัส C เอาบิตชั้นนำจากเครื่องแบบจำนวนสุ่มยู
double u = unif_rand();
while(u <= 0. || u >= 1.) u = unif_rand();
for (;;) {
u += u;
if (u > 1.)
break;
a += q[0];
}
u -= 1.;
ยูรีไซเคิลต่อมาเป็นจำนวนสุ่มเครื่องแบบในส่วนที่เหลือของsexp.c จนถึงตอนนี้ดูเหมือนว่า
- รหัสนั้นง่ายกว่า
- มันเร็วกว่าและ
- ทั้ง IT และ AD อาจสูญเสียความแม่นยำเชิงตัวเลข
ผมจะขอบคุณถ้ามีคนสามารถอธิบายได้ว่าทำไม R rexp()
ยังคงดำเนินการโฆษณาเป็นตัวเลือกที่ใช้ได้เฉพาะ
rexp(n)
จะเป็นคอขวดความแตกต่างของความเร็วไม่ใช่ข้อโต้แย้งที่แข็งแกร่งสำหรับการเปลี่ยนแปลง (อย่างน้อยสำหรับฉัน) ฉันอาจกังวลเกี่ยวกับความแม่นยำของตัวเลขมากขึ้นถึงแม้ว่ามันจะไม่ชัดเจนสำหรับฉัน แต่อย่างใด