目录
一、理论知识
1.算法思想
贝叶斯决策论是概率框架下实施决策的基本方法。对分类任务来说,在所有相关概率都已知的情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的标记类别。
2.基本公式
作用:当我们很容易得到P(B∣A), P(A|B)很难直接得出时,但我们更关心P(B∣A) ,贝叶斯定理则为我们打通从P(A∣B)获得P(B∣A)的道路。
先验概率 (Prior Probability): 先验概率是指在考虑任何观测数据或证据之前,我们对某个事件发生的概率的估计。它是基于我们对问题的初始知识或假设。在贝叶斯定理中,先验概率通常表示为P(A)。
后验概率 (Posterior Probability):在贝叶斯定理中,后验概率表示为P(B|A),即在已知事件A发生的情况下,事件B发生的概率。
3.朴素贝叶斯算法
朴素贝叶斯算法: 朴素贝叶斯算法是一种简单而高效的分类算法,它基于贝叶斯定理,并引入了一个关键的假设——特征之间的条件独立性。这个假设大大简化了计算,使得朴素贝叶斯算法在处理大规模数据集时非常高效。尽管“朴素”的假设在现实中往往不成立,但朴素贝叶斯算法在许多实际应用中仍然表现出色,尤其是在文本分类和垃圾邮件过滤等领域。
二、代码实现
实验的总体思路为:
1.数据集:实验数据包含18个西瓜样本,每个样本有6个特征(色泽、根蒂、敲击、纹理、脐部和触感)和一个标签(好瓜或坏瓜)。
2.先验概率计算:通过计算好瓜和坏瓜的数量,得出好瓜和坏瓜的先验概率。
3.后验概率计算:对于每个特征,计算在不同特征值下,好瓜和坏瓜的条件概率。
3.朴素贝叶斯分类器:根据先验概率和条件概率,使用朴素贝叶斯公式计算给定测试数据属于好瓜和坏瓜的概率,最后将概率较大的类别作为预测结果。
4.测试:使用一组测试数据(1个样本),调用朴素贝叶斯分类器进行预测,并输出预测结果。
1.数据集
data = [['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],
['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'],
['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],
['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'],
['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],
['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '是'],
['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '是'],
['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '是'],
['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '否'],
['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '否'],
['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '否'],
['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '否'],
['浅白', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '否'],
['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '否'],
['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '软粘', '否'],
['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '否'],
['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '否']]
df = pd.DataFrame(data, columns=['色泽', '根蒂', '敲击', '纹理', '脐部', '触感', '好瓜'])
2.计算先验概率
计算好瓜和坏瓜的先验概率,即该类别在训练集中出现的概率。
def prior_probabilities(df):
total_count = len(df)
good_count = len(df[df['好瓜'] == '是'])
bad_count = len(df[df['好瓜'] == '否'])
good_probability = good_count / total_count
bad_probability = bad_count / total_count
return good_probability, bad_probability
结果:
3.计算后验概率
计算好瓜和坏瓜的后验概率,即各个特征值的后验概率。
def conditional_probabilities(df):
good_count = len(df[df['好瓜'] == '是'])
bad_count = len(df[df['好瓜'] == '否'])
features = ['色泽', '根蒂', '敲击', '纹理', '脐部', '触感']
probabilities = {}
for feature in features:
feature_values = df[feature].unique()
probabilities[feature] = {}
for value in feature_values:
good_value_count = len(df[(df[feature] == value) & (df['好瓜'] == '是')])
bad_value_count = len(df[(df[feature] == value) & (df['好瓜'] == '否')])
probabilities[feature][value] = {
'好瓜': good_value_count / good_count,
'坏瓜': bad_value_count / bad_count
}
return probabilities
结果:
4.测试分类
朴素贝叶斯分类思路实例:
根据特征对西瓜进行分类决定是好瓜还是坏瓜。
朴素贝叶斯算法的公式为:
P(好瓜|特征1, 特征2, ..., 特征n) = [P(好瓜) * P(特征1|好瓜) * P(特征2|好瓜) * ... * P(特征n|好瓜)]/P(特征1,特征2, ..., 特征n)
P(好瓜|特征1)=[P(好瓜)*P(特征1|好瓜)]/P(特征1)
只需比较大小,所以不需要 P(好瓜|特征1, 特征2, ..., 特征n) 和 P(坏瓜|特征1, 特征2, ..., 特征n)的具体值,因此公式中的分母可以不求,直接比较分子的大小即可得出好瓜还是坏瓜。
测试集:
test_data = [['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑']]
测试分类:
def naive_bayes(df, test_data):
prior_probs = prior_probabilities(df)
conditional_probs = conditional_probabilities(df)
good_probability = prior_probs[0]
bad_probability = prior_probs[1]
for i in range(len(test_data[0])):
feature = df.columns[i]
value = test_data[0][i]
good_value_prob = conditional_probs[feature][value]['好瓜']
bad_value_prob = conditional_probs[feature][value]['坏瓜']
good_probability *= good_value_prob
bad_probability *= bad_value_prob
if good_probability > bad_probability:
return "好瓜"
else:
return "坏瓜"
结果:
三、总结
这个实验展示了朴素贝叶斯分类器在简单分类问题上的应用,以及如何利用概率统计的方法进行分类任务。使用朴素贝叶斯分类器进行简单的分类任务,包括先验概率的计算、条件概率的计算以及分类器的构建和预测。