【机器学习】朴素贝叶斯
2017-02-24 18:01
183 查看
好的,回去看完了Andrew Ng的关于这一节的公开课,还有中文的课堂笔记
然后参照了一下《集体智慧编程》这本书,现在对这个算法有一个全面的理解了
贝叶斯决策,基本上,从直观理解就是做了这样的事情:
给定历史的数据和类别,然后新来一个数据,计算新来的数据属于每个类别的概率,然后将新来的数据归为概率最大的那一类。
n个特征同等重要
c = 0 : 不是垃圾邮件
c = 1 : 是垃圾邮件
我计算 p(c=1|w) 和 p(c=0|w)
判断这两个概率哪个大,就把文档归为哪一类。
本来我们计算两个概率,是应该根据贝叶斯定理的公式(如上)的,但是对于一篇文档来说, p(w) 是相同的,反正我们的目的只是比大小,定性分析,同除 p(w) 并不影响结果,所以
以下阐述帮助理解,实际用时要做优化,优化在最后提一下
该如何建模?
先说个简单的,p(c) 是什么?是人工标记训练集中垃圾邮件的频率,是一个固定的数值,比如我的邮箱里50封邮件全都作为训练,我人工标记,有10封为垃圾邮件,那么p(c=1)=0.2; p(c=0)=0.8
那么p(w|c) 呢,既然朴素贝叶斯做出了特征相互独立的假设,那么我们就假定,在任意一封邮件中,每个词语出现的概率是不会相互影响的。我们设词集中1000个词分别为:x1,x2,...x1000 , 这样就有
p(w|c)=∏i=11000p(xi|y)
我们还是分为两部分:
我们把他们全部加起来,得到一个向量,然后再将这个向量的每一位都除以n。
好的我们就得到了一个特征向量p1, 这个特征向量每一位表示对应的词语在垃圾邮件中出现的概率
同理可得p0
这里就可以看出,生成模型是什么,我们之前不知道参数的大小,是通过训练集生成参数,然后再来求条件概率,换句话说,我们是对参数进行了最大似然估计。
vec2Classify 为待检验的文本向量;
这里做了一下数学处理(log)
我想说的是,为什么验证方法中的前半部分是文本向量与特征向量对位相乘然后求和呢?
我们知道,特征向量中是对位该词出现的概率,而文本向量中是是否出现,用0,1表示
所以,对位相乘,粗浅理解,就是表现该文档中这些特征词一共出现了多少。
换句话说吧,我们会不会有这样的疑问?
为什么我们不建立一个dirty words的dict,然后去扫新邮件中有没有包含dict中的词语,这样不就可以直接确定分类了么?要概率干嘛?
我个人的理解,特征向量,就是最能够表示该类别特性的一个向量,那些再特征向量中出现的概率高的词,最能代表了该类别文本的特性,也就是说,如果有一个文档,包含了这些词,是有极大可能属于该类别的。
所以,如果只建立dict的话,有这样的问题,垃圾邮件只是说明包含这些特征词的概率大,但是不能完全确定一封邮件只要有这个词,就是属于垃圾邮件,所以只是概率的问题。
这样结合考虑,应该能够明白了吧。
所以,上述只是帮助理解的一个小例子,如果实用,要优化:
1. 换词集为词袋,考虑文本中单词出现的频次,而不是简单用0,1表示是否出现
2. 中间步骤p(w|c)=∏1000i=1p(xi|y),有多个概率相乘,如果有一个概率0,则结果为0,不合理,所以用一下Laplace平滑
还有更多优化步骤,我就不多说了…..
然后参照了一下《集体智慧编程》这本书,现在对这个算法有一个全面的理解了
贝叶斯决策,基本上,从直观理解就是做了这样的事情:
给定历史的数据和类别,然后新来一个数据,计算新来的数据属于每个类别的概率,然后将新来的数据归为概率最大的那一类。
贝叶斯定理:
p(c|w)=p(w|c)p(c)p(w)为什么说是朴素贝叶斯:
n个特征相互独立 (为了简化条件概率的计算)n个特征同等重要
问题场景:
就举《机器学习实战》的例子吧,做一个文本分类,如果一段文本里,包含侮辱性词汇,标记为不当言论。直观理解:
c is category, w is words,可以理解成邮件c = 0 : 不是垃圾邮件
c = 1 : 是垃圾邮件
先看怎样运作:
对一个特定的邮件 w,我计算 p(c=1|w) 和 p(c=0|w)
判断这两个概率哪个大,就把文档归为哪一类。
本来我们计算两个概率,是应该根据贝叶斯定理的公式(如上)的,但是对于一篇文档来说, p(w) 是相同的,反正我们的目的只是比大小,定性分析,同除 p(w) 并不影响结果,所以
目标函数:
p(c|w)=p(w|c)p(c)以下阐述帮助理解,实际用时要做优化,优化在最后提一下
该如何建模?
生成词集模型:
把所有邮件(假设我把我目前邮箱里的所有邮件都用做训练),分词,将所有出现过的词语包含到一个set当中。生成文本向量:
假设刚刚set有1000个词,那么我将每个邮件做成一个1000维的向量,每一维对应这个词是否在该文档出现,用0,1表示。训练模型:
我们是对这样一个生成模型建模,生成模型求的是联合概率。先说个简单的,p(c) 是什么?是人工标记训练集中垃圾邮件的频率,是一个固定的数值,比如我的邮箱里50封邮件全都作为训练,我人工标记,有10封为垃圾邮件,那么p(c=1)=0.2; p(c=0)=0.8
那么p(w|c) 呢,既然朴素贝叶斯做出了特征相互独立的假设,那么我们就假定,在任意一封邮件中,每个词语出现的概率是不会相互影响的。我们设词集中1000个词分别为:x1,x2,...x1000 , 这样就有
p(w|c)=∏i=11000p(xi|y)
我们还是分为两部分:
p(w|c=1) :
在那些标记为垃圾邮件的文本向量中,假设有n个:我们把他们全部加起来,得到一个向量,然后再将这个向量的每一位都除以n。
好的我们就得到了一个特征向量p1, 这个特征向量每一位表示对应的词语在垃圾邮件中出现的概率
同理可得p0
这里就可以看出,生成模型是什么,我们之前不知道参数的大小,是通过训练集生成参数,然后再来求条件概率,换句话说,我们是对参数进行了最大似然估计。
验证方法:
用了向量乘积来判别p1 = sum(vec2Classify * p1Vec) + log(pClass1) #element-wise mult p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1) if p1 > p0: return 1 else: return 0
vec2Classify 为待检验的文本向量;
这里做了一下数学处理(log)
我想说的是,为什么验证方法中的前半部分是文本向量与特征向量对位相乘然后求和呢?
我们知道,特征向量中是对位该词出现的概率,而文本向量中是是否出现,用0,1表示
所以,对位相乘,粗浅理解,就是表现该文档中这些特征词一共出现了多少。
换句话说吧,我们会不会有这样的疑问?
为什么我们不建立一个dirty words的dict,然后去扫新邮件中有没有包含dict中的词语,这样不就可以直接确定分类了么?要概率干嘛?
我个人的理解,特征向量,就是最能够表示该类别特性的一个向量,那些再特征向量中出现的概率高的词,最能代表了该类别文本的特性,也就是说,如果有一个文档,包含了这些词,是有极大可能属于该类别的。
所以,如果只建立dict的话,有这样的问题,垃圾邮件只是说明包含这些特征词的概率大,但是不能完全确定一封邮件只要有这个词,就是属于垃圾邮件,所以只是概率的问题。
这样结合考虑,应该能够明白了吧。
所以,上述只是帮助理解的一个小例子,如果实用,要优化:
1. 换词集为词袋,考虑文本中单词出现的频次,而不是简单用0,1表示是否出现
2. 中间步骤p(w|c)=∏1000i=1p(xi|y),有多个概率相乘,如果有一个概率0,则结果为0,不合理,所以用一下Laplace平滑
还有更多优化步骤,我就不多说了…..
相关文章推荐
- 机器学习笔记:朴素贝叶斯
- 机器学习实战-朴素贝叶斯
- 机器学习总结3_朴素贝叶斯
- 斯坦福机器学习之朴素贝叶斯
- 机器学习--朴素贝叶斯
- 机器学习四 -- 基于概率论的分类方法:朴素贝叶斯
- 机器学习入门算法及其java实现-朴素贝叶斯
- 机器学习理论与实战(三)朴素贝叶斯
- 机器学习入门03-朴素贝叶斯
- 机器学习理论与实战(三)朴素贝叶斯
- 机器学习:贝叶斯_2:朴素贝叶斯
- 【机器学习-斯坦福】学习笔记6 - 朴素贝叶斯
- 【机器学习-斯坦福】学习笔记6 - 朴素贝叶斯
- 机器学习实战python版 朴素贝叶斯示例 垃圾邮件分类 从个人广告中获取趋于趋向
- 机器学习(八):CS229ML课程笔记(4)——生成学习,高斯判别分析,朴素贝叶斯
- 机器学习-1-朴素贝叶斯
- 机器学习实战---读书笔记: 第4章 基于概率论的分类而方法:朴素贝叶斯
- C++ 朴素贝叶斯模型(Naive Bayesian Model,NBM)实现, 西瓜实验数据集 基于周志华老师机器学习
- 机器学习理论与实战(三)朴素贝叶斯
- [机器学习实战] 基于概率论的分类方法:朴素贝叶斯