zoukankan      html  css  js  c++  java
  • 嫁不嫁问题让你通俗易懂的了解朴素贝叶斯分类

    概述

    贝叶斯分类算法是统计学的一种概率分类方法,朴素贝叶斯分类是贝叶斯分类中最简单的一种。其分类原理就是利 用贝叶斯公式根据某特征的先验概率计算出其后验概率,然后选择具有最大后验概率的类作为该特征所属的类。之 所以称之为”朴素”,是因为贝叶斯分类只做最原始、最简单的假设:所有的特征之间是统计独立的。 

    1.条件概率公式

    条件概率(Condittional probability),就是指在事件B发生的情况下,事件A发生的概率,用P(A|B)来表示。

    根据文氏图可知:在事件B发生的情况下,事件A发生的概率就是P(A∩B)除以P(B)。

    同理可得:

    所以

    全概率公式:如果事件 构成一个完备事件且都有正概率,那么对于任意一个事件B则 有:

    2.贝叶斯推断

    根据条件概率和全概率公式,可以得到贝叶斯公式如下 :

    P(A)称为"先验概率”(Prior probability),即在B事件发生之前,我们对A事件概率的一个判断。
    P(A| B)称为"后验概率" (Posterior probability),即在B事件发生之后,我们对A事件概率的重新评估。
    P(B |A)/P(B)称为"可能性函数”(Likely hood), 这是一个调整因子,使得预估概率更接近真实概率。
    所以条件概率可以理解为:后验概率=先验概率*调整因子
    如果”可能性函数">1,意味着"先验概率"被增强,事件A的发生的可能性变大;
    如果"可能性函数"=1,意味着B事件无助于判断事件A的可能性;
    如果”可能性函数"<1,意味着"先验概率"被削弱,事件A的可能性变小。

     

     

     

     

    3.案例分析(帅,高,上进,性格好,嫁不嫁问题?。。。)

     

    假如:不帅,性格不好,个子矮,不上进的男生,女生选择嫁的概率是多少?

    即求出:

    P(嫁|不帅, 性格不好,不高,不上进)
    根据贝叶斯定理,拆成了三个概率的问题
    1.P1=P(不帅,性格不好,不高,不上进|嫁)=P(嫁)*P(不帅|嫁)*P(性格不好|嫁)*P(不高|
    嫁)*P(不上进|嫁)
    2.P(嫁)
    3.P2=P (不帅,性格不好,不高,不上进) =P(不帅)*P(性格不好)*P(矮)*P(不上进)
    结果: P(嫁|不帅, 性格不好,不高,不上进)=P1*P(嫁)/P2

    5.案例代码实现

    生成样本(两个方法:随机生成,静态手动插入,选其一即可)

     1 # 方法1,随机生成样本
     2 import random
     3 def create_Data1():
     4     looks=['','不帅']
     5     characters=['','不好'] #性格
     6     heights=['','']
     7     progress=['上进','不上进']
     8     marriages=['','不嫁']
     9     datasets=[]
    10     for i in range(0,20):
    11         dataset = []#创建样本
    12         dataset.append(random.choice(looks)) #每个样本随机选择长相
    13         dataset.append(random.choice(characters))#每个样本随机选择性格
    14         dataset.append(random.choice(heights)) #每个样本随机选择高矮
    15         dataset.append(random.choice(progress))#每个样本随机选择上不上进
    16         dataset.append(random.choice(marriages))#每个样本随机选择嫁不嫁
    17         print(dataset)
    18         datasets.append(dataset)#将每一组样本加入到样本集中
    19     print(datasets)
    20     return datasets
     1 # 方法2 指定数据样本
     2 import random
     3 def create_Data():
     4     datasets=[
     5               ['','不好','','不上进','不嫁'],
     6               ['不帅','','','上进','不嫁'],
     7               ['','','','上进',''],
     8               ['不帅','','','上进',''],
     9               ['','不好','','上进','不嫁'],
    10               ['不帅','不好','','不上进','不嫁'],
    11               ['','','','不上进',''],
    12               ['不帅','','','上进',''],
    13               ['','','','上进',''],
    14               ['不帅','不好','','上进',''],
    15               ['','','','不上进','不嫁'],
    16               ['','','','不上进','不嫁']
    17              ]
    18     return datasets
     1 # 计算函数
     2 def compute_threeProb(datasets,c1,c2,c3,c4,c5):# 传入训练数据集,需要判断的数据(帅不帅,性格好不好,高还是矮,上不上进,嫁不嫁)
     3     C5_count=0 #满足c5条件的数据条数
     4     Result_count=0 #满足c5条件下且满足需要判断的四个特征的个数
     5     p3_count=0 #计算样本中符合要判断的四个特征的个数
     6     Allcount=len(datasets) #数据样本条数
     7     for dataset in datasets:
     8         #满足c5条件的数据条数
     9         if dataset[4]==c5:
    10             C5_count+=1
    11             #该类别下满足需要判断的四个特征的个数
    12             if dataset[0]==c1 and dataset[1]== c2 and dataset[2]==c3 and dataset[3]==c4:
    13                 Result_count+=1
    14         #计算样本中符合要判断的四个特征的个数
    15         if dataset[0] == c1 and dataset[1] == c2 and dataset[2] == c3 and dataset[3] == c4:
    16             p3_count+=1
    17 
    18     p1=(C5_count/Allcount)*(Result_count/C5_count) #类似 P(不帅,性格不好,不高,不上进|嫁) 
    19     p2=C5_count/Allcount  #类似 P(嫁)
    20     p3=p3_count/Allcount #类似 P(不帅,性格不好,不高,不上进)
    21     if p3!=0:
    22         prob_marriage=p1*p2/p3
    23         print(prob_marriage)
    24         return prob_marriage
    25     else:
    26         print("不存在!")
    27         return 0
    1 # 调用
    2 datasets=create_Data()
    3 rel=compute_threeProb(datasets,c1='',c2='',c3='',c4='上进',c5='')
    4 print(f'此情况嫁的概率为:{rel}')

    运行结果:

    6.优缺点:

    优点:
    (1) 算法逻辑简单,易于实现(算法思路很简单,只要使用贝叶斯公式转化即可!)
    (2)分类过程中时空开销小(假设特征相互独立,只会涉及到二维存储)
    缺点:
    (1)理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率,但是实际上并非总是如此,
    这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在
    属性个数比较多或者属性之间相关性较大时,分类效果不好。
    (2)在属性相关性较小时,朴素贝叶斯性能最为良好,对于这一点,有半朴素贝叶斯之类的算法
    通过考虑部分关联性适度改进。

      

      

  • 相关阅读:
    Oracle-启动和关闭oracle的归档(ARCHIVELOG)模式
    Linux-数据表示方式
    Linux-21-30
    linux-1-10
    自律
    jenkins-修改系统时间
    jenkins-通过ssh username with private key配置节点服务器
    jenkins-slave开机自动启动
    mongodb-mongo使用
    mongodb-centos76yum安装mongodb
  • 原文地址:https://www.cnblogs.com/FYZHANG/p/11673400.html
Copyright © 2011-2022 走看看