# sklearn

# classes_ ; 타겟 Y 의 클래스(라벨)
# class_count_ ; 타켓 Y 의 값이 특정한 클래스인 표본 데이터의 수
# feature_count_ ; 1) 베르누이 분포 ;
#                  2) 다항분포 ;           
# class_prior_ (가우시안 정규분포) ; P(Y)
# class_log_prior_ (베르누이, 다항 분포) ; log P(Y)
# theta_, sigma_ (가우시안 정규분포)
# feature_log_prob_ (베르누이, 다항 분포)
# predicet_proba(x_new) ; P(Y|Xnew)

"""
Explanation: 나이브 베이즈 분류 모형
End of explanation
"""


import numpy as np
from sklearn.naive_bayes import BernoulliNB

X = np.random.randint(2, size=(10, 4))
y = np.array([0,0,0,1,1,1,1,1,1,1])
print(X)
print(y)

clf_bern = BernoulliNB().fit(X, y)

clf_bern.classes_

clf_bern.class_count_

clf_bern.feature_count_

theta = np.exp(clf_bern.feature_log_prob_)
theta

x_new = np.array([1,1,1,0])

clf_bern.predict_proba([x_new])

"""
Explanation: 1) 베르누이 분포 나이브 베이즈 모형

4개의 동전을 10번 던졌고, 클래스 0에 해당하는 곳이 3개, 클래스 1에 해당하는 곳이 7개 이다. 만약 x_new 값으로 [1,1,1,0] 일때 그것이 클래스 0과 클래스 1에 해당할 확률을 구해라.
End of explanation
"""


from sklearn.naive_bayes import MultinomialNB

clf_mult = MultinomialNB().fit(X, y)

clf_mult.classes_

clf_mult.class_count_

clf_mult.feature_count_

theta = np.exp(clf_mult.feature_log_prob_)
theta

x_new = np.array([10,15,29,32])

clf_mult.predict_proba([x_new])

"""
Explanation: 2) 다항 분포 나이브 베이즈 모형

위의 X, y는 동일한데 다항분포를 활용해서 x_new = [10,15,29,32] 일 경우, 그것이 클래스 0에 속할 확률과 클래스 1에 속할 확률을 구해라.
End of explanation
"""


from sklearn.naive_bayes import GaussianNB

# 학생 0 의 시험성적
X00 = sp.stats.norm(70, 10).rvs(10)
X01 = sp.stats.norm(80, 5).rvs(10)
X02 = sp.stats.norm(100, 5).rvs(10)
X03 = sp.stats.norm(40, 5).rvs(10)

# 학생 1 의 시험성적
X10 = sp.stats.norm(90, 10).rvs(10)
X11 = sp.stats.norm(75, 5).rvs(10)
X12 = sp.stats.norm(60, 5).rvs(10)
X13 = sp.stats.norm(50, 10).rvs(10)

# 학생 2 의 시험성적
X20 = sp.stats.norm(60, 10).rvs(10)
X21 = sp.stats.norm(55, 5).rvs(10)
X22 = sp.stats.norm(100, 5).rvs(10)
X23 = sp.stats.norm(25, 10).rvs(10)

# Case 1)

X0 = np.vstack([X00, X01, X02, X03]).T
X1 = np.vstack([X10, X11, X12, X13]).T
X2 = np.vstack([X20, X21, X22, X23]).T
X = np.vstack([X0, X1, X2])


# 학생(=클래스) 구분하기
y0 = np.zeros(10)
y1 = np.ones(10)
y2 = np.ones(10) * 2

y = np.hstack([y0,y1,y2])

np.shape(X0)

np.shape(X)

np.shape(y)

clf_norm = GaussianNB().fit(X, y)

clf_norm.classes_

clf_norm.class_count_

clf_norm.class_prior_

clf_norm.theta_

clf_norm.sigma_

x_new = np.array([70, 60, 75, 35])

clf_norm.predict_proba([x_new])

"""
Explanation: 3) 가우시안 정규 분포 나이브 베이즈 모형
End of explanation
"""


