从贝叶斯出发,如何真正的理解算法?

大学时学习了很多高深的课程,什么数学物理方法、小波函数等等,但现在脑海里估计已经一片空白,反正大概是一堆公式和解题方法吧,其实就是在当时,也根本没深究过这些数学公式的来龙去脉,更无法理解这些公式后面的光辉思想。

贝叶斯算法大名鼎鼎,但用过贝叶斯的估计没几个能从业务的角度去真正理解贝叶斯吧?有多少人能将贝叶斯思想自然的用于解释生活中的各种现象呢?在电梯里你能用几句话跟领导解释清楚吗?

当然直接拿着贝叶斯公式或者调用一个函数的确可以快速解决问题,但这种方法显然没法内化,逻辑上的推导才是算法精神和乐趣所在,对于一个建模的人来说,如果有时间,还是要尽量让一个算法长在自己心里,语言和工具总会不断被更新,你也许永远跟不上这个节奏,唯有里面的思想是持久的,也是一大把年纪后能留下的唯一的算法资产,特别是如果其还能指导你的生活,知道为什么总是很重要。

1、关于信念

你相信上帝吗?你相信中医吗?你相信全球变暖是人为造成的吗?你相信转基因食品安全吗?你相信大年初一去灵隐寺烧香能带来好运吗?信或不信,我们可以用一个量化数字来表示,比如说概率,大年初一去灵隐寺烧香能带来好运的可能性是90%,这是主观概率,就好比天气预报说明天下雨的概率90%一样。

真正的深信不疑或彻底不信都是很少的,一般情况下对一般有争议的问题我们都是抱着将信将疑的态度,信念值在0.01%到99.99%之间,而且,我们对大多数事物的信念值都在动态变化,比如有什么特别突兀的新东西出来,我们一开始可能是不信的,随着证据增多,慢慢增加信念,那么,我如何基于这些证据去计算新的信念值?

2、贝叶斯的困惑

所谓的贝叶斯方法源于他生前为解决一个“逆概”问题写的一篇文章,而这篇文章是在他死后才由他的一位朋友发表出来的。在贝叶斯写这篇文章之前,人们已经能够计算“正向概率”,如“假设袋子里面有N个白球,M个黑球,你伸手进去摸一把,摸出黑球的概率是多大?”

而一个自然而然的问题是反过来:“如果我们事先并不知道袋子里面黑白球的比例,而是闭着眼睛摸出一个(或好几个)球,观察这些取出来的球的颜色之后,那么我们可以就此对袋子里面的黑白球的比例作出什么样的推测,随着取出的球越来越多,我的推测是否也会变化?”

实际上,贝叶斯当时的论文只是对这个问题的一个直接的求解尝试,并不清楚他当时是不是已经意识到这里面包含着的深刻的思想。然而后来,贝叶斯方法席卷了概率论,并将应用延伸到各个问题领域,所有需要作出概率预测的地方都可以见到贝叶斯方法的影子,特别地,贝叶斯成为机器学习的核心方法之一。

3、从业务出发推导贝叶斯定理

如果我在决策时掌握所有的信息,我当然能计算一个客观的概率,比如在一个桶里有黑白色的球,如果我事先知道里面黑白球的比例,我自然知道我随机拿到一个白球的概率是多少,如果我事先知道去灵隐寺获得好运的可能性就是90%,我自然会在某次路过灵隐寺的时候进去烧香。

可是生活中绝大多数决策面临的信息是不全的,我们手里只有有限的几个证据,而贝叶斯定理的精神在于,人类的观察能力是有限的,既然无法得到全面的信息,我们就在证据有限(表面)的情况下,尽可能地做一个更好的判断,下面我们先祭出贝叶斯公式,然后尝试用灵隐寺烧香能否显灵的例子推导出它:

P(A/B)=P(B/A)/P(B)*P(A)

这里P(A)代表认为升职的概率,B代表一个与A相关的事件(实例),比如“我朋友去年去了灵隐寺烧香,结果他升职了”,P(A/B)代表在B发生的情况下,A发生的概率,其他类似。

P(A)代表了我的原始信念A,就是说我对于升职有一个初始的判断概率,比如15%。P(A/B)代表某个实际事件发生后,有了新的证据,我需要对于原始的信念A做个调整,你可以把A当成你对一般情况的理论预言,而B是一次实验结果,有了新的实验结果,你就调整自己的理论预言,这个新的预言就是P(A/B)。

那么P(A/B)这个新的预言如何计算呢?

首先,跟初始的P(A)有关系,假如P(A)一开始极小,则再多的事件发生你也不会改变初衷,我们的当前观点肯定受先前观点的影响。

其次,跟P(B/A)/P(B)也有关系,就是说如果在原始信念P(A)作用下发生某个特定事件(B)的可能性相对更高了,则我由于这个事件改变原始信念的可能性就越高,比如这里P(B)代表去灵隐寺的概率,P(B/A)就代表升职的人中去过灵隐寺的的概率,两者比值就表示信念由于事实改变的相对大小,注意好好理解这句话。

最后,我们就得到了能业务化解释的贝叶斯公式:P(A/B)=P(B/A)/P(B)*P(A),假如你真理解了,你就不会纠结搞混这个公式。

4、从技术出发推导贝叶斯定理

当然,如果纯粹去推导出这个公式,其实也是容易的,笔者这里简要示意下:

从贝叶斯出发,如何真正的理解算法?_第1张图片

U代表全空间,A代表升职,B代表去灵隐寺,C代表交集,很容易推导:

P(A,B)=C/U

P(A/B)*P(B)=C/B*B/U=C/U

P(B/A)*P(A)=C/A*A/U=C/U

