ความเชื่อเบื้องต้น

การวิเคราะห์ข้อมูลแบบเบย์เซียนด้วย Python

Michal Oleszak

Machine Learning Engineer

การกระจายแบบ prior

  • การกระจายแบบ prior สะท้อนสิ่งที่รู้เกี่ยวกับพารามิเตอร์ก่อนสังเกตข้อมูล:
    • ไม่รู้อะไรเลย   →   การกระจายแบบ uniform (ทุกค่ามีความน่าจะเป็นเท่ากัน)
    • posterior เดิม   →   สามารถอัปเดตด้วยข้อมูลใหม่ได้

 

  • เลือกการกระจายความน่าจะเป็นใดก็ได้เป็น prior เพื่อนำข้อมูลภายนอกเข้าสู่โมเดล:
    • ความเห็นของผู้เชี่ยวชาญ
    • ความรู้ทั่วไป
    • งานวิจัยก่อนหน้า
    • ความเชื่อส่วนตัว
การวิเคราะห์ข้อมูลแบบเบย์เซียนด้วย Python

ผลกระทบของ prior

กราฟความหนาแน่นสองเส้นซ้อนทับกัน เส้นหนึ่งแสดง prior distribution แบบ uniform อีกเส้นแสดง posterior distribution รูประฆังที่สูงกว่าเล็กน้อย

กราฟความหนาแน่นสองเส้นซ้อนทับกัน เส้นหนึ่งแสดง prior distribution แบบ uniform อีกเส้นแสดง posterior distribution รูประฆังที่สูงกว่าและเบ้ไปทางขวาเล็กน้อย

กราฟความหนาแน่นสองเส้นซ้อนทับกัน เส้นหนึ่งแสดง prior distribution แบบ uniform อีกเส้นแสดง posterior distribution รูประฆังที่สูงกว่ามาก

กราฟความหนาแน่นสองเส้นซ้อนทับกัน เส้นหนึ่งแสดง prior distribution แบบ uniform อีกเส้นแสดง posterior distribution รูประฆังที่สูงกว่ามากอย่างเห็นได้ชัด

การวิเคราะห์ข้อมูลแบบเบย์เซียนด้วย Python

การกระจายแบบ prior

  • เลือก prior distribution ก่อนที่จะเห็นข้อมูล
  • การเลือก prior ส่งผลต่อผลลัพธ์ของ posterior (โดยเฉพาะเมื่อข้อมูลมีน้อย)
  • เพื่อป้องกันการเลือกแบบลำเอียง การเลือก prior ควร:
    • ระบุให้ชัดเจน
    • อธิบายได้: อ้างอิงงานวิจัยก่อนหน้า สมมติฐานที่สมเหตุสมผล ความเห็นผู้เชี่ยวชาญ ฯลฯ
การวิเคราะห์ข้อมูลแบบเบย์เซียนด้วย Python

การเลือก prior ที่เหมาะสม

ความเชื่อเบื้องต้นของเรา: หัวมีโอกาสออกน้อยกว่า

กราฟความหนาแน่นรูประฆังที่เบ้ไปทางซ้าย มีจุดสูงสุดที่ประมาณ 0.25

บางตัวเลือกดีกว่าตัวอื่น!

 

กราฟความหนาแน่นรูประฆังที่เบ้ไปทางซ้าย มีจุดสูงสุดที่ประมาณ 0.25 และแคบกว่ากราฟก่อนหน้าเล็กน้อย

การวิเคราะห์ข้อมูลแบบเบย์เซียนด้วย Python

Conjugate priors

  • prior บางตัวเมื่อคูณกับ likelihood ที่เฉพาะเจาะจงจะให้ posterior ที่รู้จักกัน
  • เรียก prior เหล่านี้ว่า conjugate priors
  • ในกรณีของการโยนเหรียญ:
    • หากเลือก prior เป็น Beta(a, b)
    • posterior จะเป็น Beta(#หัว + a, #โยน - #หัว + b)
  • สามารถสุ่มตัวอย่างจาก posterior ได้โดยใช้ numpy
  • get_heads_prob() จากบทที่ 1:
    def get_heads_prob(tosses):
      num_heads = np.sum(tosses)
      # prior: Beta(1,1)
      return np.random.beta(num_heads + 1, len(tosses) - num_heads + 1, 1000)
    
การวิเคราะห์ข้อมูลแบบเบย์เซียนด้วย Python

สองวิธีในการหา posterior

การจำลอง

  • หาก posterior เป็นที่รู้จัก สามารถสุ่มตัวอย่างจากมันด้วย numpy:
    draws = np.random.beta(2, 4, 1000)
    
  • ผลลัพธ์: อาร์เรย์ของค่า posterior 1000 ค่า:
    array([0.05941031, ..., 0.70015975])
    
  • พล็อตกราฟได้ด้วย
    sns.kdeplot(draws)
    

การคำนวณ

  • หาก posterior ไม่เป็นที่รู้จัก สามารถคำนวณได้ด้วย grid approximation
  • ผลลัพธ์: ความน่าจะเป็นของ posterior สำหรับแต่ละจุดบนกริด:
           head_prob  posterior_prob
    0           0.00        0.009901
    1           0.01        0.003624
               ...           ...
    10199       0.99        0.003624
    10200       1.00        0.009901
    
  • พล็อตกราฟได้ด้วย
    sns.lineplot(df["head_prob"], df["posterior_prob"])
    
การวิเคราะห์ข้อมูลแบบเบย์เซียนด้วย Python

มาฝึกกันเถอะ!

การวิเคราะห์ข้อมูลแบบเบย์เซียนด้วย Python

Preparing Video For Download...