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

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

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

1. 关于计算条件概率

《机器学习实战》:贝叶斯分类器的训练函数trainNB0( trainMatrix, trainCategory)是计算先验概率和条件概率的函数,与《统计学习方法》上例子进行对比,计算的先验概率一致,但条件概率的含义有点不一样,详见下图。
(机器学习实战中,词向量的计算方法是改进后的词袋模型(P64),即对词汇进行了累加)

前者对每个特征项可以取到特定的值,即X(1) = 1、X(1)=2、X(2) = 4等,而后者将特征项出现的频数累加起来了,就形成了“将三个条件概率替换成了一个“总的”条件概率,这反映的是“该类文档中,该特征项出现的频率”,而前者反映的是“该类文档中,该特定项取得特定值的概率”,这是有区别的。

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

2. 关于分类函数

接下来,对实例X = (2, 4)T,分别用准确的条件概率和伪条件概率计算属于各类型的后验概率,取后验概率大的类型为输出结果,两种计算方式对比如下图。
关于《机器学习实战》朴素贝叶斯分类器的实现代码是否有问题的讨论_第1张图片
从上图可以看到两个计算结果不一样,因此笔者怀疑《机器学习实战》的这个代码可能有点问题。

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

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

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

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

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

5. 补充材料

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

这个构建词向量的函数与p59的 setOfWords2Vec()很类似,不同的是对词汇进行了累加“+=1”。

训练函数trainNB0(): p61

分类函数classifyNB(),p63

你可能感兴趣的:(python自然语言处理,原创,机器学习,贝叶斯分类器应用)