机器学习实战 第四节 朴素贝叶斯分类 笔记

学到第四节时,对于程序清单4-3里的分类方法不是太理解,尤其是:

p0 = sum(vec2Classify * p0Vec) + log(pClass0)

p1 = sum(vec2Classify * p1Vec) + log(pClass1)

这部分,好像和贝叶斯公式P(C_{i}|w) = \frac{P(w|C_{i})P(C_{i})}{P(w)}求的不是一个东西。 

 

后来弄明白了,其实是有省略计算的部分,并且多处使用了ln(a*b) = ln(a) + ln(b)将乘法转换为加法防止下溢出。


推导过程如下: 

  1. 对于一输入文档,设要比较的参数f =P(C_{i}|w) = \frac{P(w|C_{i})P(C_{i})}{P(w)}
  2. 其中对于同一输入文档,p(w)是不变的,所以要比较的参数f可以简化为比较g =P(C_{i}|w) = P(w|C_{i})P(C_{i})
  3. 由于ln(a*b) = ln(a) + ln(b),且f(x) 和 ln(f(x))ln(f(x))单调性相同,又可以由比较g变为比较ln(g)
  4. 此时ln(g) =ln(P(w|C_{i})) + ln(P(C_{i}))
  5. 其中,P(w|C_{i})的计算是输入测试文档中每个词汇的取值(存在与否)乘以训练集中的先验概率(Ci分类下每个词汇出现的概率)。其中的乘法计算全都可以换为对数下的加法计算。代码中p0vec和p1vec是已经经过对数处理的,而vec2Classify是词汇出现与否的标记(注意此处使用的是词集模型)。

 经过层层变换后,ln(g) 的计算就变成了代码中的

p0 = sum(vec2Classify * p0Vec) + log(pClass0)

p1 = sum(vec2Classify * p1Vec) + log(pClass1)

其中的核心思想是利用ln(a*b) = ln(a) + ln(b)将乘法转换为加法防止下溢出。

(推导过程全是文字,因为公式太难写了。推导的灵感是来自于李航的《统计学习方法》第4章朴素贝叶斯法)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值