从特征概率来预测分类——朴素贝叶斯

一、什么是朴素贝叶斯

        朴素贝叶斯 是一种基于贝叶斯定理的机器学习算法,用于分类和概率估计问题。它假设特征之间是相互独立的,这意味着每个特征对于分类的影响是相互独立的。朴素贝叶斯算法常用于文本分类、垃圾邮件过滤、情感分析等领域。

二、朴素贝叶斯公式计算

1.基础知识

在学习贝叶斯公式之前,我们首先要有一定的知识储备。

先验概率:即基于统计的概率,是基于以往历史经验和分析得到的结果,不需要依赖当前发生的条件(即不考虑特征条件)。

后验概率:则是从条件概率而来,由因推果,是基于当下发生了事件之后计算的概率,依赖于当前发生的条件。

条件概率:记事件A发生的概率为P(A),事件B发生的概率为P(B),则在B事件发生的前提下,A事件发生的概率即为条件概率,记为P(A|B)。

相互独立:如果P(A,B)=P(A)P(B)则称事件A与事件B相互独立。

联合概率:联合概率表示两个事件共同发生的概率,例如事件A与事件B同时发生,则表示为P(A,B)或P(AB)。

贝叶斯公式就是在条件概率的基础上推导得来:

                                            条件概率公式:

贝叶斯公式:

        而朴素贝叶斯公式就是在贝叶斯公式的基础上,引入了“朴素”的假设。即假设特征与特征之间相互独立,尽管这个假设在现实世界中往往不成立,但朴素贝叶斯算法仍然在许多实际问题中表现良好。它具有计算简单、速度快的优点。

三、Python实现实例

1、导入相关库和装备数据集

import numpy as np
 
 
datas = [
        ['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],
        ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好瓜'],
        ['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],
        ['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好瓜'],
        ['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],
        ['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '好瓜'],
        ['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '好瓜'],
        ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '好瓜'],
        ['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '坏瓜'],
        ['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '坏瓜'],
        ['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '坏瓜'],
        ['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '坏瓜'],
        ['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '坏瓜'],
        ['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '坏瓜'],
        ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '坏瓜'],
        ['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '坏瓜'],
        ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '坏瓜']
    ]
 
labels = ['好瓜', '坏瓜']
 
features = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感']

2、计算先验概率

from collections import Counter   # 引入计数器模块

def calculate_prior(datas):
    total_samples = len(datas)   # 总样本数
    labels = [data[-1] for data in datas]   # 提取数据最后一个元素作为标签
    label_counts = Counter(labels)    # 使用计数器统计标签出现次数
    prior_probabilities = {label: count / total_samples for label, count in label_counts.items()}   # 计算先验概率

    return prior_probabilities

print(calculate_prior(datas))

运行后,得出结果

{'好瓜': 0.47058823529411764, '坏瓜': 0.5294117647058824}

2、计算各特征的条件概率

# 计算似然概率
def likelihoodProbability(dataSet):
    # 将原数据集划分为好瓜和坏瓜数据集
    good_dataset = [example for example in dataSet if example[-1] == '好瓜']
    bad_dataset = [example for example in dataSet if example[-1] == '坏瓜']
    # 定义好瓜和坏瓜的字典
    class_dicts = {'好瓜': good_dataset, '坏瓜': bad_dataset}
    # 遍历好瓜和坏瓜数据集
    for class_label, class_data in class_dicts.items():
        class_length = len(class_data)
        class_result = {}
        # 统计各个特征的出现次数并计算后验概率
        for sample in class_data:
            for feature in sample:
                if feature != class_label:
                    if feature not in class_result:
                        class_result[feature] = 1
                    else:
                        class_result[feature] += 1
        for feature, count in class_result.items():
            class_result[feature] = count / class_length
        print(f"{class_label}的条件概率:")
        for feature, count in class_result.items():
            print(f"P({feature}|{class_label}): {count:.3f}")
        if(class_label == '好瓜'):
            good_list = class_result
        if(class_label == '坏瓜'):
            bad_list = class_result
    return good_list,bad_list

得到结果

好瓜的条件概率:
P(青绿|好瓜): 0.429
P(蜷缩|好瓜): 0.714
P(浊响|好瓜): 0.571
P(清晰|好瓜): 0.857
P(凹陷|好瓜): 0.714
P(硬滑|好瓜): 1.000
坏瓜的条件概率:
P(乌黑|坏瓜): 0.571
P(蜷缩|坏瓜): 0.429
P(沉闷|坏瓜): 0.286
P(清晰|坏瓜): 0.286
P(凹陷|坏瓜): 0.429
P(硬滑|坏瓜): 0.857

通过朴素贝叶斯公式,知道计算后验概率需要先验概率和条件概率,这之后我们就可以通过这两组数据对给定的特征判断好瓜坏瓜。

3.计算后验概率

def calculate_posterior_and_print(datas, labels, tests):
    prior_probabilities = calculate_prior(datas)
    posterior_probabilities = []
 
    for i, test in enumerate(tests):
        print("测试样本:", test)
        posterior = {}
 
        for label in labels:
            posterior[label] = prior_probabilities[label]
 
            for j, feature_value in enumerate(test):
                conditional_prob = calculate_conditional(datas, j, feature_value, label)
                posterior[label] *= conditional_prob
 
        total_posterior = sum(posterior.values())
        for label in labels:
            posterior[label] /= total_posterior
 
        for label in labels:
            print("类别", label, "的相对后验概率:", posterior[label])
        print()
 
        posterior_probabilities.append(posterior)
 
    return posterior_probabilities

测试用例

测试样本: ['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑']
类别 好瓜 的相对后验概率: 0.9441965051408125
类别 坏瓜 的相对后验概率: 0.055803494859187355
 
测试样本: ['乌黑', '硬挺', '沉闷', '清晰', '凹陷', '硬滑']
类别 好瓜 的相对后验概率: 0.770492060257395
类别 坏瓜 的相对后验概率: 0.22950793974260497

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值