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