一、朴素贝叶斯算法
1、什么是朴素贝叶斯算法
朴素贝叶斯算法是一种基于贝叶斯定理的简单而高效的分类算法,通常用于文本分类、垃圾邮件过滤、情感分析等任务。它被称为“朴素”,是因为它假设特征之间是相互独立的,即一个特征的出现与否不影响其他特征的出现,这一假设在实际情况中往往不完全成立,但在许多应用中,朴素贝叶斯算法依然表现良好。朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理和特征条件独立假设的分类方法。贝叶斯决策理论的核心思想是将决策问题建模为概率问题。它考虑决策者对决策结果的不确定性,并试图在所有可能的行动中找到一个能够最大化预期效用的行动。
例如,在已知p1(x,y)和p2(x,y)分别代表数据点(x,y)在类别1和类别2中实现的概率,若p1(x,y)>p2(x,y),则类别为1,反之为2.这反映了我们优先选择类别概率高的。这也是贝叶斯决策理论的关键思想——最高概率的决策。
2、什么是条件概率
已知独立事件A和B,在事件 B 发生的情况下,事件 A 发生的概率P(A|B)为
已知独立事件A和B,在事件 A 发生的情况下,事件 B 发生的概率P(B|A)为
P(A)是事件 A 发生的先验概率。
P(B) 是事件 B 发生的先验概率。
对P(AB)进行等量代换就可以得出贝叶斯定理公式:
3、什么是朴素贝叶斯分类器(先验概率、后验概率)
在分类任务中,朴素贝叶斯算法应用贝叶斯定理来计算一个样本属于某个类别的概率.步骤如下:
1、计算先验概率:计算每个类别的先验概率 P(X),即类别 X在训练数据中出现的频率。
2、计算似然概率:对于每个特征 Y,计算在类别 X下该特征出现的概率 (P(Y| X) 。
3、计算后验概率:对于一个待分类的样本 ( Y = {y1, y2, ..., yn} ),计算其属于每个类别的后验概率 ( P(X | Y) )。根据贝叶斯定理有:
由于 P(Y)对所有类别都是相同的,可以忽略,简化为:
因为假设特征之间相互独立,所以有:
4、使用朴素贝叶斯算法的优点和缺点
优点:
1、计算效率高,适合大规模数据。
2、对小规模数据表现良好,特别适合文本分类。
3、实现简单,易于理解。
缺点:
1、对特征独立性的假设在实际应用中往往不成立,可能影响分类效果。
2、对少量数据或者特征依赖性强的情况下,性能可能不佳。
二、朴素贝叶斯算法的使用
1、创建本次算法所要使用的数据集、测试集及其特征集
def create_dataset():
# 训练数据集
dataset = [
['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],
['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好瓜'],
['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],
['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好瓜'],
['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],
['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '好瓜'],
['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '好瓜'],
['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '好瓜'],
['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '坏瓜'],
['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '坏瓜'],
['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '坏瓜'],
['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '坏瓜'],
['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '坏瓜'],
['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '坏瓜'],
['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '坏瓜'],
['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '坏瓜'],
['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '坏瓜']
]
# 测试数据集
testset = ['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘']
# 特征标签
labels = ['色泽', '根蒂', '敲击', '纹理', '脐部', '触感']
return dataset, testset, labels
2、计算好瓜和坏瓜的先验概率——P(好瓜)、P(坏瓜)
def calculate_prior_probabilities(dataset):
total_melons = len(dataset)
good_melons = sum(1 for sample in dataset if sample[-1] == '好瓜')
bad_melons = total_melons - good_melons
p_good = good_melons / total_melons
p_bad = bad_melons / total_melons
print(f"P(好瓜)={p_good:.4f}")
print(f"P(坏瓜)={p_bad:.4f}")
return p_good, p_bad
输出的计算结果如下:
3、计算类别为好瓜和坏瓜时,各个特征值的后验概率
def calculate_prior_probabilities(dataset):
total_melons = len(dataset)
good_melons = sum(1 for sample in dataset if sample[-1] == '好瓜')
bad_melons = total_melons - good_melons
p_good = good_melons / total_melons
p_bad = bad_melons / total_melons
print(f"P(好瓜)={p_good:.4f}")
print(f"P(坏瓜)={p_bad:.4f}")
return p_good, p_bad
def calculate_posterior_probabilities(dataset, labels):
# 初始化字典来统计好瓜和坏瓜的特征值
good_counts = {label: {} for label in labels}
bad_counts = {label: {} for label in labels}
# 计算好瓜和坏瓜的总数量
total_good = sum(1 for sample in dataset if sample[-1] == '好瓜')
total_bad = sum(1 for sample in dataset if sample[-1] == '坏瓜')
# 统计好瓜和坏瓜中每个特征值的出现次数
for sample in dataset:
outcome = sample[-1] # 结果(好瓜或坏瓜)
for i, feature_value in enumerate(sample[:-1]):
label = labels[i] # 特征标签
if outcome == '好瓜':
good_counts[label].setdefault(feature_value, 0)
good_counts[label][feature_value] += 1
elif outcome == '坏瓜':
bad_counts[label].setdefault(feature_value, 0)
bad_counts[label][feature_value] += 1
# 计算后验概率
good_probabilities = {}
bad_probabilities = {}
for label in labels:
good_probabilities[label] = {}
bad_probabilities[label] = {}
# 好瓜
for value in good_counts[label]:
probability = good_counts[label][value] / total_good
good_probabilities[label][value] = probability
# 坏瓜
for value in bad_counts[label]:
probability = bad_counts[label][value] / total_bad
bad_probabilities[label][value] = probability
# 分别打印好瓜和坏瓜的概率
print("\n好瓜的后验概率:")
for label in labels:
for value, probability in good_probabilities[label].items():
print(f"P({label}={value}|好瓜) = {probability:.3f}")
print("\n坏瓜的后验概率:")
for label in labels:
for value, probability in bad_probabilities[label].items():
print(f"P({label}={value}|坏瓜) = {probability:.3f}")
return good_probabilities,bad_probabilities # 返回坏瓜的后验概率
P(好瓜)的后验概率输出结果为:
P(坏瓜)的后验概率输出结果为
4、计算测试集并对其进行分类
def classify(testset, dataset, labels, p_good, p_bad, good_probabilities, bad_probabilities):
#计算给定每个结果的测试集的可能性
good_likelihood = p_good
bad_likelihood = p_bad
for i, feature_value in enumerate(testset):
label = labels[i]
if feature_value in good_probabilities[label]:
good_likelihood *= good_probabilities[label][feature_value]
if feature_value in bad_probabilities[label]:
bad_likelihood *= bad_probabilities[label][feature_value]
#计算后验概率
p_good_given_test = good_likelihood / (good_likelihood + bad_likelihood)
p_bad_given_test = bad_likelihood / (good_likelihood + bad_likelihood)
# 输出后验概率
print("\n测试集是好瓜的概率:", p_good_given_test)
print("测试集是坏瓜的概率:", p_bad_given_test)
#根据后验概率进行预测
if p_good_given_test > p_bad_given_test:
return '好瓜'
else:
return '坏瓜'
测试集的计算结果为:
结果分析:该分类结果与计算结果关系正确,即概率越大的类别,即为被认为是正确的选择。这就是贝叶斯决策理论核心思想——最高概率的体现。
3、总结
朴素贝叶斯算法是一种基于概率论和统计学的算法,被广泛应用于自然语言处理、文本分类、垃圾邮件过滤、情感分析等领域。该算法通过计算条件概率来预测或分类数据。经过本次实验,我加深了对朴素贝叶斯算法的了解,了解了朴素贝叶斯算法对一些小模型的预测方法,我们应该加深对朴素贝叶斯算法的印象,将其运用到更多现实预测问题中。