学到第四节时,对于程序清单4-3里的分类方法不是太理解,尤其是:
p0 = sum(vec2Classify * p0Vec) + log(pClass0)
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
这部分,好像和贝叶斯公式求的不是一个东西。
后来弄明白了,其实是有省略计算的部分,并且多处使用了将乘法转换为加法防止下溢出。
推导过程如下:
- 对于一输入文档,设要比较的参数
- 其中对于同一输入文档,p(w)是不变的,所以要比较的参数
可以简化为比较
- 由于
,且
和
单调性相同,又可以由比较g变为比较
- 此时
- 其中,
的计算是输入测试文档中每个词汇的取值(存在与否)乘以训练集中的先验概率(Ci分类下每个词汇出现的概率)。其中的乘法计算全都可以换为对数下的加法计算。代码中p0vec和p1vec是已经经过对数处理的,而vec2Classify是词汇出现与否的标记(注意此处使用的是词集模型)。
经过层层变换后,ln(g) 的计算就变成了代码中的
p0 = sum(vec2Classify * p0Vec) + log(pClass0)
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
其中的核心思想是利用将乘法转换为加法防止下溢出。
(推导过程全是文字,因为公式太难写了。推导的灵感是来自于李航的《统计学习方法》第4章朴素贝叶斯法)