【十大经典数据挖掘算法】Naïve Bayes
【十大经典数据挖掘算法】系列
朴素贝叶斯(Naïve Bayes)属于无监督学习的一种,实现简单,没有迭代,学习效率高,在大样本量下会有较好的表现。但因为假设太强——假设特征条件独立,在输入向量的特征条件有关联的场景下并不适用。
1. 朴素贝叶斯算法
朴素贝叶斯分类器的主要思路:通过联合概率\(P(x,y) = P(x|y) P(y)\)建模,运用贝叶斯定理求解后验概率\(P(y|x)\);将后验概率最大者对应的的类别作为预测类别。
分类方法
首先,我们定义训练集\(T = \lbrace (x_1,y_1),(x_2,y_2), \cdots ,(x_N,y_N)\rbrace\),其类别\(y_i \in \lbrace c_1,c_2, \cdots ,c_K\rbrace\),则训练集中样本点数为\(N\),类别数为\(K\)。输入待预测数据\(x\),则预测类别
\begin{equation}
\arg \mathop{\max}\limits_{c_k}p(y=c_k|x)
\label{eq:obj1}
\end{equation}
由贝叶斯定理可知:
\[p(y=c_k|x)= {p(x|y=c_k)p(y=c_k)\over p(x)} \]
对于类别\(c_k\)而言,\(p(x)\)是恒等的,因此式子\eqref{eq:obj1}等价于
\begin{equation}
\arg \mathop{\max}\limits_{c_k} p(x|y=c_k)p(y=c_k)
\label{eq:obj2}
\end{equation}
从上面式子可以看出:朴素贝叶斯将分类问题转化成了求条件概率与先验概率的最大乘积问题。先验概率\(p(y=c_k)\)可通过计算类别的频率得到,但如何计算条件概率 \(p(x|y=c_k)\)呢?
朴素贝叶斯对条件概率做了条件独立性的假设,即特征条件相互独立。设输入\(x\)为n维特征向量\((x^{(1)},x^{(2)},\cdots,x^{(j)},\cdots, x^{(n)})\),第\(j\)维特征\(x^{(j)}\)的取值有\(S_j\)个。由概率论的知识可知:
\[p(x|y=c_k)=\prod _{j}p(x^{(j)}|y=c_k)\]
式子\eqref{eq:obj2}等价于
\begin{equation}
\arg \mathop{\max}\limits_{c_k}p(y=c_k)\prod _{j}p(x^{(j)}|y=c_k)
\end{equation}
为什么要选择后验概率最大的类别作为预测类别呢?因为后验概率最大化,可以使得期望风险最小化,具体证明参看[1]。
极大似然估计
在朴素贝叶斯学习中,需要估计先验概率与条件概率,一般时采用极大似然估计。先验概率的极大似然估计:
\[\hat {p}(y=c_k) = {\sum _{i} I(y_i=c_k)\over N}\]
其中,\(I\)是指示函数,满足括号内条件时为1否则为0;可以看作为计数。
设第\(j\)维特征的取值空间为\(\lbrace a_{j1},a_{j2}, \cdots, a_{jS_j} \rbrace\),且输入变量的第\(j\)维\(x^{(j)}=a_{jl}\),则条件概率的极大似然估计:
\[\hat p(x^{(j)}=a_{jl}|y=c_k)={\sum \limits_{i}I(x_i^{(j)}=a_{jl},y=c_k)\over I(y_i=c_k)}\]
贝叶斯估计
在估计先验概率与条件概率时,有可能出现为0的情况,则计算得到的后验概率亦为0,从而影响分类的效果。因此,需要在估计时做平滑,这种方法被称为贝叶斯估计(Bayesian estimation)。先验概率的贝叶斯估计:
\[\hat {p}(y=c_k) = {\sum _{i} I(y_i=c_k)+\lambda \over N+k\lambda}\]
后验概率的贝叶斯估计:
\[\hat p(x^{(j)}=a_{jl}|y=c_k)={\sum \limits_{i}I(x_i^{(j)}=a_{jl},y=c_k)+\lambda\over I(y_i=c_k)+S_j\lambda}\]
常取\(\lambda =1\),这时被称为Laplace平滑(Laplace smoothing)。下面提到的拼写检查则用到了Laplace平滑——初始时将所有单词的计数置为1。
2. 拼写检查
当用户在输入拼写错误单词时,如何返回他想输入的拼写正确单词。比如,用户输入单词thew,用户有到底是想输入the,还是想输入thaw?这种拼写检查的问题等同于分类问题:在许多可能拼写正确单词中,到底哪一个时最有可能的呢?大神Peter Norvig [2]采用朴素贝叶斯解决这个拼写问题。
朴素贝叶斯分类
设用户输入的单词为\(w\),要返回的拼写正确单词为\(c\),拼写检查要找出最大可能的\(c\),即
\[\arg \mathop{\max}_{c} p(c|w)\]
\(p(c|w)\)可以理解为在已发生\(w\)的情况下发生\(c\)的概率。根据贝叶斯定理:
\[p(c|w)={p(w|c)p(c)\over p(w)}\]
贝叶斯分类器可表示为:
\[\arg \mathop{\max}_{c} p(w|c)p(c)\]
如何估计\(p(w|c)\)与\(p(c)\)呢?估计\(p(c)\)的办法可以在文本库中统计单词\(c\)的频率。\(p(w|c)\)表示大多数用户在输入\(c\)时拼写错误输入成了\(w\)的概率,可以看作时错误模型。这需要对大量的错误输入进行统计,才能对\(p(w|c)\)估计得较为准确。Norvig对此做了简易化的处理:
- 统计所有与\(w\)编辑距离为1的拼写正确单词,选出在文本库中频率最高者;
- 若未找到与\(w\)编辑距离为1的拼写正确单词,则统计所有与\(w\)编辑距离为2的拼写正确单词,选出在文本库中频率最高者
- 若与\(w\)编辑距离为2的拼写正确单词也未找到,则返回\(w\)(即分类失败)。
所谓编辑距离为1,指单词可以通过增加、删除、修改(一个字母)或交换(相邻两个字母)变成另外的单词。上述处理办法默认了:编辑距离为1的拼写正确单词永远比编辑距离为2的更有可能。
存在问题
Norvig所介绍的拼写检查是非常简单的一种,他在博文[2]中指出不足。此外,还有一些需要优化的地方:
- 上下文关联,比如输入
thew,在不同的上下文中可能返回的拼写正确单词不同; - 输入媒介,比如用户用键盘输入与用手机的九宫格输入,其拼写错误的方式时不一样的。
3. 参考资料
[1] 李航,《统计学习方法》.
[2] Peter Norvig, How to Write a Spelling Corrector.
【十大经典数据挖掘算法】Naïve Bayes的更多相关文章
- 【十大经典数据挖掘算法】PageRank
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 我特地把PageRank作为[十大经 ...
- 【十大经典数据挖掘算法】EM
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 极大似然 极大似然(Maxim ...
- 【十大经典数据挖掘算法】AdaBoost
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 集成学习 集成学习(ensem ...
- 【十大经典数据挖掘算法】SVM
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART SVM(Support Vector ...
- 【十大经典数据挖掘算法】C4.5
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 决策树模型与学习 决策树(de ...
- 【十大经典数据挖掘算法】k-means
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 k-means与kNN虽 ...
- 【十大经典数据挖掘算法】Apriori
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 关联分析 关联分析是一类非常有 ...
- 【十大经典数据挖掘算法】kNN
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 顶级数据挖掘会议ICDM ...
- 【十大经典数据挖掘算法】CART
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 前言 分类与回归树(Class ...
随机推荐
- 第一章-第十五题(谈谈你对压力的看法,以及怎么和别人合作, 帮助别人,把压力转化为动力,在互相帮助的环境中成长。)--By林培文
压力是一把双刃剑,有害也有利,重点是如何看待压力,从而做到趋利避害,化压力为动力.对于当前的我来说,压力利大于弊.形成这一想法,我经历了好几个阶段.第一个阶段是小学时代,那会整天就知道玩,也没什么压力 ...
- 微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析
作者:蒸米@阿里移动安全 序言 微信作为手机上的第一大应用,有着上亿的用户.并且很多人都不只拥有一个微信帐号,有的微信账号是用于商业的,有的是用于私人的.可惜的是官方版的微信并不支持多开的功能,并且频 ...
- 通过Javascript得到URL中的参数(query string)
我们知道,"GET"请求中,通常把参数放在URL后面,比如这样http://www.cnblogs.com/season-huang/index?param=yes&art ...
- 【腾讯Bugly干货分享】Redex初探与Interdex:Andorid冷启动优化
本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/583b9e3ee8992c2c2df6e6ac 导语 早在去年10月份,face ...
- [转]GC简介
[转]GC简介 原文链接:http://www.cnblogs.com/cposture/p/4845189.html 原文写得太好了,这里转一下. 1 GC机制 1.1 对象 从计算机的角度,装有数 ...
- Go语言实战 - revel框架教程之MongDB的最佳搭档revmgo
由于revel框架本身对于model层的编写没有提供任何指导,所以在设计这部分的时候就有些犹豫,反复斟酌到底怎样才算是最佳实践. 我在做山坡网的时候刚开始也纠结了一下,拿不准mongodb的sessi ...
- WCF服务的异常消息
原创地址:http://www.cnblogs.com/jfzhu/p/4055024.html 转载请注明出处 WCF Service发生异常的时候,客户端一般只能看见这样一个错误:“The ser ...
- JavaScript学习笔记之string
字符串定义: 1,var myString=“内容”:or var myString=‘内容’ 2,var myString= new String(“内容”) ---〉创建对象, ...
- xamarin UWP ActivityIndicator
在xamarin的UWP平台使用ActivityIndicator时,如果你时后台创建的这个对象,请设置他的宽度,不然在UWP平台下会发现找不这个对象,其实是在这个平台和特点版本下的宽度没设置,导致有 ...
- 谈谈关键字strictfp
Java语言中的其中一个设计目标是可移植性.无论在哪个虚拟机上运行,同一个计算应该得到同样的结果.对于浮点数的算术运算,实现这样的可移植性是相当困难的.double 类型使用 64 位存储一个 do ...