朴素贝叶斯(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类。

参考:《统计学习方法》 李航著

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
朴素贝叶斯算法是一种基于概率统计的分类算法,它的核心思想是利用贝叶斯定理计算出每个类别的后验概率,然后选择具有最大后验概率的类别作为分类结果。在这个过程中,朴素贝叶斯假设每个特征之间相互独立,也就是说,每个特征对于分类的贡献是独立的。 在Python中,我们可以使用scikit-learn库来实现朴素贝叶斯算法。具体步骤如下: 1.准备数据:将数据集划分为训练集和测试集。 2.训练模型:使用训练集来训练朴素贝叶斯模型。 3.测试模型:使用测试集来测试模型的准确率。 下面是一个简单的朴素贝叶斯分类器的实现示例: ``` from sklearn.naive_bayes import GaussianNB from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据集 iris = load_iris() # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=0) # 创建朴素贝叶斯分类器对象 gnb = GaussianNB() # 训练模型 gnb.fit(X_train, y_train) # 预测测试集的结果 y_pred = gnb.predict(X_test) # 计算准确率 accuracy = sum(y_pred == y_test) / len(y_test) print("准确率:", accuracy) ``` 这里使用了iris数据集作为示例数据集进行分类。首先,我们使用`train_test_split`函数将数据集划分为训练集和测试集,然后创建一个`GaussianNB`对象,训练模型并使用测试集来测试模型的准确率。最后,我们计算出准确率并将其打印出来。 完整的代码可以在以下链接中找到: https://github.com/Light-City/NaiveBayesClassifier-Python/blob/master/NaiveBayesClassifier.py

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值