贝叶斯估计是最大似然估计的改进。

在最大似然估计算法中计算得到的先验概率、条件概率都有可能是0,这会导致最终得到的后验概率没有意义。
贝叶斯估计在最大似然估计的分子分母中同时添加了系数lamda,防止出现计算结果为0的情况。

def NaiveteBayes(T, y, a, Y, x, lam=0):
    # 计算先验概率
    prepro = {}
    for yRange in Y:
        #print (yRange, Y[Y==yRange].shape[0], )
        prepro[yRange] = (y[y==yRange].shape[0]+lam)/(y.shape[0]+lam*Y.shape[0])
    print('先验概率:',prepro)
    # 计算条件概率
    conpro = {}
    for i in range(len(a)):  # 遍历每个特征
        for j in a[i]: # 遍历特征的每个取值
            for k in Y:
                numerator = X[(y==k)&(X[:,i]==j),:].shape[0]+lam
                denominator = X[y==k,:].shape[0]+lam*a[i].shape[0]
                conpro[(i,j, k)] = numerator/denominator
                # print (i,j,k,numerator, denominator)
    print('条件概率:',conpro)
    # 计算后验概率的分子
    postpro = {}
    for yRange in Y:
        pro = 1
        for i in range(x.shape[0]):
            pro = pro * conpro[(i, x[i], yRange)]
            print (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

results matching ""

    No results matching ""