先验概率、后验概率(条件概率)引例
- 想象有 A、B、C 三个不透明的碗倒扣在桌面上,已知其中一个瓷碗下面有鸡蛋。此时请问,鸡蛋在 A 碗下面的概率是多少?答曰 1/3。
- 现在发生一件事:有人揭开了 C 碗,发现 C 碗下面没有蛋。此时再问:鸡蛋在 A 碗下面的概率是多少?答曰 1/2。注意,由于有“揭开C碗发现鸡蛋不在C碗下面”这个新情况,对于“鸡蛋在 A 碗下面”这件事的主观概率由原来的 1/3 上升到了1/2。这里的 先验概率 就是 1/3,后验概率(条件概率) 是 1/2。
乘法公式、全概率公式、贝叶斯公式
- 条件概率
设A,B为任意两个事件,若P(A)>0,我们称在已知事件A发生的条件下,事件B发生的概率为条件概率,记为P(B|A),并定义 - 乘法公式
如果P(A)>0,则P(AB)=P(A)P(B|A)
如果P(A1…An-1)>0,则P(A1…An)= P(A1) P(A2|A1) P(A3|A1A2)…P(An|A1…An)
全概率公式
-
全概率公式是用于计算某个“结果” B发生的可能性大小。如果一个结果B的发生总是与某些前提条件Ai 相联系,那么在计算P(B)时,我们就要用Ai 对B作分解,应用全概率公式计算P(B),我们常称这种方法为全集分解法。
-
根据小偷们的资料,计算村子今晚失窃概率的问题:P(Ai)表示小偷 i 作案的概率,P(B|Ai)表示小偷 i 作案成功的概率,那么P(B)就是村子失窃的概率
贝叶斯公式(又称逆概公式)
- 如果在B发生的条件下探求导致这一结果的各种“原因” Aj 发生的可能性大小P(Aj |B),则要应用贝叶斯公式
- 若村子今晚失窃,计算哪个小偷嫌疑最大的问题(嫌疑最大就是后验概率最大)
朴素贝叶斯为何朴素
-
条件独立、概率不准确
-
因为它假定所有的特征在数据集中的作用是同样重要和独立的,正如我们所知,这个假设在现实世界中是很不真实的,因此,说是很“朴素的”。
-
朴素贝叶斯中的“朴素”二字突出了这个算法的简易性。朴素贝叶斯的简易性表现该算法基于一个很朴素的假设:所有的变量都是相互独立的,假设各特征之间相互独立,各特征属性是条件独立的。
朴素贝叶斯定义
-
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法 。最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。
-
贝叶斯定理是关于随机事件A和B的条件概率(或边缘概率)的一则定理。其中P(A|B)是在B发生的情况下A发生的可能性。
朴素贝叶斯直观理解
朴素的意义
拉普拉斯平滑
手写代码
数据集
X1 X2 Y
0 1 S -1
1 1 M -1
2 1 M 1
3 1 S 1
4 1 S -1
5 2 S -1
6 2 M -1
7 2 M 1
8 2 L 1
9 2 L 1
10 3 L 1
11 3 M 1
12 3 M 1
13 3 L 1
14 3 L -1
import pandas as pd
import numpy as np
def tokey(col_name, category, y): # 定义写key的函数,比如产生 'X1=3|Y=1'
return col_name + "=" + str(category) + "|Y=" + str(y)
df = pd.read_csv("../../datas/bayes_lihang.txt")
lam = 1 # 平滑因子
P = {} # 用于存储所有概率的字典
Y = df["Y"].value_counts().keys() # 获取类别种类的list
print(Y)
col_names = df.columns.tolist()[:-1] # 获取特征列名
print(col_names)
for y in Y: # 遍历每个类别
df2 = df[df["Y"] == y] # 获取每个类别下的DF
p = (df2.shape[0] + lam) / (df.shape[0] + len(Y) * lam) # 计算先验概率
P[y] = p # 将先验概率加入P
for col_name in col_names: # 遍历每个特征
categorys = df2[col_name].value_counts().keys() # 获取每个特征下特征值种类的list
for category in categorys: # 遍历每个特征值
p = (df2[df2[col_name] == category].shape[0] + lam) / (
df2.shape[0] + len(categorys) * lam) # 计算在某类别下,特征=某特征的条件概率
P[tokey(col_name, category, y)] = p # 将条件概率加到P
print(P)
X = [2, "S"] # 待测数据
res = [] # 用于存储属于某一类别的后验概率
for y in Y: # 遍历类别
p = P[y] # 获取先验概率
for i in range(len(X)): # 遍历特征
p *= P[tokey(col_names[i], X[i], y)] # 获取条件概率
res.append(p) # 将后验概率加入res
print(p)
print(Y[np.argmax(res)]) # 返回最大的后验概率对应的类别
显现效果
Int64Index([1, -1], dtype='int64')
['X1', 'X2']
{1: 0.5882352941176471, 'X1=3|Y=1': 0.4166666666666667, 'X1=2|Y=1': 0.3333333333333333, 'X1=1|Y=1': 0.25, 'X2=M|Y=1': 0.4166666666666667, 'X2=L|Y=1': 0.4166666666666667, 'X2=S|Y=1': 0.16666666666666666, -1: 0.4117647058823529, 'X1=1|Y=-1': 0.4444444444444444, 'X1=2|Y=-1': 0.3333333333333333, 'X1=3|Y=-1': 0.2222222222222222, 'X2=S|Y=-1': 0.4444444444444444, 'X2=M|Y=-1': 0.3333333333333333, 'X2=L|Y=-1': 0.2222222222222222}
0.0326797385620915
0.06100217864923746
-1
来源:https://blog.csdn.net/weixin_44883371/article/details/99543887