จำลองตัวแปร Bernoulli ด้วยความน่าจะโดยใช้เหรียญแบบเอนเอียง


9

มีคนบอกฉันได้ไหมว่าจะจำลองโดยที่โดยใช้การโยนเหรียญ (มากเท่าที่คุณต้องการ) ด้วย ?Bernoulli(ab)a,bNP(H)=p

ฉันกำลังคิดที่จะใช้การสุ่มตัวอย่างการปฏิเสธ แต่ไม่สามารถตอกตะปูลงได้


1
นี่เป็นคำถามจากหลักสูตรหรือตำราเรียนหรือไม่? ถ้าเป็นเช่นนั้นโปรดเพิ่ม[self-study]แท็กและอ่านของวิกิพีเดีย โปรดทราบว่าไม่จำเป็นต้องขอร้องให้ช่วยท้ายคำถามของคุณ - เรารู้ว่าทุกคนที่โพสต์ที่นี่หวังว่าจะได้รับความช่วยเหลือ!
Silverfish

1
มีการโพสต์ที่ยอดเยี่ยมโดย @Glen_b ที่นี่ที่ไหนสักแห่ง (แม้ว่าฉันจำไม่ได้ว่าอยู่ที่ไหน) เกี่ยวกับสาเหตุที่ไม่มีสิ่งเช่น "biased coin withน่าจะเป็น" แต่ฉันรู้ว่านี่เป็นเพียงปัญหาต่อพ่วงของคุณ! p
Silverfish

