mahout-0.6中naive bayes训练过程

来源:互联网 发布:淘宝 足迹 没看过 编辑:程序博客网 时间:2024/06/16 21:19

对应的类为:org.apache.mahout.classifier.naivebayes.training.TrainNaiveBayesJob

注:困扰了几天的问题。。始终觉得他输出的label有问题。。最后发现0.6中实现的源码是错误的,0.7和0.8中都更正了过来。。坑爹啊有木有~~下方的截图都是在错误的源码基础上弄的,懒得截新的了~~

问题源码:package org.apache.mahout.classifier.naivebayes.training.IndexInstancesMapper;

String label = labelText.toString();//如果按这样来处理,他会将每个子文件夹下的子文件当成是一个类别。

org.apache.mahout.classifier.naivebayes.BayesUtils;

String theLabel = ((Pair<?,?>) label).getFirst().toString();//同上

这里我选择tf向量

1、第一个mr程序:add up all the vectors with the same labels, while mapping the labels into our index

这个mr程序的主要功能是将输入文本映射成index形式,例如:

输入文本形式:词频形式


那么转换后的形式为:依然是词频,只不过对于每个类别的文本进行了加和


这里第一个mr程序的功能非常简单,仅仅是将输入文件进行了一次映射,而文件真正的value是没有变的。


2、第二个mr程序:sum up all the weights from the previous step, per label and per feature

这里会从上一步的结果中生成两个字典,一个是针对每个term而言的总的计数值,另一个是针对每个类别而言的总的词数



3、第三个mr程序,主要用来计算每个label对应的归一化权重值。

这里的输入是第2步的输出,对于每个类别的instance是指上面生成的一个总的词频字典。

1)、StandardNaiveBayesClassifier

计算公式为:double weight = Math.log((instance.zSum() + alphaI()) / (labelWeight(label) + alphaI() * numFeatures()))

这里instance是指传入的一个类别的tf向量,zSum() 是求出tf向量的各,alphaI()为对应的平滑参数,这里设置为1,labelWeight(label)是类别的总词数,numFeatures()返回的总的词数。


对于NaiveBayesModel这个类而言比较简单,只包含了相关的几个数据:1、2、3中生成的三个,以及对应的alphal值,包含序列化函数跟验证函数。也就是说mahout中naive bayes模型对应到三个文件夹的内容。