#!/usr/bin/env python # coding: utf-8 # ## Naive Bayes Probability Model # # 참고: [데이타 사이언스 스쿨 노트북](https://www.datascienceschool.net/view-notebook/c19b48e3c7b048668f2bb0a113bd25f7/#다항-분포-나이브-베이즈-모형) # In[1]: import numpy as np np.random.seed(0) X = np.random.randint(2, size=(10, 4)) y = np.array([0,0,0,0,1,1,1,1,1,1]) # In[2]: X # In[3]: y # # 다항 분포 나이브 베이즈 # In[4]: from sklearn.naive_bayes import MultinomialNB clf = MultinomialNB().fit(X, y) # In[5]: clf.class_count_ # In[6]: clf.intercept_ # In[7]: clf.class_log_prior_ # In[8]: fc = clf.feature_count_ fc # In[9]: clf.feature_log_prob_ # In[10]: clf.coef_ # In[11]: # 각 y class의 X elements 합, axis는 값을 합산하는 축 # axis=None(default): elements 전체 합 # axis=0: y 축 기준 합 fc.sum(axis=0) # In[12]: # axis=1: x 축 기준 합 fc.sum(axis=1) # In[13]: # newaxis는 길이 1의 새로운 축 생성. None과 동일하다. fc.sum(axis=1)[:, np.newaxis] # In[14]: # x 축 기준 합을 반복 축 따라(axis=1) 4회 반복. denominator = np.repeat(fc.sum(axis=1)[:, np.newaxis], 4, axis=1) denominator # In[15]: fc / denominator # In[16]: # 라플라스 스무딩 clf.alpha # In[17]: np.log((fc + clf.alpha) / (denominator + clf.alpha * X.shape[1])) # In[18]: clf.feature_log_prob_ # In[19]: x_new = np.array([1,1,0,0]) clf.predict_proba([x_new]) # In[20]: log_p = clf.class_log_prior_ + np.sum(clf.feature_log_prob_ * x_new, axis=1) log_p # In[21]: np.exp(log_p) / np.sum(np.exp(log_p)) # # 베르누이 나이브 베이즈 # In[22]: from sklearn.naive_bayes import BernoulliNB clf_bern = BernoulliNB().fit(X, y) # In[23]: clf_bern.feature_log_prob_ # In[24]: # 베르누이 `feature_log_prob_` 계산 np.log((clf_bern.feature_count_ + 1) / \ (clf_bern.class_count_.reshape(-1, 1) + 2)) # In[25]: clf_bern.predict_proba([x_new]) # In[26]: neg_prob = np.log(1 - np.exp(clf_bern.feature_log_prob_)) neg_prob # In[27]: clf_bern.feature_log_prob_ * x_new # In[28]: neg_prob * (1 - x_new) # In[29]: log_p_bern = clf_bern.class_log_prior_ + \ np.sum(clf_bern.feature_log_prob_ * x_new + \ neg_prob * (1 - x_new), axis=1) log_p_bern # In[30]: np.exp(log_p_bern) / np.sum(np.exp(log_p_bern))