2
@dsaxton คำถามพูดว่า "มากที่สุดเท่าที่คุณต้องการ"; มันจะถูก จำกัด ด้วยความน่าจะเป็นที่ 1 แต่ไม่ จำกัด (คุณอาจมีจำนวนการโยนมากเกินไป) แต่การคัดค้านบนพื้นฐานนั้นจะเหมือนกับการพูดว่า "โยนเหรียญที่ยุติธรรมจนกว่าคุณจะได้รับหัว" ไม่ได้เป็นวิธีการสร้างเรขาคณิต (ตัวเลขสุ่ม12
Glen_b

1
@AbracaDabra นี่เป็นแบบฝึกหัดสำหรับชั้นเรียนหรือไม่? ถ้าไม่มันเกิดขึ้นได้อย่างไร?
Glen_b

1
@Glen_b: มันไม่ใช่แบบฝึกหัดจากชั้นเรียนของฉัน มันเกิดขึ้นกับฉันในสายโซ่แห่งความคิด ... : ตามความน่าจะเป็นแบบคลาสสิกใช้เหรียญที่ยุติธรรมเมื่อคุณเพิ่มจำนวนการโยนอัตราส่วนของมาเป็นครึ่ง ดังนั้นมันจะต้องเป็นจริงสำหรับคนที่เอนเอียงด้วย ... มันหมายถึงการได้เหรียญมาบรรจบกันเป็นจำนวนหนึ่งคุณต้องเป็นจำนวนนั้น ตอนนี้ฉันคิดว่าถ้าเราต้องการผลิตตัวเลข แต่เรามีเหรียญที่มีหมายเลขอื่น (รู้จักหรือไม่รู้จัก) #Heads#tailsP(H)P(H)
AbracaDabra

คำตอบ:


8

เพราะมีหลายโซลูชั่น uncountably ขอหาที่มีประสิทธิภาพอย่างใดอย่างหนึ่ง

คิดที่อยู่เบื้องหลังนี้เริ่มต้นด้วยวิธีการมาตรฐานที่จะใช้ตัวแปร Bernoulli: เปรียบเทียบเครื่องแบบตัวแปรสุ่มเพื่อพารามิเตอร์ B เมื่อกลับ ; มิฉะนั้นกลับ0Ua/bU<a/b10

เราสามารถใช้ -coin pเป็นเครื่องกำเนิดไฟฟ้าจำนวนสุ่มเครื่องแบบ หากต้องการสร้างหมายเลขอย่างสม่ำเสมอภายในช่วงเวลาใด ๆให้พลิกเหรียญ เมื่อเป็นส่วนหัวให้สร้างค่าสม่ำเสมอในช่วงแรกของช่วง; เมื่อมันก้อยให้สร้างซ้ำจากส่วนสุดท้ายของช่วงเวลา เมื่อถึงจุดหนึ่งช่วงเวลาเป้าหมายจะเล็กมากจนไม่สำคัญว่าคุณจะเลือกหมายเลขจากอะไร: นั่นคือวิธีที่การเรียกซ้ำเกิดขึ้น เห็นได้ชัดว่าขั้นตอนนี้จะสร้างชุดรูปแบบที่แตกต่างกัน (ขึ้นอยู่กับความแม่นยำที่ต้องการ) ซึ่งพิสูจน์ได้ง่ายจากการเหนี่ยวนำU[x,y)XpX1p

แนวคิดนี้ไม่มีประสิทธิภาพ แต่นำไปสู่วิธีการที่มีประสิทธิภาพ เนื่องจากในแต่ละขั้นตอนคุณจะต้องวาดตัวเลขจากช่วงเวลาที่กำหนดทำไมไม่ตรวจสอบก่อนว่าคุณต้องการวาดเลยหรือไม่? หากค่าเป้าหมายของคุณอยู่นอกช่วงเวลานี้คุณจะทราบผลการเปรียบเทียบระหว่างค่าสุ่มและเป้าหมายแล้ว ดังนั้นอัลกอริทึมนี้จึงมีแนวโน้มที่จะยุติอย่างรวดเร็ว (ซึ่งอาจตีความได้ว่าเป็นขั้นตอนการสุ่มตัวอย่างการปฏิเสธที่ร้องขอในคำถาม)[x,y)

เราสามารถเพิ่มประสิทธิภาพอัลกอริทึมนี้ต่อไป ในขั้นตอนใด ๆ เราจะมีสองเหรียญเราสามารถใช้: โดย relabeling เหรียญของเราที่เราสามารถทำให้มันกลายเป็นหนึ่งที่มีหัวมีโอกาส1-Pดังนั้นในฐานะ precomputation เราอาจเลือกการติดฉลากซ้ำซ้ำซึ่งจะนำไปสู่จำนวนการพลิกกลับที่ต่ำกว่าที่คาดไว้สำหรับการยกเลิก (การคำนวณนี้อาจเป็นขั้นตอนราคาแพง)1p

ตัวอย่างเช่นมันไม่มีประสิทธิภาพในการใช้เหรียญที่มีเพื่อเลียนแบบตัวแปรBernoulliโดยตรง: ใช้เวลาเกือบสิบพลิกโดยเฉลี่ย แต่ถ้าเราใช้เหรียญแล้วในเวลาเพียงสองพลิกเราจะแน่ใจว่าจะทำได้และจำนวนที่คาดหวังของการพลิกเป็นเพียง1.2p=0.9(0.01)p=10.0=0.11.2

นี่คือรายละเอียด

แบ่งพาร์ติชันช่วงครึ่งเวลาที่เปิดลงในช่วงเวลาI=[x,y)

[x,y)=[x,x+(yx)p)[x+(yx)p,y)=s(I,H)s(I,T).

สิ่งนี้จะกำหนดการแปลงสองและซึ่งทำงานในช่วงเวลาครึ่งเปิดs(,H)s(,T)

ตามคำศัพท์ถ้าเป็นชุดจำนวนจริงใด ๆ ให้แสดงออกI

t<I

หมายความว่าเป็นที่ถูกผูกไว้ที่ต่ำกว่าสำหรับ :สำหรับทุกฉัน ในทำนองเดียวกันหมายความว่าเป็นที่ถูกผูกไว้บนสำหรับฉันtIt<xxIt>ItI

เขียนT (อันที่จริงแล้วมันจะไม่สร้างความแตกต่างถ้าเป็นจริงแทนที่จะมีเหตุผล; เราต้องการเพียง )a/b=tt0t1

นี่คืออัลกอริทึมในการสร้างตัวแปรพร้อมพารามิเตอร์ Bernoulli ที่ต้องการ:Z

  1. ชุดและ[0,1)n=0In=I0=[0,1)

  2. ในขณะที่ {โยนเหรียญในการผลิต1} ตั้ง เพิ่มค่า .}(tIn)Xn+1In+1=S(In,Xn+1).n

  3. ถ้าจากนั้นตั้งค่า 1 มิฉะนั้นการตั้งค่า 0t>In+1Z=1Z=0


