好的,回去看完了Andrew Ng的关于这一节的公开课,还有中文的课堂笔记
然后参照了一下《集体智慧编程》这本书,现在对这个算法有一个全面的理解了
贝叶斯决策,基本上,从直观理解就是做了这样的事情:
给定历史的数据和类别,然后新来一个数据,计算新来的数据属于每个类别的概率,然后将新来的数据归为概率最大的那一类。
贝叶斯定理:
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|w)=p(w|c)p(c)
以下阐述帮助理解,实际用时要做优化,优化在最后提一下
该如何建模?
生成词集模型:
把所有邮件(假设我把我目前邮箱里的所有邮件都用做训练),分词,将所有出现过的词语包含到一个set当中。
生成文本向量:
假设刚刚set有1000个词,那么我将每个邮件做成一个1000维的向量,每一维对应这个词是否在该文档出现,用0,1表示。
训练模型:
我们是对这样一个生成模型建模,生成模型求的是联合概率。
先说个简单的,
那么
我们还是分为两部分:
p(w|c=1) :
在那些标记为垃圾邮件的文本向量中,假设有n个:
我们把他们全部加起来,得到一个向量,然后再将这个向量的每一位都除以n。
好的我们就得到了一个特征向量
同理可得
这里就可以看出,生成模型是什么,我们之前不知道参数的大小,是通过训练集生成参数,然后再来求条件概率,换句话说,我们是对参数进行了最大似然估计。
验证方法:
用了向量乘积来判别
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. 中间步骤
还有更多优化步骤,我就不多说了…..