机器学习-贝叶斯分类

目录

一、贝叶斯算法概述

二、样本的先验概率

三、样本的条件概率

四、样本的后验概率

五、代码的实现

5.1 准备数据集

 5.1计算先验概率

5.3计算条件概率

5.4 计算后验概率

六、完整代码

6.1 运行结果

   七、实验小结


一、贝叶斯算法概述

       贝叶斯算法是一种基于概率论的分类方法,它通过计算先验概率和条件概率来预测样本的类别。贝叶斯算法的核心思想是利用已知的信息(如训练数据集)来估计未知参数的概率分布,从而对新的样本进行分类。贝叶斯算法在机器学习、数据挖掘和自然语言处理等领域有着广泛的应用。

二、样本的先验概率

          在贝叶斯算法中,先验概率通常指在不考虑特征条件下,样本属于某个类别的概率。例如,朴素贝叶斯分类器的训练过程就是基于训练集D来估计类先验概率P(c) 

           p(c)=\frac{\left | Dc \right |}{\left | D \right |}

      * ∣D∣ 是训练集 D 中的总样本数量 

      * ∣Dc​∣ 是类别 c 中的总样本数量。

 例子:假设我们有100个西瓜,其中有80个是好瓜,20个是坏瓜。那么好瓜的先验概率为80/100=0.8,坏瓜的先验概率为20/100=0.2。

三、样本的条件概率

          条件概率是指在一个事件发生的条件下,另一个事件发生的概率。在贝叶斯算法中,条件概率表示在给定类别的情况下,样本具有某种特征的概率。例如,求的先验概率后,对于离散属性而言,令Dcixi表示Dc中在第i个属性上取值为Xi的样本组成的集合,则条件概率

              P(xi | c)=\frac{\left | Dc,xi \right |}{\left | Dc \right |} 

         *  Dc,xi​​ 是数据集 Dc​ 中在第 i 个属性上取值为 xi​ 的样本组成的集合

         * ∣Dc,xi​​∣ 是集合Dc,xi​​ 中的样本数量。

         * ∣Dc​∣ 是类别 c 中的总样本数量。

四、样本的后验概率

      P(C|X) = \frac{P(X| C) * P(C) }{P(X)}

      * P(C|X)是事件C在事件X发生后的后验概率。

      * P(X|C)是事件X在事件C发生后的条件概率

      * P(C) 是事件C的先验概率

      * P(X)是事件X的边缘概率 

 在本实验中,后验概率等于先验概率和条件概率的乘积

五、代码的实现

5.1 准备数据集

data = {
    '好瓜': [
        ['青绿', '蜷缩', '浊响'],
        ['乌黑', '蜷缩', '沉闷'],
        ['乌黑', '稍蜷', '浊响'],
        ['青绿', '硬挺', '清脆'],
        ['浅白', '稍蜷', '浊响'],
        ['青绿', '稍蜷', '浊响']
    ],
    '坏瓜': [
        ['浅白', '硬挺', '清脆'],
        ['乌黑', '稍蜷', '浊响'],
        ['乌黑', '稍蜷', '浊响'],
        ['青绿', '蜷缩', '沉闷']
    ]
}

 5.1计算先验概率

      由公式求好瓜和坏瓜的先验概率

                   p(c)=\frac{\left | Dc \right |}{\left | D \right |}

   调用函数并传入数据集data,得到"好瓜"和"坏瓜"的先验概率。

# 计算先验概率
def xianyangailv(dataset):
    total_good = len(dataset['好瓜'])  # 数据集中好瓜的数量
    total_bad = len(dataset['坏瓜'])  # 数据集中坏瓜的数量
    total = total_good + total_bad  # 数据集的总数量
    good = total_good / total  # 计算好瓜的先验概率
    bad = total_bad / total  # 计算坏瓜的先验概率
    return good, bad  # 返回好瓜和坏瓜的先验概率

# 调用函数计算先验概率
good, bad = xianyangailv(data)

# 打印结果
print(f"P(好瓜)= {good:.2f}")
print(f"p(坏瓜)= {bad:.2f}")

运行结果,输出好瓜和坏瓜的先验概率 

5.3计算条件概率

根据公式P(xi | c)=\frac{\left | Dc,xi \right |}{\left | Dc \right |}计算给定数据集中每个特征在好瓜和坏瓜情况下的条件概率,并逐个输出每个特征是好瓜和坏瓜的概率

# 初始化字典来存储每个特征的条件概率
dictionary_1 = {}

for feature in features:
    #判断当前元素x中是否包含特征feature,如果包含特征feature,则生成一个值为1的元素,对生成的1的个数进行求和,得到满足条件的元素个数。
    good_count = sum(1 for x in data['好瓜'] if feature in x)
    bad_count = sum(1 for x in data['坏瓜'] if feature in x)
    total_good = len(data['好瓜'])
    total_bad = len(data['坏瓜'])

    dictionary_1 [feature] = {    #字典1中记录了在好瓜和坏瓜的情况下,每一个特征值是好瓜和坏瓜的条件概率
        '好瓜': good_count / total_good,
        '坏瓜': bad_count / total_bad
    }