การดำเนินงาน

เพื่อแสดงให้เห็นที่นี่เป็นRการดำเนินงานของ alorithm drawเป็นฟังก์ชั่น อาร์กิวเมนต์เป็นค่าเป้าหมายและช่วงต้น[0,1)จะใช้ฟังก์ชั่นเสริมการดำเนินการของแม้ว่ามันไม่จำเป็นต้องมันยังติดตามจำนวนของการโยนเหรียญ มันจะส่งกลับตัวแปรสุ่มจำนวนของการโยนและช่วงเวลาสุดท้ายที่ตรวจสอบt[x,y)[0,1)ss

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ลองวาดค่าโดยใช้อัลกอริทึมรายงานค่าเฉลี่ย (และข้อผิดพลาดมาตรฐาน) และระบุจำนวนการโยนเฉลี่ยที่ใช้t=1/100p=0.910,000

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 ของนั้นไม่สำคัญ: การเบี่ยงเบนนี้สามารถนำมาประกอบกับโอกาสได้ จำนวนเฉลี่ยของการพลิกคือ - น้อยกว่าสิบเล็กน้อย หากเราใช้เหรียญค่าเฉลี่ยจะเป็นยังไม่แตกต่างจากเป้าหมายอย่างมีนัยสำคัญ แต่มีเพียงพลิกเท่านั้นที่จำเป็นต้องใช้โดยเฉลี่ย0.00950.010.51549.8861p0.00941.177


ฉันไม่สามารถช่วย แต่เห็นความคล้ายคลึงกันระหว่างโซลูชันนี้กับโซลูชัน 2 ในคำตอบของฉัน ในขณะที่ฉันถือว่าเหรียญที่ไม่เอนเอียง (PS แก้ปัญหาที่น่าสนใจสำหรับปัญหาเหรียญลำเอียง) และทำการคำนวณ / เปรียบเทียบทั้งหมดในฐาน 2 คุณทำการคำนวณ / เปรียบเทียบทั้งหมดในฐาน 10 คุณคิดอย่างไร?
Cam.Davidson.Pilon

1
@cam ฉันคิดว่าคุณอาจถูกหลอกโดยตัวอย่างของฉัน: แม้ว่าพวกเขาจะใช้ตัวเลขที่ดีในฐาน 10 การก่อสร้างไม่มีอะไรเกี่ยวข้องกับฐานใด ๆ ก็ตาม
whuber

2
(+1) ความละเอียดที่ประณีตมาก การเพิ่มประสิทธิภาพในการยืนบนและล่างวิ่งโดยอำนาจเช่นและ / หรือเมตร มันจะเป็นการดีที่จะหาขั้วที่ดีที่สุดในแง่ของจำนวนของ Bernoullis จำลอง a/bpn(1p)m(n+mm)pn(1p)m
ซีอาน

5

นี่เป็นวิธีแก้ปัญหา (บิตของความยุ่งเหยิง แต่มันเป็นทิ่มแรกของฉัน) จริงๆคุณสามารถละเลยและ WLOG ถือว่า1/2 ทำไม? มีอัลกอริทึมที่ชาญฉลาดในการสร้างการพลิกเหรียญที่ไม่เอนเอียงจากการโยนเหรียญแบบเอนเอียงสองครั้ง ดังนั้นเราจึงสามารถสันนิษฐานได้ว่า1/2P(H)=pP(H)=1/2P(H)=1/2

ในการสร้างฉันสามารถคิดถึงวิธีแก้ปัญหาสองข้อ (ข้อแรกไม่ใช่ของฉันเอง แต่ข้อที่สองคือลักษณะทั่วไป):Bernoulli(ab)

