关于《机器学习实战》朴素贝叶斯分类器的实现代码是否有问题的讨论

《机器学习实战》朴素贝叶斯分类器的实现代码是否有问题的讨论

结合《统计学习方法》这本书上p50-p51页的朴素贝叶斯算法的应用例子进行对比、推导。

1. 关于计算条件概率

《机器学习实战》:贝叶斯分类器的训练函数trainNB0( trainMatrix, trainCategory)是计算先验概率和条件概率的函数,与《统计学习方法》上例子进行对比,计算的先验概率一致,但条件概率的含义有点不一样,详见下图。
(机器学习实战中,词向量的计算方法是改进后的词袋模型(P64),即对词汇进行了累加)
条件概率的计算有异议!
前者对每个特征项可以取到特定的值,即X(1) = 1、X(1)=2、X(2) = 4等,而后者将特征项出现的频数累加起来了,就形成了“将三个条件概率替换成了一个“总的”条件概率,这反映的是“该类文档中,该特征项出现的频率”,而前者反映的是“该类文档中,该特定项取得特定值的概率”,这是有区别的。

我们暂且称前者是准确的条件概率(《统计学习方法》上的例子),称后者是伪条件概率(《机器学习实战》的贝叶斯训练函数trainNB0()的计算方法)。
在这里插入图片描述

2. 关于分类函数

接下来,对实例X = (2, 4)T,分别用准确的条件概率和伪条件概率计算属于各类型的后验概率,取后验概率大的类型为输出结果,两种计算方式对比如下图。
后验概率计算结果的大小相反,判断类型不一致!
从上图可以看到两个计算结果不一样,因此笔者怀疑《机器学习实战》的这个代码可能有点问题。

3. 如果该代码合理,尝试解释

显而易见,作者并没有严格按照贝叶斯公式公式的要求编写代码,如果理论上该训练函数和分类函数结合起来,与贝叶斯公式的效果是等价的,那么作者就没有给出这块的理论支持,笔者试图猜想如下(先放个截图,随后有时间再修改吧):
在这里插入图片描述

4.如果该代码有问题,尝试调整

笔者目前有三种修改思路,先简单说下方向,以后再表上来,现在要忙别的去了。

思路1. 不要使用词袋模型,条件概率的计算要修改,需要基于文档层计算,而不基于词汇层。
思路2. 条件概率需要用矩阵表示,而不是一维数组,估计开销相对较大。
思路3. 就在这个计算基础上,运用一种类似kNN分类的方式接着建模。

5. 补充材料

现在将《统计学习方法》上的例子,和《机器学习实战》上的贝叶斯代码放在下面,方面随时随地查看。
统计学习方法上的例子,p50页
机器学习实战–构建词向量,p64页:

这个构建词向量的函数与p59的 setOfWords2Vec()很类似,不同的是对词汇进行了累加“+=1”。
构建词向量
训练函数trainNB0(): p61
在这里插入图片描述
分类函数classifyNB(),p63
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值