即P(A/B)=P(B/A)/P(B)*P(A)

5、生活的启示

请看以下第一张图,你认为大树后面是一个箱子,还是两个箱子,或是三个箱子,为什么? 如果你认为是一个箱子,请看第二张图,你到底凭什么判断是一个箱子?

从贝叶斯出发,如何真正的理解算法?_第2张图片
从贝叶斯出发,如何真正的理解算法?_第3张图片

很简单,你会说:要是真的有两个箱子那才怪了,怎么就那么巧这两个箱子刚刚好颜色相同,高度相同呢?

那么,如何证明?

我们可以很容易用贝叶斯来解释这个生活常识问题,假如A1代表认为是一个箱子,A2代表二个箱子,B代表观察到的事件,则其实求解P(A1/B)、P(A2/B)哪个概率最大?

P(A1/B)=P(B/A1)/P(B)*P(A1)

P(A2/B)=P(B/A2)/P(B)*P(A2)

显然P(B/A2)猜测后面是两个箱子使得我们的观测结果成为小概率的时候,我们才会说才怪呢?哪能这么巧呢?

6、中文分词问题

中文分词领域就用到了贝叶斯,分词问题的描述为:给定一个句子(字串),如:南京市长江大桥,如何对这个句子进行分词(词串)才是最靠谱的,例如:

1. 南京市/长江大桥

2. 南京市长/江大桥

这两个分词,到底哪个更靠谱呢?

我们用贝叶斯公式来形式化地描述这个问题,令 B 为句子,A 为词串(一种特定的分词假设),我们就是需要寻找使得 P(A|B) 最大的 A ,使用一次贝叶斯可得:

P(A分词/B句子)=P(B/A)/P(B)*P(A)

由于P(B)对于每个A都一样,P( B/A )近似为1,则P(A/B)主要由P(A)决定,也就是要寻找一种分词A使得这个句子B的概率最大化。

如何计算一个词串,A=W1,W2,W3,W4...的可能性呢?

我们知道,根据联合概率的公式展开:P(W1, W2, W3, W4 ..) = P(W1) * P(W2|W1) * P(W3|W2, W1) * P(W4|W1,W2,W3) * ...,然而不幸的是随着条件数目的增加(P(Wn|Wn-1,Wn-2,..,W1) 的条件有 n-1 个),数据稀疏问题也会越来越严重,即便语料库再大也无法统计出一个靠谱的 P(Wn|Wn-1,Wn-2,..,W1) 来。

为了缓解这个问题,科学家们一如既往地使用了“天真”假设:我们假设句子中一个词的出现概率只依赖于它前面的有限的 k 个词(1个词就是朴素贝叶斯),这个就是所谓的“有限地平线”假设。

虽然这个假设很傻很天真,但结果却表明它的结果往往是很好很强大的,现在式子变成了:P(W1) * P(W2|W1) * P(W3|W2) * P(W4|W3) ..。

对于我们上面提到的例子“南京市长江大桥”由于“南京市长”和“江大桥”在语料库中一起出现的频率为 0 ,这个整句的概率便会被判定为 0 ,从而使得“南京市/长江大桥”这一分词方式胜出。

其他应用案例比如:

垃圾邮件识别(过滤器):P(A(垃圾邮件)/B(N个单词组成的垃圾邮件));

统计机器翻译:P(A(翻译成的外文)/B(待翻译的句子));

语音识别:P(A(推测出发送的句子)/B(观测到的语音信号));

7、一个具体计算案例

一般人中艾滋病的携带者比例是0.01%,如果一个人检测血液呈阳性,其得艾滋的概率是多少?(如果是真艾滋,血液检测的准确性达到99.9%,如果是假艾滋,血液检测准确率是99.99%)。

P(A(得艾滋)/B(检测呈阳性))= P(B/A)/P(B)*P(A)=99.9%/(0.01%*99.9%+99.9%*0.01%)*0.01%=50%。

真没想到,在这么高的血液检测准确性条件下,一个检测血液呈阳性的人真得艾滋的概率也只有50%。

直观解释:随机找1万人做实验,根据分布,只有1人得艾滋,由于检测手段强,这个人会被检测出来,但剩下的9999人虽然没艾滋,但检测出艾滋的概率由于0.01%,还是有1人被错误检测,因此共有2人检测成阳性,得艾滋的概率为50%。

因此,如果一个事情很罕见,即先验概率很低,即使再多的可疑事实出现,也要注意可能误判,比如不要对抓特务报太大信心!

笔者学习贝叶斯也是东看看,西看看,看了忘,忘了看,这次把学习的综合写成一篇还算易懂的文章,算是了却一个心愿,对于任何一个公式一定要在业务上搞懂搞透,起码能自圆其说吧,贝叶斯算是好懂的,但很多算法不是这样,公式的推导就已经让人发疯,更别提搞懂来龙去脉甚至跟生活去接轨了,从历史上看,牛人一般也只愿意show 结果,而不愿意把思考过程写下来,比如费马定理的证明,这个非常遗憾。

好了,贝叶斯介绍完了,如果你真的看到这里,是否对于其思想有一个新的理解?作为传统企业的一个技术人员,其实对于算法的掌控深度是非常纠结的,因为即使理解透了也可能于工作无益,这并非是性价比很高的方式,工程上能搞定就可以了。

但笔者想的是,这是一种学习方式,也许不用那么功利,自己觉得值就去干吧,没有谁能说现在学哪个知识就一定将来有用,或者没用,未来是如此不确定,在这个大数据时代。

微信公众号:与数据同行(ysjtx_fyp)  微信号:fuyipingmnb  欢迎交流!

你可能感兴趣的:(从贝叶斯出发,如何真正的理解算法?)