首先上贝叶斯公式:
基本等式:P(A|B)*P(B)= P(B|A)*P(A)
下面解释几个具体应用到朴素贝叶斯例子和解决方法
例子一:黑白球问题---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一个盒子30黑,10个白球;另一个盒子20黑,20白。
现在摸出一个发现是白球,那么它来自第一个盒子的概率?
解答:
首先确定贝叶斯等式。
P(第一个盒子|白球)* P(白球)= P(白球|第一个盒子)* P(第一个盒子)
X*(30/80)=(1/4)*(1/2)
解得X=1/3
例子二:假阳性问题---------------------------------------------------------------------------------------------------------------------------------------------------
已知某种疾病的发病率是0.001,即1000人中会有1个人得病。现有一种试剂可以检验患者是否得病,它的准确率是0.99,即在患者确实得病的情况下,它有99%的可能呈现阳性。它的误报率是5%,即在患者没有得病的情况下,它有5%的可能呈现阳性。现有一个病人的检验结果为阳性,请问他确实得病的可能性有多大?
解答:
首先确定贝叶斯等式。
P(确实得病|检验阳性)*P(检验阳性)= P(检验阳性|确实得病)*P(确实得病)
X*(0.001*0.99+0.999*0.05)=0.99*0.001
X= 0.01980019800
例子三:垃圾邮件问题--------------------------------------------------------------------------------------------------------------------------
问题:有一封邮件如何判定这个邮件是不是垃圾邮件? 假定我们已经有了好几封邮件的训练材料,同时做出了是否垃圾的分类。
解决:P(邮件是垃圾邮件|邮件包含某个词汇集合)*P(邮件包含词汇集合)
= P(某个词汇集合set |垃圾邮件)*P(垃圾邮件)
= P(word1|垃圾邮件)* P(word2|垃圾邮件)….*P(wordN|垃圾邮件)*P(垃圾邮件)
上面这个等式主要有两个部分
P(word1|垃圾邮件):通过已有的垃圾邮件训练集,我们可以计算这个word1在垃圾邮件词汇集合所占的频率,这就是我们要的值。
P(垃圾邮件): 我们可以通过计算垃圾邮件所占整个训练邮件集合的比例可以得到,比如训练集有5个email,3个是junkEmail,那么垃圾概率0.6。
具体的实现可见另一个篇博文
例子四:拼写错误检查案例---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
问题:拼写错误这个例子就我们在百度谷歌搜索时,打错了某个单词,会发现搜索引擎能够自动识别拼写错误,显示正确单词?
解决:如何做呢?可以根据简单的统计,和朴素贝叶斯公式去计算得到
首先看贝叶斯公式,规定我们真正想打的单词事件为p(想打c),我们实际出来的单词事件为p(实际打w)
对于想打c,却打出w这种事件的贝叶斯等式: p(想打c|实际打w)*p(实际打w)=p(实际打w|想打c)*p(想打c),
其中
化简
p(想打c|实际打w)
= p(实际打w|想打c)*p(想打c)/p(实际打w)
= p(实际打w|想打c)*p(想打c)
现在我们面临了两个项:
1 p(想打c)这个先验概率如何算呢? 这个可以理解我,某个人闲着没事随便打些话,某个单词的概率,这个和我们的使用习惯有关,从大众来看,通过一本小说啊可以大概算出来各个单词出现的频率的
2 p(实际打w|想打c)打字错误
这个有两种错误,
一种是认知上错了,比如calendar,我就记成了calender是很常见的一个例子
另一种就是打字机械错误,就是按错了,这种情况可能有漏打,多打,顺序错,等等 比如想打weng,打出来wegn等等
这里我们只分析机械错误,分析两种情况
1)打错一个字 包含(少打一个字,多打一个字,错打一个字,单词中一个和另一个字母交换的情况)
2)打错两个字。 也包含类似少打多打等情况,其实错两个字也可以直接理解为在正确字-->打错一个字--->又打错了一个字这种情况
我们的目标在于打出来一个w,究竟我想打的是c1,还是c2,还是c3呢?
p(实际打w|想打c1)*p(想打c1)
p(实际打w|想打c2)*p(想打c2)
p(实际打w|想打c3)*p(想打c3)
贝叶斯转换过来就是上面这三个概率里面那个大呢?
最大的困难在于我们根本没有训练数据集来训练计算这个因子,试想你如何统计你要打的是word这个词,但是你打的是wor, work,等等的概率呢? 这个数据要做很多功课才能拿到。
那么如何办? 我们简化一下,首先考虑下 p(实际打w|想打c)*p(想打c) 这个乘积中两个因子的影响力问题。
1)我们假定打错类型不同的时候,p(实际打w|想打c) 的影响力远远大于p(想打c)这个因子。
什么意思? 我说的"打错类型不同",就是指打错错字数目的不同, 比如"w相比c只错一个"和"w相比c错了两个字"就是两个类别,这两个类别对比我们可以发现,显然正常人打字的时候只打错一个字的概率更高些,比如实际打出来pigg,而我们想打的是pig,还是dig呢?pigg相对pig只多了一个字,pigg相对dig相对则有两个变化了,因此我们要打pig的概率更高。
因此,在错误类别不同的时候,我们假定错一个字就是比错两个字要高,对于p(实际打w|想打c)*p(想打c) 而言就是,p(打错一个字|想打c1)*p(想打c1)就是大于p(打错2个字|想打c2)*p(想打c2),根本不管p(想打c1)和p(想打c2)哪个大,哪个小这个因子。
那么问题又来了,加入错字数目是一样的呢?如果实际出来一个是pigg,我们到底是想打piggy,还是pig呢?都是一字之差啊
2)我们假定错字相同的时候,p(想打c)这个因子开始起作用了
由于pig更加常用些,所以P(piggy)<P(pig), 因此实际打出来pigg,我们一般更有可能打的pig,而不是piggy,前者更加常见
例子六:银行借贷案例 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我们已知某个人的一些信息,如何确定这个人是不是有可能拖欠贷款呢?
id
有房
婚姻
年收入
拖欠贷款
1
是
单身
125k
0
2
否
已婚
100k
0
3
否
单身
70k
1
4
是
已婚
120k
0
5
否
离婚
95k
1
6
否
已婚
60k
0
7
是
离婚
85k
0
8
否
单身
85k
1
我们已经知道上面这些训练数据了,那么通过贝叶斯公式,我们可以得到这个式子
P( 拖欠贷款 | (某个人有房,已婚,年收入120k) )
= P( 某个人这些条件 | 拖欠贷款 ) * P(拖欠贷款)/ P( 某个人这些条件 )
= P( 某个人这些条件 | 拖欠贷款 ) * P(拖欠贷款) / 1
= P(有房|拖欠贷款)*P(已婚|拖欠贷款)*P(年收入120k|拖欠贷款)*P(拖欠贷款)
P(拖欠贷款) 我们可以通过训练数据集的拖欠率计算出来
P(有房|拖欠贷款) P(已婚|拖欠贷款) 也可以看拖欠贷款的条目里面是否有房统计计算出来
需要额外注意的则是 P(已婚|拖欠贷款) 的计算,为什么呢?
有房,已婚这种现象是离散型的,而且可以枚举出来
但年收入数据似乎连续性的,不可穷尽,如何解决? 可以通过正态分布去模拟年收入数据出现的概率。
也就是说我们假定来银行贷款这些人的年收入是正态分布的,中间收入多,两边收入少。
比如我们这里的数据
3
否
单身
70k
1
5
否
离婚
95k
1
8
否
单身
85k
1
我们通过收入数据集 70k 95k 85k 计算数据集的均值和方差,从而确定各个收入值出现对应的概率
朴素贝叶斯的根本目的在于分类,尤其是基于一组特征判断分类,
通用套路就是使用贝叶斯和独立事件分解法,将"组特征问题",转化拆分成 "单特征问题后验概率问题"。
P(分类|一组特征)=P(一组特征|分类)*P(某类)== P(特征1|某类) * P(特征2|某类)*P(特征3|某类)*P(属于某个类)
下面这个步骤图比较清楚的,摘自lebo2sk.cnblogs.com