비버놀로지

[나이브 베이즈 분류] 나이브 베이즈 분류기 본문

인공지능 머신러닝

[나이브 베이즈 분류] 나이브 베이즈 분류기

KUNDUZ 2022. 11. 3. 09:26
반응형

나이브 베이즈 분류기

나이브 베이즈 분류기를 직접 구현해 보겠습니다. 두 개의 사탕 기계를 살펴보겠습니다.

  • 첫 번째 기계 M1M_1 : {θred=0.7,θgreen=0.2,θblue=0.1}
  • 두 번째 기계 M2M_2 : {θred=0.3,θgreen=0.4,θblue=0.3}

두 기계에서 사탕을 뽑을 확률은 다음과 같습니다.

  • p(M1)=0.7
  • p(M2)=0.3

다음과 같이 10개의 사탕을 뽑았을 때 이 사탕들이 몇 번째 기계에서 나왔을지 확률로 표현해보는 코드를 작성해보겠습니다.

  • red - 4
  • green - 3
  • blue - 3

이 확률은 p(Mk∣x), k∈{1,2} 로 나타낼 수 있습니다. 나이브 법칙을 적용하면

가 됩니다. 이때 두 기계의 p(x) 는 같으므로 무시하겠습니다.

p(M1)  p(M2) 의 상대적인 확률은 다음과 같습니다.

p(M1x)p(M1)p(xM1)



=1.345×106

p(M2x)p(M2)p(xM2)

=0.3×(0.34×0.43×0.33)

 

=4.199×106

 

두 번째 기계에서 뽑혔을 확률이 훨씬 더 높은 것을 알 수 있습니다. 두 확률을 표준화(Normalize)하면 다음과 같습니다.

(1.345×10−6,4.199×10−6)

→(0.243,0.757)

즉 나이브 베이즈 분류기를 사용했을 때 10개의 사탕이 두번째 기계에서 뽑혔을 확률은 75.7%입니다.

 

실습

위의 설명을 읽고, naive_bayes() 함수를 직접 구현해보세요.

이 함수는 두 개의 원소로 이루어진 리스트 하나를 출력합니다. 첫번째 원소는 P(M1∣test), 두 번째 숫자는 P(M2∣test)의 표준화된 값입니다. 즉, 두 값을 합은 1이 되어야 합니다.

 

 

import re
import math
import numpy as np

def main():
    M1 = {'r': 0.7, 'g': 0.2, 'b': 0.1} # M1 기계의 사탕 비율
    M2 = {'r': 0.3, 'g': 0.4, 'b': 0.3} # M2 기계의 사탕 비율
    
    test = {'r': 4, 'g': 3, 'b': 3}

    print(naive_bayes(M1, M2, test, 0.7, 0.3))

def naive_bayes(M1, M2, test, M1_prior, M2_prior):
    R1 = M1['r']**test['r']*M1['g']**test['g']*M1['b']**test['b']*M1_prior
    R2 = M2['r']**test['r']*M2['g']**test['g']*M2['b']**test['b']*M2_prior
    
    R1,R2 = R1/(R1+R2), R2/(R1+R2)
    
    return [R1,R2]
    
if __name__ == "__main__":
    main()

 

반응형
Comments