综述
朴素贝叶斯法是基于贝叶斯定理与条件独立假设的分类方法。
首先要知道一些基本统计学的知识:
1、条件概率
2、联合概率
3、独立性
4、独立同分布
5、贝叶斯定理
定理公式不好敲,这里偷懒就不写了,查看概率论的书,就知道了。
代码实现
版本1:DIY版本
# coding:utf-8
import numpy as np
X = np.array([[1,1],[1,2],[1,2],[1,1],[1,1],[2,1],[2,2],[2,2],[2,3],[2,3],[3,3],[3,2],[3,2],[3,3],[3,3]])
# print(np.shape(X))
Y = np.array([-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1])
input_x = np.array([2,1])
class NB(object):
def __init__(self,X,Y):
self.X = X
self.Y = Y
self.N = len(Y) #实例的个数
self.K = len(X[0]) #特征的维数
self.M = len(set(self.Y)) #类别的个数
def cal_pri_prb(self): # 计算先验概率
p_p = dict() #先验概率
p_n = dict() #记录频数
for y in set(self.Y):
sum = 0
for y_i in self.Y:
if y==y_i:
sum = sum+1
else:
pass
p_p[y] = sum/self.N
p_n[y] = sum
return p_p,p_n
def cond_prb(self,p_p,p_n): # 计算条件概率
p = list() #用来存放条件概率乘积
for y in set(self.Y): # y=(1,-1)
p1 =1
for j in range(self.K): # j = 0,1
sum = 0
for i,x in enumerate(self.X):
if (x[j]==input_x[j] and self.Y[i]==y):
sum = sum+1
pred = sum/p_n[y]
p1 = p1*pred
p.append(p1)
y_result = dict()
for i,y in enumerate(list(set(self.Y))):
y_result[y] = p_p[y]*p[i]
result = sorted(y_result.values())[-1]
return y_result,result
def show_result(self,y_result,result):
show_dict = {v:k for k,v in y_result.items()}
print("预测结果为",show_dict[result])
nb = NB(X,Y)
p_p,p_n = nb.cal_pri_prb()
y_result,result = nb.cond_prb(p_p,p_n)
nb.show_result(y_result,result)
>>>
预测结果为 -1
版本2:使用sklearn版本
#coding:utf-8
import numpy as np
from sklearn.naive_bayes import GaussianNB
X = np.array([[1,1],[1,2],[1,2],[1,1],[1,1],[2,1],[2,2],[2,2],[2,3],[2,3],[3,3],[3,2],[3,2],[3,3],[3,3]])
Y = np.array([-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1])
input_x = np.array([[2,1]])
gnb = GaussianNB()
y_pred = gnb.fit(X,Y).predict(input_x)
print(y_pred)
>>>
[-1]
参考:《统计学习方法》–李航