以上公式中分子所有需要的内容都在以前已经计算出,代入公式即可
不需要计算分母。因为最终要用到的不是后验概率的具体数值,只是要比较大小。中所有C_k的后验概率公式,分母都是相同的,不影响大小的比较,所以不用计算出来。
def NaiveteBayes(T, y, a, Y, x):
# 计算先验概率
prepro = {}
for yRange in Y:
#print (yRange, Y[Y==yRange].shape[0], )
prepro[yRange] = y[y==yRange].shape[0]/y.shape[0]
print('先验概率:',prepro)
# 计算条件概率
conpro = {}
for i in range(len(a)): # 遍历每个特征
for j in a[i]: # 遍历特征的每个取值
for k in Y:
conpro[(i,j, k)] = X[(y==k)&(X[:,i]==j),:].shape[0]/X[y==k,:].shape[0]
print('条件概率:',conpro)
# 计算后验概率的分子
postpro = {}
for yRange in Y:
pro = 1
for i in range(x.shape[0]):
pro = pro * conpro[(i, x[i], yRange)]
postpro[yRange] = pro * prepro[yRange]
print ('后验概率', postpro)
# 确定X的分类
import operator
return sorted(postpro.items(), # iterable -- 可迭代对象,在python2中使用A.iteritems(),在python3中使用A.items()
key=operator.itemgetter(1), # key -- 主要是用来进行比较的元素,指定可迭代对象中的一个元素来进行排序,这里指基于item的value进行排序
reverse=True)[0][0] # reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
# 排序结果是一个list