มีคนบอกฉันได้ไหมว่าจะจำลองโดยที่โดยใช้การโยนเหรียญ (มากเท่าที่คุณต้องการ) ด้วย ?
ฉันกำลังคิดที่จะใช้การสุ่มตัวอย่างการปฏิเสธ แต่ไม่สามารถตอกตะปูลงได้
มีคนบอกฉันได้ไหมว่าจะจำลองโดยที่โดยใช้การโยนเหรียญ (มากเท่าที่คุณต้องการ) ด้วย ?
ฉันกำลังคิดที่จะใช้การสุ่มตัวอย่างการปฏิเสธ แต่ไม่สามารถตอกตะปูลงได้
คำตอบ:
เพราะมีหลายโซลูชั่น uncountably ขอหาที่มีประสิทธิภาพอย่างใดอย่างหนึ่ง
คิดที่อยู่เบื้องหลังนี้เริ่มต้นด้วยวิธีการมาตรฐานที่จะใช้ตัวแปร Bernoulli: เปรียบเทียบเครื่องแบบตัวแปรสุ่มเพื่อพารามิเตอร์ B เมื่อกลับ ; มิฉะนั้นกลับ0
เราสามารถใช้ -coin เป็นเครื่องกำเนิดไฟฟ้าจำนวนสุ่มเครื่องแบบ หากต้องการสร้างหมายเลขอย่างสม่ำเสมอภายในช่วงเวลาใด ๆให้พลิกเหรียญ เมื่อเป็นส่วนหัวให้สร้างค่าสม่ำเสมอในช่วงแรกของช่วง; เมื่อมันก้อยให้สร้างซ้ำจากส่วนสุดท้ายของช่วงเวลา เมื่อถึงจุดหนึ่งช่วงเวลาเป้าหมายจะเล็กมากจนไม่สำคัญว่าคุณจะเลือกหมายเลขจากอะไร: นั่นคือวิธีที่การเรียกซ้ำเกิดขึ้น เห็นได้ชัดว่าขั้นตอนนี้จะสร้างชุดรูปแบบที่แตกต่างกัน (ขึ้นอยู่กับความแม่นยำที่ต้องการ) ซึ่งพิสูจน์ได้ง่ายจากการเหนี่ยวนำ
แนวคิดนี้ไม่มีประสิทธิภาพ แต่นำไปสู่วิธีการที่มีประสิทธิภาพ เนื่องจากในแต่ละขั้นตอนคุณจะต้องวาดตัวเลขจากช่วงเวลาที่กำหนดทำไมไม่ตรวจสอบก่อนว่าคุณต้องการวาดเลยหรือไม่? หากค่าเป้าหมายของคุณอยู่นอกช่วงเวลานี้คุณจะทราบผลการเปรียบเทียบระหว่างค่าสุ่มและเป้าหมายแล้ว ดังนั้นอัลกอริทึมนี้จึงมีแนวโน้มที่จะยุติอย่างรวดเร็ว (ซึ่งอาจตีความได้ว่าเป็นขั้นตอนการสุ่มตัวอย่างการปฏิเสธที่ร้องขอในคำถาม)
เราสามารถเพิ่มประสิทธิภาพอัลกอริทึมนี้ต่อไป ในขั้นตอนใด ๆ เราจะมีสองเหรียญเราสามารถใช้: โดย relabeling เหรียญของเราที่เราสามารถทำให้มันกลายเป็นหนึ่งที่มีหัวมีโอกาส1-Pดังนั้นในฐานะ precomputation เราอาจเลือกการติดฉลากซ้ำซ้ำซึ่งจะนำไปสู่จำนวนการพลิกกลับที่ต่ำกว่าที่คาดไว้สำหรับการยกเลิก (การคำนวณนี้อาจเป็นขั้นตอนราคาแพง)
ตัวอย่างเช่นมันไม่มีประสิทธิภาพในการใช้เหรียญที่มีเพื่อเลียนแบบตัวแปรBernoulliโดยตรง: ใช้เวลาเกือบสิบพลิกโดยเฉลี่ย แต่ถ้าเราใช้เหรียญแล้วในเวลาเพียงสองพลิกเราจะแน่ใจว่าจะทำได้และจำนวนที่คาดหวังของการพลิกเป็นเพียง1.2
นี่คือรายละเอียด
แบ่งพาร์ติชันช่วงครึ่งเวลาที่เปิดลงในช่วงเวลา
สิ่งนี้จะกำหนดการแปลงสองและซึ่งทำงานในช่วงเวลาครึ่งเปิด
ตามคำศัพท์ถ้าเป็นชุดจำนวนจริงใด ๆ ให้แสดงออก
หมายความว่าเป็นที่ถูกผูกไว้ที่ต่ำกว่าสำหรับ :สำหรับทุกฉัน ในทำนองเดียวกันหมายความว่าเป็นที่ถูกผูกไว้บนสำหรับฉัน
เขียนT (อันที่จริงแล้วมันจะไม่สร้างความแตกต่างถ้าเป็นจริงแทนที่จะมีเหตุผล; เราต้องการเพียง )
นี่คืออัลกอริทึมในการสร้างตัวแปรพร้อมพารามิเตอร์ Bernoulli ที่ต้องการ:
ชุดและ[0,1)
ในขณะที่ {โยนเหรียญในการผลิต1} ตั้ง เพิ่มค่า .}
ถ้าจากนั้นตั้งค่า 1 มิฉะนั้นการตั้งค่า 0
เพื่อแสดงให้เห็นที่นี่เป็นR
การดำเนินงานของ alorithm draw
เป็นฟังก์ชั่น อาร์กิวเมนต์เป็นค่าเป้าหมายและช่วงต้น[0,1)จะใช้ฟังก์ชั่นเสริมการดำเนินการของแม้ว่ามันไม่จำเป็นต้องมันยังติดตามจำนวนของการโยนเหรียญ มันจะส่งกลับตัวแปรสุ่มจำนวนของการโยนและช่วงเวลาสุดท้ายที่ตรวจสอบs
s <- function(x, ab, p) {
d <- diff(ab) * p
if (x == 1) c(ab[1], ab[1] + d) else c(ab[1] + d, ab[2])
}
draw <- function(target, p) {
between <- function(z, ab) prod(z - ab) <= 0
ab <- c(0,1)
n <- 0
while(between(target, ab)) {
n <- n+1; ab <- s(runif(1) < p, ab, p)
}
return(c(target > ab[2], n, ab))
}
เป็นตัวอย่างของการใช้งานและการทดสอบความถูกต้องของการใช้กรณีและpลองวาดค่าโดยใช้อัลกอริทึมรายงานค่าเฉลี่ย (และข้อผิดพลาดมาตรฐาน) และระบุจำนวนการโยนเฉลี่ยที่ใช้
target <- 0.01
p <- 0.9
set.seed(17)
sim <- replicate(1e4, draw(target, p))
(m <- mean(sim[1, ])) # The mean
(m - target) / (sd(sim[1, ]) / sqrt(ncol(sim))) # A Z-score to compare to `target`
mean(sim[2, ]) # Average number of flips
ในการจำลองนี้ของการพลิกเป็นหัว แม้ว่าจะต่ำกว่าเป้าหมายที่แต่คะแนน Z ของนั้นไม่สำคัญ: การเบี่ยงเบนนี้สามารถนำมาประกอบกับโอกาสได้ จำนวนเฉลี่ยของการพลิกคือ - น้อยกว่าสิบเล็กน้อย หากเราใช้เหรียญค่าเฉลี่ยจะเป็นยังไม่แตกต่างจากเป้าหมายอย่างมีนัยสำคัญ แต่มีเพียงพลิกเท่านั้นที่จำเป็นต้องใช้โดยเฉลี่ย
นี่เป็นวิธีแก้ปัญหา (บิตของความยุ่งเหยิง แต่มันเป็นทิ่มแรกของฉัน) จริงๆคุณสามารถละเลยและ WLOG ถือว่า1/2 ทำไม? มีอัลกอริทึมที่ชาญฉลาดในการสร้างการพลิกเหรียญที่ไม่เอนเอียงจากการโยนเหรียญแบบเอนเอียงสองครั้ง ดังนั้นเราจึงสามารถสันนิษฐานได้ว่า1/2
ในการสร้างฉันสามารถคิดถึงวิธีแก้ปัญหาสองข้อ (ข้อแรกไม่ใช่ของฉันเอง แต่ข้อที่สองคือลักษณะทั่วไป):
พลิกเหรียญเป็นกลางครั้ง หากหัวให้เริ่มต้นใหม่ หากหัวเป็นปัจจุบันกลับมาไม่ว่าจะเป็นเหรียญแรกคือหัวหรือไม่ (เพราะ )
นี้สามารถขยายไปยังค่าใด ๆ ของ(P) เขียนในรูปแบบไบนารี ตัวอย่างเช่น
เราจะสร้างเลขฐานสองใหม่โดยใช้การโยนเหรียญ เริ่มต้นด้วยและเพิ่มตัวเลขขึ้นอยู่กับว่าหัว (1) หรือก้อย (0) ปรากฏขึ้น ในแต่ละพลิกเปรียบเทียบเลขฐานใหม่ของคุณกับฐานเป็นตัวแทนของถึงหลักเดียวกัน ในที่สุดทั้งสองจะแตกต่างกันและกลับถ้ามากกว่าเลขฐานสองของคุณ
ใน Python:
def simulate(p):
binary_p = float_to_binary(p)
binary_string = '0.'
index = 3
while True:
binary_string += '0' if random.random() < 0.5 else '1'
if binary_string != binary_p[:index]:
return binary_string < binary_p[:index]
index += 1
หลักฐานบางอย่าง:
np.mean([simulate(0.4) for i in range(10000)])
ประมาณ 0.4 (ไม่เร็วอย่างไรก็ตาม)
ฉันเห็นวิธีแก้ปัญหาง่าย ๆ แต่ไม่ต้องสงสัยเลยว่ามีหลายวิธีที่จะทำได้บางอย่างน่าจะง่ายกว่านี้ วิธีการนี้สามารถแบ่งออกเป็นสองขั้นตอน:
การสร้างจากเหตุการณ์สองเหตุการณ์ที่มีความน่าจะเป็นเท่ากันให้ขั้นตอนการโยนเหรียญที่ไม่เป็นธรรม (การรวมกันของเหรียญเฉพาะและวิธีการที่มันถูกโยนสร้างหัวด้วยความน่าจะเป็น ) เราสามารถเรียกทั้งสองเหตุการณ์ที่เกิดขึ้นน่าจะเป็นอย่างเท่าเทียมกันและ * [มีวิธีการง่ายๆสำหรับสิ่งนี้ที่ต้องใช้การโยนคู่และเพื่อให้ได้ผลลัพธ์ที่น่าจะเป็นสองเท่าโดยมีผลลัพธ์อื่น ๆ ทั้งหมดที่นำไปสู่การสร้างคู่ใหม่ จำนวนม้วนเพื่อลองอีกครั้ง]
ตอนนี้คุณสร้างการเดินแบบสุ่มโดยมีสองสถานะการดูดซับโดยใช้เหรียญจำลองที่ยุติธรรม โดยการเลือกระยะทางของสถานะการดูดซับจากจุดกำเนิด (หนึ่งด้านบนและด้านล่างด้านล่าง) คุณสามารถตั้งค่าโอกาสในการดูดซับโดยพูดว่าสถานะการดูดซับส่วนบนเป็นอัตราส่วนที่ต้องการของจำนวนเต็ม หากคุณวางสิ่งกีดขวางการดูดซับส่วนบนไว้ที่และส่วนล่างที่ (และเริ่มต้นกระบวนการจากแหล่งกำเนิด) และใช้การเดินแบบสุ่มจนกระทั่งการดูดซับความน่าจะเป็นของการดูดซับที่กั้นส่วนบนคือ{ข}
(มีการคำนวณที่ต้องทำที่นี่เพื่อแสดงให้เห็น แต่คุณสามารถทำให้ความน่าจะเป็นได้ง่ายขึ้นด้วยการทำงานกับความสัมพันธ์ที่เกิดซ้ำ ... หรือคุณสามารถทำได้โดยการสรุปซีรีส์ที่ไม่มีที่สิ้นสุด ... หรือมีวิธีอื่น ๆ )
[self-study]
แท็กและอ่านของวิกิพีเดีย โปรดทราบว่าไม่จำเป็นต้องขอร้องให้ช่วยท้ายคำถามของคุณ - เรารู้ว่าทุกคนที่โพสต์ที่นี่หวังว่าจะได้รับความช่วยเหลือ!