โซลูชันที่ 1

พลิกเหรียญเป็นกลางครั้ง หากหัวให้เริ่มต้นใหม่ หากหัวเป็นปัจจุบันกลับมาไม่ว่าจะเป็นเหรียญแรกคือหัวหรือไม่ (เพราะ )baaP(first coin is heads | a heads in b coins)=ab

โซลูชันที่ 2

นี้สามารถขยายไปยังค่าใด ๆ ของ(P) เขียนในรูปแบบไบนารี ตัวอย่างเช่นBernoulli(p)p0.1=0.0001100110011001100110011...base 2

เราจะสร้างเลขฐานสองใหม่โดยใช้การโยนเหรียญ เริ่มต้นด้วยและเพิ่มตัวเลขขึ้นอยู่กับว่าหัว (1) หรือก้อย (0) ปรากฏขึ้น ในแต่ละพลิกเปรียบเทียบเลขฐานใหม่ของคุณกับฐานเป็นตัวแทนของถึงหลักเดียวกัน ในที่สุดทั้งสองจะแตกต่างกันและกลับถ้ามากกว่าเลขฐานสองของคุณ0.p bin(p)

ใน 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 (ไม่เร็วอย่างไรก็ตาม)


คำตอบที่ดี แต่คุณสามารถอธิบายด้วยวิธีการของคุณ 1 วิธีการทำสำหรับ p ไม่มีเหตุผล?
AbracaDabra

2
@AracaDabra ทำไมเหตุผลของเรื่อง ? p
Glen_b

@AbracaDabra: สิ่งที่คุ้มค่าของน่าจะเป็นของการได้รับและจะเหมือนกันคือจึงน่าจะเป็นของการหนึ่งกับอีกคือ1/2p(0,1)(1,0)p(1p)1/2
ซีอาน

4

ฉันเห็นวิธีแก้ปัญหาง่าย ๆ แต่ไม่ต้องสงสัยเลยว่ามีหลายวิธีที่จะทำได้บางอย่างน่าจะง่ายกว่านี้ วิธีการนี้สามารถแบ่งออกเป็นสองขั้นตอน:

  1. การสร้างจากเหตุการณ์สองเหตุการณ์ที่มีความน่าจะเป็นเท่ากันให้ขั้นตอนการโยนเหรียญที่ไม่เป็นธรรม (การรวมกันของเหรียญเฉพาะและวิธีการที่มันถูกโยนสร้างหัวด้วยความน่าจะเป็น ) เราสามารถเรียกทั้งสองเหตุการณ์ที่เกิดขึ้นน่าจะเป็นอย่างเท่าเทียมกันและ * [มีวิธีการง่ายๆสำหรับสิ่งนี้ที่ต้องใช้การโยนคู่และเพื่อให้ได้ผลลัพธ์ที่น่าจะเป็นสองเท่าโดยมีผลลัพธ์อื่น ๆ ทั้งหมดที่นำไปสู่การสร้างคู่ใหม่ จำนวนม้วนเพื่อลองอีกครั้ง]pHTH=(H,T)T=(T,H)

  2. ตอนนี้คุณสร้างการเดินแบบสุ่มโดยมีสองสถานะการดูดซับโดยใช้เหรียญจำลองที่ยุติธรรม โดยการเลือกระยะทางของสถานะการดูดซับจากจุดกำเนิด (หนึ่งด้านบนและด้านล่างด้านล่าง) คุณสามารถตั้งค่าโอกาสในการดูดซับโดยพูดว่าสถานะการดูดซับส่วนบนเป็นอัตราส่วนที่ต้องการของจำนวนเต็ม หากคุณวางสิ่งกีดขวางการดูดซับส่วนบนไว้ที่และส่วนล่างที่ (และเริ่มต้นกระบวนการจากแหล่งกำเนิด) และใช้การเดินแบบสุ่มจนกระทั่งการดูดซับความน่าจะเป็นของการดูดซับที่กั้นส่วนบนคือ{ข}a(ba)aa+(ba)=ab

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

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