一、简介
1.1、贝叶斯定理
朴素贝叶斯(Naive Bayesian algorithm)是有监督学习的一种分类算法,它基于“贝叶斯定理”实现,该原理的提出人是英国著名数学家托马斯·贝叶斯。贝叶斯定理是基于概率论和统计学的相关知识实现的,因此在正式学习“朴素贝叶斯算法”前,我们有必要先认识“贝叶斯定理”。
贝叶斯定理是概率统计中的应用所观察到的现象对有关概率分布的主观判断(先验概率)进行修正的标准方法。依靠与事物特定本质相关的事件出现的多少去判断其本质属性的概率。用数学语言表达就是:支持某项属性的事件发生得愈多,则该属性成立的可能性就愈大。
1.2、朴素贝叶斯
朴素贝叶斯是一种基于贝叶斯定理和特征独立性假设的分类算法。对分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。在实际应用中,它表现出了很高的分类效率和准确性,常用于文本分类、垃圾邮件过滤、情感分析等问题。
二、朴素贝叶斯算法原理
2.1、条件概率和贝叶斯公式
先验概率:即基于统计的概率,在没有任何其他信息的情况下,某个类别或事件发生的概率,是基于以往历史经验和分析得到的结果,不需要依赖当前发生的条件。在贝叶斯分类器中,通常通过统计训练数据集中各类别的出现频率来估计。
后验概率:在贝叶斯统计中,后验概率是在考虑新信息之后事件发生的修正或更新概率。 后验概率通过使用贝叶斯定理更新先验概率来计算。 用统计术语来说,后验概率是假设事件B已经发生的情况下事件A发生的概率。
条件概率:记事件A发生的概率为P(A),事件B发生的概率为P(B),则在B事件发生的前提下,A事件发生的概率即为条件概率,记为P(B|A)
贝叶斯公式:是概率论中的一个基本定理,描述了在已知先验概率的情况下,如何更新我们对事件的概率。贝叶斯公式便是基于条件概率,通过P(B|A)来求P(A|B),如下:
2.2、朴素贝叶斯公式
朴素贝叶斯分类器的原理基于贝叶斯定理,即根据已知类别的数据来估计特征与类别之间的概率分布,然后使用这些概率来对新样本进行分类。
朴素贝叶斯算法是假设各个特征之间相互独立,也是朴素这词的意思。那么贝叶斯公式中P(X|Y)可写成
具体地,设特征向量为 ,类别集合为 ,我们的目标是计算在给定特征向量 X的条件下,属于每个类别的概率 ,然后选择具有最大后验概率的类别作为样本的分类结果。
朴素贝叶斯公式:
其中 是类别Y的先验概率,是在类别 Y下特征向量 X 的条件概率,P(X) 是特征向量 X 的边缘概率。由于 P(X) 对所有类别都是相同的,因此可以忽略掉。
2.3、拉普拉斯修正
由于实验数据存在某些原因导致数据有缺失值,例如没有记录某天是否去打球,导致过拟合。因此在计算概率的时候需要加减降低这种情况的影响。
2.4、算法流程
(1)数据预处理:
①获取训练数据集,包括特征向量和对应的类别标签。
②对数据进行清洗、标准化或其他必要的预处理。
(2)计算概率:
①计算各个类别的先验概率 ( P(c) )。
②对于每个特征,计算每个类别下的条件概率 ( P(x_i|c) )。
(3)预测过程:
①对于每个待预测的样本,根据贝叶斯定理计算出样本属于每个类别的概率。
②选择具有最高概率的类别作为预测结果。
(4)性能评估:
①使用测试数据集评估模型的性能,通常使用准确率、精确率、召回率等指标进行评估。
三、代码实现
3.1 处理数据集
import numpy as np
datas = [
['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],
['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好瓜'],
['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],
['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好瓜'],
['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],
['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '好瓜'],
['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '好瓜'],
['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '好瓜'],
['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '坏瓜'],
['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '坏瓜'],
['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '坏瓜'],
['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '坏瓜'],
['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '坏瓜'],
['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '坏瓜'],
['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '坏瓜'],
['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '坏瓜'],
['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '坏瓜']
]
labels = ['好瓜', '坏瓜']
features = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感']
3.2 统计特征数量
n_samples, n_features = data.shape[0], data.shape[1] - 1
3.3 计算先验概率
def calculate_prior(datas):
total_samples = len(datas) #总样本数
labels = [data[-1] for data in datas] # 访问数据最后一个元素作为标签
unique_labels = set(labels) #唯一的类别标签集合
prior_probabilities = {} # 存储先验概率的字典
for label in unique_labels:
label_count = labels.count(label) # 统计该类别标签在列表中出现的次数
prior_probabilities[label] = label_count / total_samples # 计算该类别的先验概率
return prior_probabilities
print(calculate_prior(datas))
3.4 计算条件概率
def calculate_conditional(datas, feature, feature_value, label):
# 计算给定特征在给定类别下的条件概率
# param datas: 数据集,包含特征和类别标签
# param feature: 特征列索引
# param feature_value: 特征取值
# param label: 类别标签
matching_samples = 0 # 匹配样本数
total_samples = 0 #此类别的数量
for data in datas:
if data[-1] == label and data[feature] == feature_value:
matching_samples += 1
datas=np.array(datas)
conditional_probability = (matching_samples + 1) / (total_samples + len(set(datas[:, feature]))) # 使用了拉普拉斯平滑系数
return conditional_probability
print(calculate_conditional(datas,1,"硬挺","好瓜"))
3.5 计算后验概率
def calculate_posterior(datas, labels, tests):
# 计算先验概率
prior_probabilities = calculate_prior(datas)
# 初始化后验概率列表
posterior_probabilities = []
for test in tests:
posterior = {} # 存储当前测试样本的后验概率
for label in labels:
# 初始化后验概率为先验概率
posterior[label] = prior_probabilities[label]
# 计算每个特征的条件概率,并乘以后验概率
for i, feature_value in enumerate(test):
conditional_prob = calculate_conditional(datas, i, feature_value, label)
posterior[label] *= conditional_prob
# 归一化后验概率
total_posterior = sum(posterior.values())
for label in labels:
posterior[label] /= total_posterior
posterior_probabilities.append(posterior)
return posterior_probabilities
3.6 预测结果
for i, test in enumerate(tests):
print("测试样本:", test)
predict_p=max(labels, key=lambda label: p[i][label])
print("分类结果:",predict_p)
for label in labels:
print("类别", label, "的后验概率:", p[i][label])
print()
四、总结
朴素贝叶斯分类是一种基于贝叶斯定理和特征条件独立假设的分类算法。其基本原理是根据训练数据集中各个特征的条件概率来预测新数据点的类别。在给定特征值的情况下,朴素贝叶斯分类器会计算数据点属于每个类别的概率,然后选择具有最大概的类别作为预测结果。
优点:
- 算法简单,实现容易,计算速度快。
- 对小规模数据表现良好适用于多分类问题。
- 在某些情况下,朴素贝叶斯的表现可以和更复杂的分类算法相媲美。
4 对缺失数据不敏感,能够处理不完整数据。
缺点:
- 朴素贝叶斯分类器假所有特征之间互独立,这在现实数据中符合实际情况可能会影响分类效果。
- 对数据的分布假设过于简单无法很好地处理复杂关系。
- 在处理连续性的特征时需要进行离散化,可能导致信息损失。
- 于先验概率的假设,如果练集中某个类别下没有样本数据,则会导致率预测为0综合来看,素贝叶斯分类器适用于简的分类问题和小模数据集,但在复杂数据和高特征空间下,表现可能不如其他更复杂的算法。