본문 바로가기
코드스테이츠 Ai Boostcamp

[통계학] Bayesian(베이즈 정리)

by mintee
728x90

More

  • n124 강의 노트에 못다한 그래프와 베이지안 신뢰구간, 베이지안 유도 과정 함수들 찾아보며 이해하기. (stats.bayes_mvs(coinflips, alpha = .95)/ BayesianOptimization( ) )

 

To-do

  • 우도 함수 개념 → 수리통계학 찾아보기
  • 가능도 함수 : 우리가 추정하고자 하는 세타(파라미터)에 대한 함수로 보는 방법. → 이후 최대우도추정법을 통하여 함수를 최대/최소로 만드는 세타(파라미터)값을 찾는다.
  • MLE → 수리통계학 찾아보기
  • 최대우도추정법 : 함수를 최대로 만드는 세타(파라미터)를 찾는 방법으로 로그를 씌워 미분을 한 후 0이 되는 지점(최대값)을 찾는 것으로 기억함.
  • 베이지안 → 윈벅을 통한 베이지안 통계학 찾아보기
  • 조건부 확률과 전확률법칙으로 유도한 베이지안 공식의 증명 과정이 렉쳐노트보다 쉽게 잘 나타나있음.
  • 학습목표 설명할 수 있게 공부하기. 

 


 

베이지안 추론 기존의 통계 방식과는 조금 다른,

사전의 지식을 이벤트에 반영하는 추론 방식 입니다.

이 강의 이후에 여러분이 기억해야할 핵심 키워드들은 아래와 같습니다 .

  • 조건부 확률 ( conditional probability)
  • 베이지안 추측의 사용 예시

베이지안 통계 개론 (Bayesian Inference)

🏆 학습 목표

  • 조건부 확률에 대해서 이해 할 수 있다.
  • 어떤 사건이 일어난 것을 조건으로 한 확률, 공식 : p(A|B) = p(AB) / p(B)
  • 베이지안 통계가 어떤 개념인지 이해 할 수 있다.
  • 통계적 추론에서 (주관적 견해를 바탕으로 한 추론 방법으로 구한)사전 확률로 사후 확률을 구하는 방법으로 여러번 시행을 반복하여 사후 확률의 정확도를 높여나간다.

