机器学习_贝叶斯分类

目录

一、概念

1、原理

2、离散 & 连续

2.1、离散

2.2、连续

二、贝叶斯公式实战 

1、样本

2、 计算先验概率

3、计算条件概率(离散&连续)

(1)离散:不帅、稳定、聪明、幽默

(2)连续:身高


一、概念

1、原理

先计算某个特征的先验概率,利用贝叶斯公式计算后验概率,选择后验概率最大的那个类别作为待测样本的类别分类。

 P(A|B)=\frac{P(B|A)\cdot P(A)}{P(B)}

P(A|B)后验概率,贝叶斯公式计算的输出
P(B|A)条件概率
P(A)\ P(B)先验概率,直接通过已知数据得到每个特征信息的概率

【ps但计算先验概率P(B)是很难求的,所以一般情况下在计算后验概率中我们不计算分母的值,而是退而求其次,计算分子的值并比较大小,找到最大值】

2、离散 & 连续

2.1、离散

直接运用贝叶斯公式求得后验概率即可。

2.2、连续

利用高斯密度函数,计算均值\mu_{c,i}方差\sigma_{c,i}^2[其实就是概率论]。

1)假定密度函数 :p(x_i\left|c\right)\sim\mathrm{N}(\mu_{c,i},\sigma_{c,i}^2)

2)利用均值和方差计算后验概率:  p(x_i\left|c\right)=\frac1{\sqrt{2\pi}\sigma_{c,i}}exp(-\frac{(x_i-\mu_{c,i})^2}{2\sigma_{c,i}^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("达咩!")

 

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值