朴素贝叶斯(naive Bayes)的python实现——基于《统计学习方法》例题的编程求解

朴素贝叶斯方法是基于贝叶斯定理与特征条件独立假设的分类方法。认为样本的特征X与标签y服从联合概率分布P(X, y),所有的样本都是基于这个概率分布产生的。由于条件概率P(X=x|Y=y)的参数具有指数数量级,因此进行估算切实际。贝叶斯法对条件概率分布做了条件独立性假设,从而减少了模型的复杂性,增加了模型的泛化能力,减少了过拟合的风险。

#后验概率最大化
可以证明,期望风险最小化准则可以得到后验概率最大化准则,而期望风险最小化就是贝叶斯法的损失函数,因而在求解过程中,只要求得是样本后验概率最大的类,将之作为样本的类别即可。

代码如下:

import numpy as np
from collections import Counter

X = np.array([[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'], [1, 'S'], [2, 'S'], [2, 'M'], [2, 'M'], [2, 'L'], [2, 'L'], [3, 'L'], [3, 'M'], [3, 'M'], [3, 'L'], [3, 'L']])
y = [-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]

#计算先验概率
y_list = Counter(y)
n_back = dict(y_list) #各类别的数量
p_1 = n_back[-1]/len(y)
p1 = n_back[1]/len(y)
print('类别为-1的概率为:{}'.format(p_1))
print('类别为 1的概率为:{}'.format(p1))
dic = {}
#计算条件概率
X1 = ['1', '2', '3']#第一个属性包含的类型
X2 = ['S', 'M', 'L']#第二个属性包含的类型

for i in X1:#计算X1属性中的条件概率
    t = []
    for j in range(len(y)):
        if y[j] == -1:
            t.append(j)
    m = 0
    for j in t:
        if X[j][0] == i:
            m += 1
    print('P(X1={}|Y=-1)={}/6'.format(i, m))
    dic['P(X1={}|Y=-1)'.format(i)] = m/6 #将结果以字典形式存起来
    t2 = []
    for j in range(len(y)):
        if y[j] == 1:
            t2.append(j)
    m = 0
    for j in t2:
        if X[j][0] == i:
            m += 1
    print('P(X1={}|Y=1)={}/9'.format(i, m))
    dic['P(X1={}|Y=1)'.format(i)] = m/9 #将结果以字典形式存起来


for i in X2:#计算X1属性中的条件概率
    t = []
    for j in range(len(y)):
        if y[j] == -1:
            t.append(j)
    m = 0
    for j in t:
        if X[j][1] == i:
            m += 1
    print('P(X2={}|Y=-1)={}/6'.format(i, m))
    dic['P(X2={}|Y=-1)'.format(i)] = m/6 #将结果以字典形式存起来
    t2 = []
    for j in range(len(y)):
        if y[j] == 1:
            t2.append(j)
    m = 0
    for j in t2:
        if X[j][1] == i:
            m += 1
    print('P(X2={}|Y=1)={}/9'.format(i, m))
    dic['P(X2={}|Y=1)'.format(i)] = m/9 #将结果以字典形式存起来

输出的结果即为朴素贝叶斯法的前验概率和条件概率,如下图所示:
结果展示
对于新来样本的判断,需要将之前计算出的先验概率与条件概率存储起来,然后用于新来样本的计算。
假设新来样本为x = [‘2’, ‘S’],则计算出新来样本对于所有种类的后验概率,选择后验概率最大所对应的类别,作为新来样本的类别。
代码如下:

x = ['2', 'S']
f1 = p1 * dic['P(X1=2|Y=1)'] * dic['P(X2=S|Y=1)']
f_1 = p_1 * dic['P(X1=2|Y=-1)'] * dic['P(X2=S|Y=-1)']
print('x属于1的概率为{}'.format(f1))
print('x属于-1的概率为{}'.format(f_1))

输出结果:
在这里插入图片描述
由于x属于-1类的后验概率较大,因此判断x属于-1类。

发布了5 篇原创文章 · 获赞 0 · 访问量 2101

猜你喜欢

转载自blog.csdn.net/qq_39320588/article/details/104088843
今日推荐