【十大经典数据挖掘算法】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 ...
随机推荐
- GDB调试汇编分析
GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdb ...
- wamp环境 安装memcache 扩展
这两天在研究tp的memcached缓存 总是遇到坑 在网上找了很多教程看终于弄出来了现在拿出来分享 首先安装memcached下载memcache压缩包 使用cmd以管理员命令去安装 E:\wamp ...
- ex3-数字和数字计算
代码: print("I will now count my chickens:") print("hens", 25+30/6)print("Roo ...
- Android动画
[浅谈Android动画] 总共四种:Tween Animation变换动画.Frame Animation帧动画 Layout Animation布局动画.Property Animation 属性 ...
- [转]runtime 消息机制
原文地址:http://www.jianshu.com/p/f6300eb3ec3d 一.关于runtime 之前在项目中有遇到过用runtime解决改变全局字体的问题,所以再一次感受到了runtim ...
- DDD实践问题之 - 关于论坛的帖子回复统计信息的更新的思考
之前,在用ENode开发forum案例时,遇到了关于如何实现论坛帖子的回复的统计信息如何更新的问题.后来找到了自己认为比较合理的解决方案,分享给大家.也希望能和大家交流,擦出更多的火花. 论坛核心领域 ...
- Java NIO3:通道和文件通道
通道是什么 通道式(Channel)是java.nio的第二个主要创新.通道既不是一个扩展也不是一项增强,而是全新的.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字节缓 ...
- ARM汇编指令调试方法
学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明
前不久微信上线了个性化菜单接口,Senparc.Weixin SDK也已经同步更新. 本次更新升级Senparc.Weixin.MP版本到v13.5.2,依赖Senparc.Weixin版本4.5.4 ...
- angularjs UI Libraries
angularjs UI Libraries ● ng-bootstrap is currently available. ● PrimeNG has largest number of compon ...