# 逐个输出每个特征是好瓜和坏瓜的概率
counter = 1
for feature in features:
    print("p{0}({1}|好瓜)={2}".format(counter,feature, dictionary_1[feature]['好瓜']))
    print("p{0}({1}|坏瓜)={2}".format(counter + 1, feature, dictionary_1[feature]['坏瓜']))
    counter += 2

运行结果,输出每一个特征的条件概率 

5.4 计算后验概率

     根据给定的预测样本,计算好瓜和坏瓜的概率。它通过遍历预测样本中的每个特征,并根据特征在字典中对应的好瓜和坏瓜的条件概率进行乘积运算,得到好瓜和坏瓜的后验概率。最后,将先验概率与后验概率相乘,输出好瓜和坏瓜的概率。

new_sample = ['乌黑', '稍蜷', '沉闷'] #预测样本

isgood = 1
isbad = 1
counter = 1

for feature in new_sample:  
    if counter % 2 == 1:
        isgood *= dictionary_1[feature]['好瓜']
    else:
        isbad *= dictionary_1[feature]['坏瓜']
    counter += 1

 #后验概率等于先验概率和条件概率的乘积
  

print("好瓜概率:", good*isgood)
print("坏瓜概率:", bad*isbad)

运行结果,输出好瓜和坏瓜的后验概率 

 

六、完整代码

import numpy as np

# 假设数据集
data = {
    '好瓜': [
        ['青绿', '蜷缩', '浊响'],
        ['乌黑', '蜷缩', '沉闷'],
        ['乌黑', '稍蜷', '浊响'],
        ['青绿', '硬挺', '清脆'],
        ['浅白', '稍蜷', '浊响'],
        ['青绿', '稍蜷', '浊响']
    ],
    '坏瓜': [
        ['浅白', '硬挺', '清脆'],
        ['乌黑', '蜷缩', '浊响'],
        ['乌黑', '稍蜷', '浊响'],
        ['青绿', '蜷缩', '沉闷']
    ]
}

# 计算先验概率
def xianyangailv(dataset):
    total_good = len(dataset['好瓜'])  # 数据集中好瓜的数量
    total_bad = len(dataset['坏瓜'])  # 数据集中坏瓜的数量
    total = total_good + total_bad  # 数据集的总数量
    good = total_good / total  # 计算好瓜的先验概率
    bad = total_bad / total  # 计算坏瓜的先验概率
    return good, bad  # 返回好瓜和坏瓜的先验概率

# 调用函数计算先验概率
good, bad = xianyangailv(data)

# 打印结果
print(f"P(好瓜=是)= {good:.2f}")
print(f"p(坏瓜=是)= {bad:.2f}")

# 初始化特征列表
features = ['青绿', '乌黑', '浅白', '蜷缩', '稍蜷', '硬挺', '清脆', '浊响', '沉闷']

# 初始化字典来存储每个特征的条件概率
dictionary_1 = {}

for feature in features:
    good_count = sum(1 for x in data['好瓜'] if feature in x)#遍历 data['好瓜'] 中的每个元素,将每个元素赋值给变量 x,通过列表推导式生成一个由数字1组成的列表,然后使用 sum() 函数对列表中的所有元素求和,得到满足条件的元素的总数。
    bad_count = sum(1 for x in data['坏瓜'] if feature in x)#计算在 data['好瓜'] 中包含特定特征 feature 的元素个数。
    total_good = len(data['好瓜'])
    total_bad = len(data['坏瓜'])

    dictionary_1 [feature] = {
        '好瓜': good_count / total_good,
        '坏瓜': bad_count / total_bad
    }

# 逐个输出每个特征是好瓜和坏瓜的概率
counter = 1
for feature in features:
    print("p{0}({1}|好瓜)={2}".format(counter,feature, dictionary_1[feature]['好瓜']))
    print("p{0}({1}|坏瓜)={2}".format(counter + 1, feature, dictionary_1[feature]['坏瓜']))
    counter += 2

new_sample = ['青绿', '稍蜷', '浊响'] #预测样本

isgood = 1
isbad = 1
counter = 1

for feature in new_sample:
    if counter % 2 == 1:
        isgood *= dictionary_1[feature]['好瓜']
    else:
        isbad *= dictionary_1[feature]['坏瓜']
    counter += 1

# 后验概率等于先验概率乘条件概率,通过比较后验概率的大小来分类
if good * isgood > bad * isbad:
    print("好瓜概率 > 坏瓜概率,所以预测样本是好瓜")
else:
    print("好瓜概率 < 坏瓜概率,所以预测样本是坏瓜")# 输出好瓜概率和坏瓜概率的比较结果


print("好瓜概率:", good*isgood)
print("坏瓜概率:", bad*isbad)

6.1 运行结果

  

   七、实验小结

      通过本次实验,我对贝叶斯分类器有了更深刻的理解,对于如何求先验概率和条件概率、后验概率更加熟悉,本次实验中也出现许多问题,通过不断地查看相关博主的思路,慢慢修改的代码的不足之处,在本次实验中让我学会了字典这一知识点,通过字典来存储数据,方便后续查找数据和修改数据,通过通过初始化特征方便后续代码的遍历,让代码更加流畅的使用,实验结果表明,在特定条件下,如小样本数据集上,贝叶斯分类器能够提供较好的分类性能。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值