贝叶斯分类器是一种基于统计的分类方法,用来预测诸如某个样本属于某个分类的概率有多大
基于Bayes理论
研究发现,Naïve(nave) Bayes Classifier在性能上和Decision Tree、Neural Network classifiers相当。在应用于大数据集时,具有较高的准确率和速度
Naïve Bayes Classifier假设属性值之间是独立的,因此可以简化很多计算,故称之为Naïve 。当属性值之间有依赖关系时,采用Bayesian Belief Networks进行分类。
贝叶斯推断是一种统计学方法,用来估计统计量的某种性质。
它是贝叶斯定理的应用。英国数学家托马斯·贝叶斯(Thomas Bayes)在1763年发表的一篇论文中,首先提出了这个定理。
关于贝叶斯推断,摘一段 wikipedia 上的简介:
所谓的贝叶斯方法源于他生前为解决一个“逆概”问题写的一篇文章。在贝叶斯写这篇文章之前,人们已经能够计算“正向概率”,如“假设袋子里面有N个白球,M个黑球,你伸手进去摸一把,摸出黑球的概率是多大”。
而一个自然而然的问题是反过来:“如果我们事先并不知道袋子里面黑白球的比例,而是闭着眼睛摸出一个(或好几个)球,观察这些取出来的球的颜色之后,那么我们可以就此对袋子里面的黑白球的比例作出什么样的推测”。这个问题,就是所谓的逆概问题。
贝叶斯推断及其在邮件过滤中的应用:
邮件过滤:垃圾邮件是一种令人头痛的顽症,困扰着所有的互联网用户。正确识别垃圾邮件的技术难度非常大。传统的垃圾邮件过滤方法,主要有“关键词法”和“校验码法”等。前者的过滤依据是特定的词语;后者则是计算邮件文本的校验码,再与已知的垃圾邮件进行对比。它们的识别效果都不理想,而且很容易规避。
2002年,Paul Graham提出使用“贝叶斯推断”过滤垃圾邮件。他说,这样做的效果,好得不可思议。1000封垃圾邮件可以过滤掉995封,且没有一个误判
另外,这种过滤器还具有自我学习的功能,会根据新收到的邮件,不断调整。收到的垃圾邮件越多,它的准确率就越高
贝叶斯是机器学习的核心方法之一
背后的深刻原因在于,现实世界本身就是不确定的,人类的观察能力是有局限性的
我们日常所观察到的只是事物表面上的结果,沿用刚才袋子取球的例子:
我们往往只能知道从里面取出来的球是什么颜色,而并不能直接看到袋子里面实际的情况
这个时候,需要提供一个猜测(hypothesis,更为严格的说法是“假设”,)
所谓猜测,当然就是不确定的(很可能有好多种乃至无数种猜测都能满足目前的观测),但选哪种好呢?需要做如下事情:
1. 算出各种不同猜测的可能性大小
2. 算出最靠谱(可能性最大)的猜测是什么
P(B|A) = P(A|B) * P(B) / [P(A|B) * P(B) + P(A|~B) * P(~B) ]
收缩起来就是:
P(B|A) = P(AB) / P(A)
P(B|A) = P(A|B) *P(B) / P(A)
其实这个就是贝叶斯公式
例1:拼写纠正
问题:用户输入了一个不在字典中的单词,我们需要去猜测:“他到底真正想输入的单词是什么呢?”我们需要求如下概率:
P(我们猜测他想输入的单词 |他实际输入的单词)
并找出那个使得这个概率最大的猜测单词
显然,我们的猜测未必是唯一的,比如用户输入:thew ,那么他到底是想输入the ,还是想输入thaw ?到底哪个猜测可能性更大呢?
幸运的是我们可以用贝叶斯公式来直接求出它们各自的概率
不妨将我们的多个猜测记为h1,h2,. .. ( h 代表 hypothesis),它们都属于一个有限且离散的猜测空间H(单词总共就那么多),将用户实际输入的单词记为 D( D 代表 Data ,即观测数据),于是需要求:
P(我们的猜测1 | 他实际输入的单词) 可以抽象地记为:P(h1 | D)
P(我们的猜测2 | 他实际输入的单词) 可以抽象地记为:P(h2 | D)
P(我们的猜测3 | 他实际输入的单词) 可以抽象地记为:P(h3 | D)
…
不妨统一记为:P(h | D)
运用一次贝叶斯公式,我们得到:P(h | D) = P(h) * P(D | h) / P(D)
对于不同的具体猜测h1, h2, h3 .. ,P(D) 都是一样的,所以在比较 P(h1|D) 和 P(h2|D) 时可忽略。即只需知道:
P(h | D) ∝ P(h) * P(D | h)
这个式子的抽象含义是:对于给定观测数据,一个猜测是好是坏,取决于以下两项的乘积:
这个猜测本身独立的可能性大小(先验概率,Prior )
这个猜测生成我们观测到的数据的可能性大小”(似然,Likelihood )
具体到前面的thew 例子上,含义就是,用户实际是想输入the 的可能性大小取决于如下两项的乘积:
the 本身在词汇表中被使用的可能性(频繁程度)大小(先验概率)
想打 the 却打成 thew 的可能性大小(似然)
下面的事情就很简单了,对于我们猜测为可能的每个单词计算一下P(h) * P(D | h) 这个值,然后取最大的,得到的就是最靠谱的猜测
例2:垃圾邮件过滤器
问题:给定一封邮件,判定它是否属于垃圾邮件,用 D 来表示这封邮件, D 由 N 个单词组成,用 h+ 来表示垃圾邮件,h- 表示正常邮件
问题可以形式化地描述为求:
P(h+|D) = P(h+) * P(D|h+) / P(D)
P(h-|D) = P(h-) * P(D|h-) / P(D)
P(h+) 和 P(h-) 这两个先验概率都很容易求出来,只需要计算一个邮件库里面垃圾邮件和正常邮件的比例就行了。
然而P(D|h+) 却不容易求,因为 D 里面含有 N 个单词 d1, d2, d3, .. ,所以P(D|h+) =P(d1,d2,..,dn|h+)
P(d1,d2,..,dn|h+) 是指在垃圾邮件当中出现跟目前这封邮件一模一样的一封邮件的概率是多大!
不可能发生的事件,每封邮件都是不同的,世界上有无穷多封邮件。因此,收集的训练数据库不管含了多少封邮件,也不可能找出一封跟目前这封一模一样的。那如何计算P(d1,d2,..,dn|h+)呢?
条件独立假设:假设di 与 di-1 是完全条件无关的,于是式子就简化为 P(d1|h+) * P(d2|h+) * P(d3|h+) * .. 。这也正是朴素贝叶斯方法的朴素之处。
而计算P(d1|h+) * P(d2|h+) * P(d3|h+) * .. ,只要统计di 这个单词在垃圾邮件中出现的频率即可。
朴素贝叶斯分类器
每个数据样本用一个n维特征向量表示,描述由属性对样本的n个度量。
假定有m个类。给定一个未知的数据样本X(即,没有类标号),分类法将预测X属于具有最高后验概率(条件X下)的类。即,朴素贝叶斯分类将未知的样本分配给类Ci ,当且仅当:
这样,我们最大化P(Ci|X)。其最大的类Ci称为最大后验假定。根据贝叶斯定理:
n由于P(X) 对于所有类为常数,只需要 P(Ci|X)P(Ci)最大即可。如果类的先验概率未知,则通常假定这些类是等概率的;即,P(C1)= P(C2)= P(C3) 。并据此只对P(X|Ci) 最大化。否则,我们最大化P(X|Ci)P(Ci) 。类的先验概率可以用P(Ci)=si/s 计算;其中,si是类C中的训练样本数,而s是训练样本总数。
n给定具有许多属性的数据集,计算P(X|Ci) 的开销可能非常大。为降低计算的开销,可以朴素地假设属性间不存在依赖关系。这样:
概率 P(X1|Ci) ,P(X2|Ci) ,…,可以由训练样本估计,其中:
(a) 如果Ak是分类属性,则P(Xk|Ci)=sik/si;其中sik 是在属性Ak 上具有值xk 的类Ci 的训练样本数,而si 是Ci中的训练样本数
(b) 如果是连续值属性,则通常假定该属性服从高斯分布。因而:
其中,给定类Ci的训练样本属性Ak的值,g(Xk,μci,σci)是属性Ak的高斯密度函数,而μci,σci分别为平均值和标准差。
n为对未知样本X分类,对每个类Ci,计算样本X被指派到类Ci,当且仅当:
换言之,X被指派到其P(X|Ci)P(Ci) 最大的类Ci。
实例:
判别模型 vs. 生成(概率)模型
P(c|x)在现实中通常难以直接获得
从这个角度来看,机器学习所要实现的是基于有限的训练样本
尽可能准确地估计出后验概率
贝叶斯定理:
极大似然估计:先假设某种概率分布形式,再基于训练样例对参数进行估计,估计结果的准确性严重依赖于所假设的概率分布形式是否符合潜在的真实分布
拉普拉斯修正:若某个属性值在训练集中没有与某个类同时出现过,则直接计算会出现问题,因为概率连乘将“抹去”其他属性提供的信息
朴素贝叶斯优缺点:
优点:易于实现,多数情况下结果较满意
缺点:假设,属性间独立, 丢失准确性;实际上, 属性间存在依赖
处理依赖:贝叶斯信念网络(Bayesian Belief Networks)