[n124] Lecture Note 요약

  • 총 확률의 법칙

    : 다더하면 1

    • 공식:

    P(A)=∑nP(An)=1P(A) = \sum_n P(A_n) = 1

     

    • 예시) B가 일어난 상황에서의, A에 대한 확률 P(A)는?
    1. 두 변수가 연관이 있는 경우 → P(A|B) (: 조건부)
    1. 연관이 없는 경우 → P(A) * P(B) (:곱의 법칙)

     

     

    조건부 확률 (The Law of Conditional Probability)

    P(A∣B)=P(A∩B)P(B)P(A|B) = \frac{P(A \cap B)}{P(B)}

    p(B)를 양변에 곱하면,

    P(A∣B)P(B)=P(A∩B)P(A|B)P(B) = P(A \cap B)
    P(A∣B)=∑nP(A∩Bn)P(A|B) = \sum_n P(A \cap B_n)

    베이지안 이론 (Bayes Theorem)

    • 베이지안 공식

      이렇게 전확률의 공식을 중간에 이용해 합 공식까지 유도 가능한데 설명을 부족하니 렉쳐노트는 접어두자.

      (윈벅을 이용한 베이지안 통계학 56~60p가 엄청 잘 설명되어 있음.)

    [베이지안 공식 유도 과정]

    • 강의 노트
      P(A∣B)=P(A∩B)P(B)/P(B∣A)=P(B∩A)P(A)P(A|B) = {{P(A \cap B)} \over {P(B)}} /P(B|A) = {{P(B \cap A)} \over {P(A)}}

      Since

      P(A∩B)=P(B∩A),P(A \cap B) = P(B \cap A),

      A와B의 교집합이나 B와 A의 교집합은 같은 말이다.

      그러므로 위의 두 공식을 아래처럼 조건부 확률 공식처럼 만든 다음

      P(A∣B)P(B)=P(A∩B)P(A|B)P(B) = P(A \cap B)

      교집합 대신에 조건부 확률을 이용한 두 공식을 같다고 놓으면 아래의 베이지안 공식을 유도할 수 있다.

      P(A∣B)⋅P(B)=P(B∣A)⋅P(A)−>P(A∣B)=P(B∣A)P(A)P(B)P(A|B) \cdot P(B) = P(B|A) \cdot P(A) -> P(A|B) = \frac{P(B|A)P(A)}{P(B)}
      • p(A|B) → 사후 확률. (B라는 정보가 업데이트 된 이후의 사(이벤트)후 확률)
      • p(A) → 사전 확률. (B라는 정보가 업데이트 되기 전의 사전확률)
      • p(B|A) → likelihood(우도 함수)

     

     

    Warm-up 예시

    일때, 초콜릿을 준 여성이 나에게 호감이 있을 확률은

    p(A)=p(A∣B)⋅p(B)+p(A∣notB)⋅p(notB)p(A) = p(A | B) \cdot p(B)+ p(A | not B) \cdot p(not B) 이므로

    (A : 호감 여부 / B : 초콜릿을 받았는지 여부)

    •  
      직접 손계산

    💉 베이지안 테스트를 반복하여 사용 (repeated testing)

    다음은 Wikipedia로 부터의 예시입니다.

    가정 : 약물을 실제 사용 하는 경우 결과가 양성일 확률은 99%일때

    실제 분석을 위해, 전체 인구에서 0.5%(1/200) 만이 실제로 약물이 신체에 포함되어 있다고 가정해보도록 하겠습니다.

    단순히 생각하면, False positive를 제외한 99%라고 생각 할 수 있습니다만 우리는 이제 사전확률과 사후확률을 사용 할 수 있기 때문에 베이지안을 통해 검증해보도록 하겠습니다.

    다음 계산 결과에서,User는 실제 약물이 발견 되는 사람, + 는 양성반응입니다.

    즉, 오직 33.2% 정도 만이 양성반응이 나왔다고 해도 실제로 약물을 포함 하는 경우입니다.

    실제 계산

    • TPR : True Positive Rate (= 민감도, true accept rate) 1인 케이스에 대해 1로 잘 예측한 비율.(암환자를 암이라고 진단 함)
    • FPR : False Positive Rate (= 1-특이도, false accept rate) 0인 케이스에 대해 1로 잘못 예측한 비율.(암환자가 아닌데 암이라고 진단 함)

    이전 계산의 사후확률을 새로운 계산의 사전확률로 사용한다

    • 파이썬 코드
      # 베이지안 계산을 위해서는 4개의 변수가 필요합니다.
      p_pos_used = 0.99 # True positive rate (TPR, Sensitivity)
      p_used = 0.005 # prior probability
      p_pos_not_used = 0.01 # False positive rate (FPR)
      p_not_used = 1 - p_used # 1 - p_used  
      
      numerator = p_pos_used * p_used 
      
      denominator = (p_pos_used * p_used) + (p_pos_not_used * p_not_used)
      
      posterior_probability = numerator / denominator
      
      posterior_probability

      Out[1]:

      0.33221476510067116

      In [2]:

      # 앞에서 나온 사후 확률을 다시 사전 확률로 반복 실행
      p_pos_used = 0.99 # TPR
      p_used = 0.332 # prior probability
      p_pos_not_used = 0.01 # FPR
      p_not_used = 1 - p_used # 1 - p_used  
      
      numerator = p_pos_used * p_used 
      
      denominator = (p_pos_used * p_used) + (p_pos_not_used * p_not_used)
      
      posterior_probability = numerator / denominator
      
      posterior_probability

      Out[2]:

      0.980081106870229

      In [3]:

      p_pos_used = 0.99 # TPR 
      p_used = 0.98008 # prior probability
      p_pos_not_used = 0.01 # FPR
      p_not_used = 1 - p_used # 1 - p_used  
      
      numerator = p_pos_used * p_used 
      
      denominator = (p_pos_used * p_used) + (p_pos_not_used * p_not_used)
      
      posterior_probability = numerator / denominator
      
      posterior_probability #99.979%
      
      # p_value = 1 - posterior_probability

      Out[3]:

      0.9997947404084419

    → 반복 할 수록 사전 확률과 비슷해짐을 확인.

     

    몬티홀 with 베이지안

    • 몬티홀

      처음에 문 3개 중 1번 문을 선택했다고 가정.

      H : 1번 문 뒤에 자동차가 있음.

      E : 진행자가 염소가 있는 문을 1개 열어줌

       

     

    이러한 이유로 인해 실제 상황에서는 여러번 반복해서 실험을 합니다.

    만약 2번을 반복 해서 모두 양성이 나오는 경우, 3번을 반복하는 경우... 에 따라서, 양성반응이 실제 약물로 부터 나온 결과일 확률은 매우 높아집니다.

    몬티홀 with 베이지안

     

    Applications

     

     

     

     

     

     

     

     

     

  • 과제 1번
    • 1. Multiple Choice Test

      객관식 문제를 푸는 과정에서, 학생은 답을 이미 알고 있거나 찍어야 합니다.

      학생이 답을 알 확률은 𝑝이고, 답을 찍어서 맞출 확률이 1𝑚 이라고 할 때 𝑚과 𝑝를 입력받아 학생이 문제의 답을 알고 맞췄을 확률을 계산하는 함수를 작성하세요.


      문제에 따르면

      A:답을맞춤<−>Ac:답을틀림A : 답을 맞춤 <-> A^c : 답을 틀림
      B:답을알다↔Bc:답을모른다(찍는다)B : 답을 알다 ↔ B^c : 답을 모른다(찍는다)

      라고 정의 했을 때, 문제에 주어진 정보에 따르면

      P(답을알다)=P(B)=pP(답을 알다) = P(B) = p
      P(답을찍어서맞춤)=P(맞춤∣모른다)=P(A∣Bc)=1mP(답을 찍어서 맞춤) = P(맞춤 | 모른다) = P(A|B^c) = \frac{1}{m}

      이고 문제에서 구하고자 하는 바는

      P(맞춤∣알다)=P(A∣B)=P(B∣A)∗P(A)P(B)=P(B∣A)∗P(A)P(B∣A)∗P(A)+P(B∣AC)∗P(Ac)P(맞춤 | 알다) = P(A|B) = \frac{P(B|A)*P(A)}{P(B)} \\ = \frac{P(B|A)*P(A)}{P(B|A)*P(A) + P(B|A^C)*P(A^c)}

      입니다.

      1. 그런데 레퍼런스 파일에 따르면 왜 답을 맞출 확률p(A)를 p라고 두는 건가요?
      1. 그리고 왜 답을 알 확률을 p라고 정의 해 놓고 분모에 풀어서 계산하나요..?
      1. P(B|A)를 1이라고 쳐도 답을 찍어서 맞출 확률이었던 1/m이 P(B|A^c)와 같은 확률이 되는 것이 이해되지 않습니다. 자세한 설명 부탁드립니다.

       

       
      https://github.com/codestates/help-desk-ds/issues/692

       

      # 학생이 문제의 답을 알고-> 맞췄을 확률을 구하는 함수
      def correct(p, m):
          p_corr = 1 / 5 # 사전확률 :  맞출 확률
         # p_uncorr = 4 / 5# 1 - 사전확률
          denominator = p # 답을 알 확률
          tpr = 1 - (1/m) # 맞추고 보니 알 확률
      
          numerator = tpr * p_corr
          posterior_p = numerator / denominator
      
          return posterior_p
      
        # 코드를 작성하세요

       

728x90

댓글