目录
一、概念
1、原理
先计算某个特征的先验概率,利用贝叶斯公式计算后验概率,选择后验概率最大的那个类别作为待测样本的类别分类。
P(A|B) | 后验概率,贝叶斯公式计算的输出 |
P(B|A) | 条件概率 |
P(A)\ P(B) | 先验概率,直接通过已知数据得到每个特征信息的概率 |
【ps但计算先验概率P(B)是很难求的,所以一般情况下在计算后验概率中我们不计算分母的值,而是退而求其次,计算分子的值并比较大小,找到最大值】
2、离散 & 连续
2.1、离散
直接运用贝叶斯公式求得后验概率即可。
2.2、连续
利用高斯密度函数,计算均值和方差
[其实就是概率论]。
1)假定密度函数 :
2)利用均值和方差计算后验概率:
二、贝叶斯公式实战
1、样本
(勿喷,就当写作业太无聊了随机的)
帅不帅 | 情绪稳定? | 笨不笨 | 幽默? | 身高 | 嫁不嫁? |
帅 | 不稳定 | 笨 | 不幽默 | 180.5 | 不嫁 |
不帅 | 稳定 | 笨 | 幽默 | 178.8 | 不嫁 |
帅 | 稳定 | 笨 | 幽默 | 186.7 | 嫁 |
不帅 | 稳定 | 聪明 | 幽默 | 175.2 | 嫁 |
帅 | 不稳定 | 笨 | 幽默 | 178.9 | 不嫁 |
不帅 | 不稳定 | 笨 | 不幽默 | 167.9 | 不嫁 |
帅 | 稳定 | 聪明 | 不幽默 | 188 | 嫁 |
不帅 | 稳定 | 聪明 | 幽默 | 179.8 | 嫁 |
帅 | 稳定 | 聪明 | 幽默 | 185.6 | 嫁 |
不帅 | 不稳定 | 聪明 | 幽默 | 181.5 | 嫁 |
帅 | 稳定 | 笨 | 不幽默 | 177.3 | 不嫁 |
帅 | 稳定 | 笨 | 不幽默 | 183.5 | 不嫁 |
#数据集
def load_dataset():
#训练集
train_data = [ ['帅','不稳定','笨','不幽默',180.5,'不嫁'],
['不帅','不稳定','笨','幽默',178.8,'不嫁'],
['帅','稳定','笨','幽默',186.7,'嫁'],
['不帅','稳定','聪明','幽默',175.2,'嫁'],
['帅','不稳定','笨','幽默',178.9,'不嫁'],
['不帅','不稳定','笨','不幽默',167.9,'不嫁'],
['帅','稳定','聪明','不幽默',188,'嫁'],
['不帅','稳定','聪明','幽默',179.8,'嫁'],
['帅','稳定','聪明','幽默',185.6,'嫁'],
['不帅','不稳定','聪明','幽默',181.5,'嫁'],
['帅','稳定','笨','不幽默',171.3,'不嫁'],
['帅','稳定','笨','不幽默',183.5,'不嫁']]
#测试集
test_data = ['不帅','稳定','聪明','幽默',178]
#特征
labels = ['帅不帅','情绪','笨不笨','幽不幽默','身高']
return train_data,test_data,labels
train_data,test_data,labels = load_dataset()
print("训练集:\n",train_data)
print("测试集:\n",test_data)
print("样本特征:\n",labels)
【输出】
2、 计算先验概率
#计算先验概率
def prior():
train_data =load_dataset()[0]
count_yes = 0
count_no = 0
count_all = len(train_data)
for i in train_data:
if i[-1] == '嫁':
count_yes += 1
else:
count_no += 1
P_yes = round(count_yes/count_all,3)
P_no = round(count_no/count_all,3)
return P_yes,P_no
P_yes,P_no = prior()
print("P(嫁) = ",P_yes)
print("P(不嫁) = ",P_no)
3、计算条件概率(离散&连续)
(1)离散:不帅、稳定、聪明、幽默
def conditional_P(feature_index, feature_value, cls):
train_data, _, _ = load_dataset()
# 计算特征值与特定类别同时匹配的次数
matching_count = sum(1 for item in train_data if item[feature_index] == feature_value and item[-1] == cls)
# 计算类别 cls 的总次数
cls_count = sum(1 for item in train_data if item[-1] == cls)
# 计算条件概率
if cls_count > 0:
probability = matching_count / cls_count
else:
probability = 0 # 防止除零错误
return round(probability, 3)
# 计算在“嫁”和“不嫁”结果下下,待测样本数据特征的概率
P0_yes = conditional_P(0, '不帅', '嫁')
P0_no = conditional_P(0, '不帅', '不嫁')
P1_yes = conditional_P(1, '稳定', '嫁')
P1_no = conditional_P(1, '稳定', '不嫁')
P2_yes = conditional_P(2, '聪明', '嫁')
P2_no = conditional_P(2, '聪明', '不嫁')
P3_yes = conditional_P(3, '幽默', '嫁')
P3_no = conditional_P(3, '幽默', '不嫁')
print(f"P(不帅|嫁) = {P0_yes}")
print(f"P(不帅|不嫁) = {P0_no}")
print(f"P(稳定|嫁) = {P1_yes}")
print(f"P(稳定|不嫁) = {P1_no}")
print(f"P(聪明|嫁) = {P2_yes}")
print(f"P(聪明|不嫁) = {P2_no}")
print(f"P(幽默|嫁) = {P3_yes}")
print(f"P(幽默|嫁) = {P3_no}")
(2)连续:身高
先计算均值、方差、概率密度,再计算条件概率
#计算均值和方差函数
def calculate_para(data):
mean = np.mean(data)
std = np.std(data)
return mean,std
#计算高斯概率密度
def gs(x,mean,std):
e = np.exp(-((x-mean)**2/(2*std**2)))
return (1/(np.sqrt(2*np.pi)*std))*e
def conditional_P_height(feature_index,value,cls):
train_data,_,_ = load_dataset()
#计算均值、方差、高斯概率密度
cls_data = [item[feature_index] for item in train_data if item[-1] ==cls]
mean,std = calculate_para(cls_data)
P_h = gs(value,mean,std)
return P_h
P_height_yes = conditional_P_height(4, 186, '嫁')
P_height_no = conditional_P_height(4, 186, '不嫁')
print(f"P(身高=186 | 嫁) = {P_height_yes}")
print(f"P(身高=186 | 不嫁) = {P_height_no}")
4、计算后验概率
yes = P_yes*P0_yes*P1_yes*P2_yes*P3_yes*P_height_yes
no = P_no*P0_no*P1_no*P2_no*P3_no*P_height_no
print("P(嫁 | i) = ",yes)
print("P(不嫁 | i) = ",no)
5、分类
print("man : '不帅','稳定','聪明','幽默',178")
if yes > no:
print("嫁!")
else:
print("达咩!")