机器学习实战(5)—— 朴素贝叶斯原理部分
小明在读大学期间,在图书馆自习时发现一个小姐姐,然后一见钟情,因为小明性格比较内向,为了能见到自己的“女神”,于是每天都去图书馆的那个位置“自习”,然后连续去了2个月(他真的还没开始搭讪~),发现小姐姐某些天会来自习,不来的时候,小明也无心学习,小明想:“如果小姐姐不来,我去图书馆也学不进去啊!”机智的小明悄咪咪掏出一样“宝贝”—— 一本日记本,原来小明把每天的情况记入了日记,留下了美好回忆!数学专业的小明想起了课堂上老师讲的朴素贝叶斯算法,这日记不就是掌握的历史数据么,翻开第一页:日期:xx,周末,天朗气清惠风和畅(天晴),外面很热(温度高),小姐姐来开着空调的图书馆自习了,看的书是泛函分析,于是我拿出这本书认真复习起来,希望之后有话题可聊(撩)!看到这里,小明迅速写起了公式 ......
小明统计了一下(60天)的情况:
(PS:只展示了部分数据)
朴素贝叶斯是统计学中的分类算法
贝叶斯公式:
如果看的有点晕,我们换个表达方式:
如果从小明的思路考虑,特征主要有三个:天气、温度、是否周末!
类别就是:小姐姐来 和 小姐姐没来 两类
小明今天起床发现,今天周二(非周末),天气晴朗,温度挺高的(35℃),小明掐指一算,图书馆走起!
小明具体是怎么算的?数学系的男生一般可不会拍脑袋定方案呢!
这个问题在小明的脑海中转化为:
P(去图书馆 | 非周末,晴天,温度高)和 P(不去图书馆 | 非周末,晴天,温度高)
上面两者哪个概率高?例如前者概率高,就去图书馆,反之亦然。
小明马上想到贝叶斯公式:
右边的三项内容好像能求,好像又不太好求?怎么办呢?
我们把 P(不去图书馆 | 非周末,晴天,温度高)的公式也写出来
和 P(去图书馆 | 非周末,晴天,温度高) 比较:
思考:这两个公式有什么不同的地方?有什么相同的地方?
发现这两个公式的分母一样!!!
所以,要比较两者大小,只用比较两者不同的部分(分子)
也就是变为了 比较P(非周末,晴天,温度高 | 不去图书馆 )*P(不去图书馆 )和 P(非周末,晴天,温度高 | 去图书馆 )*P(去图书馆 ) 的大小。
小姐姐60天里来了43天,还有17天没来。
小姐姐来的43天中,有28天天晴,有15天下雨。
P(不去图书馆 )= 17/60
P(去图书馆 )= 43/60
接下来计算:
P(非周末,晴天,温度高 | 不去图书馆 ) 和
P(非周末,晴天,温度高 | 去图书馆 )
这其实也不难算,你可能说:在 60 天里统计各种情况不就好啦~
等等。。先别急着统计
你想,如果数据有1000条,或者特征特别多,有20个?
例如(非周末,晴天,...,温度高 | 不去图书馆 )
你再去找找看啊?非得累死不可!
你说,那怎么办呢?
这就要引出机器学习笔试面试经常问到的一个题目了!!!
朴素贝叶斯中的“朴素”怎样理解?
用一句网络流行语就是:
“单纯不做作和外面那些妖艳______不一样” (此处请自行脑补两字的贬义词)
单纯突出:简单,对比之下,妖艳突出:复杂(你可以想想素颜和浓妆艳抹)
那你可能要问:朴素贝叶斯的简单如何体现呢?
我们回看:之前的特征主要有三个:天气、温度、是否周末!
然后每个特征有两种取值:例如天气可以取值:天晴、下雨
那这三种组合的特征就会有 2*2*2=8种
那如果有20个特征,每种去只有两种,那会有多少种呢?
2^20次方【反正很大就对了!】
所以说之前统计这些特征的组合情况来代替概率计算是非!常!麻!烦!的!
你还记得概率论里的独立性的定义么?【回顾】
设A,B为随机事件,若同时发生的概率等于各自发生的概率的乘积,则A,B相互独立。
一般地,设A1,A2,...,An是n(n≥2) 个事件,如果对于其中任意2个,任意3个,...,任意n个事件的积事件的概率,都等于各事件概率之积,则称A1,A2,...,An相互独立。
设 A,B,C 为3个事件,如果满足等式:
则称事件A,B,C相互独立。
所以“朴素”体现在:假设所有特征之间相互独立。
所以P(非周末,晴天,温度高 | 不去图书馆 )就转化为计算:
P(非周末 | 不去图书馆 )* P(晴天| 不去图书馆 )* P(温度高| 不去图书馆 )
此时,只需要分别进行简单统计即可!
同样 P(非周末,晴天,温度高 | 去图书馆 )就转化为计算:
P(非周末 | 去图书馆 )* P(晴天| 去图书馆 )* P(温度高| 去图书馆 )
小明统计了一下日记的部分信息,结果如下:
小姐姐60天里来了43天,还有17天没来。
小姐姐来的43天中,有28天天晴,有15天下雨。
小姐姐没来的17天中,有12天下雨,有5天天晴。
小姐姐来的43天中,有32天是工作日,有11天是双休日。
小姐姐没来的17天中,有12天是工作日,有5天是双休日。
小姐姐来的43天中,有25天温度高,有18天温度舒适。
小姐姐没来的17天中,有9天温度高,有8天温度舒适。
所以:
P(非周末 | 不去图书馆 )=12/17
P(晴天| 不去图书馆 )=5/17
P(温度高| 不去图书馆 )=9/17
P(非周末 | 不去图书馆 )* P(晴天| 不去图书馆 )* P(温度高| 不去图书馆 )
=12/17 * 5/17 * 9/17 = 0.1099
P(非周末 | 去图书馆 )= 32/43
P(晴天| 去图书馆 )= 28/43
P(温度高| 去图书馆 )= 25/43
P(非周末 | 去图书馆 )* P(晴天| 去图书馆 )* P(温度高| 去图书馆 )
= 32/43 * 28/43 * 25/43 = 0.2817
到这里结束了么?
答案是:还没结束
别忘了我们要比较的是:
P(非周末 | 不去图书馆 )* P(晴天| 不去图书馆 )* P(温度高| 不去图书馆 )*P(不去图书馆 )= 0.1099 * P(不去图书馆 )=0.1099 * 17/60 = 0.031
和
P(非周末 | 去图书馆 )* P(晴天| 去图书馆 )* P(温度高| 去图书馆 )*P(去图书馆 )
= 0.2817 * P(去图书馆 )= 0.2817 * 43/60 = 0.202 > 0.031
所以结论是:今天周二(非周末),天气晴朗,温度挺高的(35℃),小明掐指一算,图书馆走起!【因为小明计算得出小姐姐会去图书馆啦~】
其实你已经学到了朴素贝叶斯算法的精髓
但不要高兴的太早!
我们的朴素贝叶斯的朴素假设特征之间相互独立,这个假设往往在实际应用中是不成立的!
例如:我们之前的天气和温度两个特征,他们之间一般来说是不独立的
你想想,温度高是不是同时伴随的很可能是晴天?
这就导致了在特征个数比较多或者特征之间相关性较大时,朴素贝叶斯分类效果不好。
其实,朴素贝叶斯的有点我们也看出了,就是算法逻辑简单,易于计算实现!
讲到这里,朴素贝叶斯还没完!
大家思考:
P(非周末 | 去图书馆 )* P(晴天| 去图书馆 )* P(温度高| 去图书馆 )*P(去图书馆 )
如果统计到的情况没有在非周末去图书馆,情况会如何???
结果是P(非周末 | 去图书馆 )=0
然后导致整体:
P(非周末 | 去图书馆 )* P(晴天| 去图书馆 )* P(温度高| 去图书馆 )*P(去图书馆 )= 0
前功尽弃???emmm
如果由于计算的概率:P(非周末 | 去图书馆 )=0 而直接将整体的概率记为 0 ,这显然不太合理!
于是前人为了防止这种其他特征携带的信息被数据中没出现的特征情况“抹去”
在估计概率时候,加上了“平滑”处理:常用的有“拉普拉斯修正”、
在讲“拉普拉斯修正”之前,我们讲几个概念:
先验概率:是指根据以往经验和分析得到的概率,先验,即先于验证,就是当前事件还没发生时做出的决断!
意思是说我们人有一个常识,比如骰子,我们都知道概率是1/6,而且无数次重复实验也表明是这个数,这是一种我们人的常识,也是我们在不知道任何情况下必然会说出的一个值.而所谓的先验概率是我们人在未知条件下对事件发生可能性猜测的数学表示!
【先验概率 数学公式定义来袭】
令 Dc 表示训练集 D 中第 c 类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率:
【先验概率 我们的理解】
令Dc表示小姐姐60天内来图书馆的情况,如果观察小姐姐来没来图书馆次数够多,并且小姐姐每天来不来图书馆和其他天没关系(不存在昨天没去图书馆,今天最好去一下这种情况,体现独立 ),并且小姐姐每天来不来图书馆都是有着自己的同一套想法(体现同分布) ,则可以估计出小姐姐来图书馆的先验概率为:43/60
即:来的天数/总观察天数 , 所以先验概率是根据历史信息经验获取的!
后验概率:事情已经发生,要求这件事情发生的原因是由某个因素引起的可能性的大小
未见其人,先闻其声,你判断对方99%是女性?OK,你已经进行了一次后验概率的猜测。没错,就这么简单,因为你平常听到的女声基本都是女性发出的。
【至于为何你随口说出99%,毕竟社会上有小概率事件】
【后验概率 数学公式定义来袭】
对离散属性而言,令Dc,xi 表示Dc在第 i 个属性上取值为 xi 的样本组成的集合,则条件概率 P(xi | c)可估计为
【后验概率 我们的理解】
对于可以分类别的属性,例如天气分为晴天、下雨,令D 小姐姐来图书馆,晴天 表示在天气这个属性上取值为晴天,且小姐姐来图书馆的所有天数;D 小姐姐来图书馆 表示小姐姐来图书馆的总天数。
则P(晴天 | 小姐姐来图书馆)= 28/43
这些之前我们都算过!回顾~
刚才我们说,如果数据统计到的 P(非周末 | 去图书馆 )=0 怎么办?
“拉普拉斯修正”:
令 N 表示训练集 D 中可能的类别数,Ni 表示第 i 个属性可能的取值数,则先验概率和后验概率可以修正为:
先验概率:
后验概率:
这里N类别数为2(小姐姐去图书馆 和 小姐姐不去图书馆)
这里Ni表示是否周末这个属性有2种取值(是周末 和 非周末)
所以,使用“拉普拉斯修正后”
原来的P(非周末 | 去图书馆 )=0 这一后验概率
可以转换为
这一不为零的值,和其他后验概率和先验概率相乘,就不会导致最终的概率为 0
即:P(非周末 | 去图书馆 )* P(晴天| 去图书馆 )* P(温度高| 去图书馆 )*P(去图书馆 )不为0
后验1*后验2*后验3*先验
这就是朴素贝叶斯算法啦,听故事就学完啦~