`
wbj0110
  • 浏览: 1612892 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

mahout源码分析之贝叶斯算法

阅读更多

整个流程包括数据处理部分和分类算法部分。数据处理部分对语料库进行处理生成算法能执行的标准格式。分类算法部分的实现被分作三个部分:训练器(The Trainer)、数据模型(The Model)、分类器(The Classifier)。

数据预处理

PrepareTwentyNewsgroups

for(dir in categoryDirectorys)

BayesFileFormatter.collapse(dir,分词器,outputdir,charsetoutputfile);

 dir.listFiles(new FileProcessor())

 FileProcessor.accept();

 Analyzer.tokenstream();//分词,得到tokenstream

 BayesFileFormatter.writeFile();//label\ttokens

 

org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups对数据进行预处理:遍历根目录(categoryDirectorys)下面的所有子目录,并将目录名作为类别名。对于每个子目录(存放着一个类别的数据),使用listFiles遍历所有的文件,并将文件交由FileProcessoraccpet函数处理。FileProcessor使用参数提供的分词器(如,lucence)处理每个文件,得到token序列。最后,调用writeFile函数,将每个文件的数据按照“label\ttoken token ...”的格式作为一行输出到输出文件(outputDir/labelName+".txt")

分类器训练过程

大致的执行路径:

TrainClassifier.trainNaiveBayes()

BayesDriver.runJob()

BayesFeatureDriver.runJob()

FeaturePartation//决定什么样的keyitem映射到同一reducer

FeatureLabelComparator//决定了不同item到达reducer的次序

BayesFeatureMapper

BayesFeatureReducer                       

BayesFeatureOutput//定义了reducer的输出位置

BayesTfIdfDriver.runJob()

  BayesTfIdfMapper

BayesTfIdfReducer

BayesWeightSummerDriver.runJob()

BayesWeightSummerMapper

BayesWeightSummerReducer

BayesThetaNormalizerDriver.runJob() //求贝叶斯的m-估计

BayesThetaNormalizerMapper

BayesThetaNormalizerMapper

 

每个JobMapperReducer执行的工作与输出:

BayesFeatureMapper

一行输入就是一个文档,label为该文档的标签,token为特征即文档中的单词,BayesFeatureMapper的输出为MapReducer的标准形式:keyvalue。输出的每一行在数据模型里都是一个item,如下:

WEIGHT                    key: _WT label token     value:Log[(1.0+dKJ)/∑dKJ21/2] //某文档中某单词的TF

DOCUMENT FREQUENCY        key: _DF label token     value: 1

FEATURE COUNT             key: _FC token           value: 1

FEATURE TERM FREQUENCY    key: _FF token            value: dkj 

LABEL COUNT               key: _LC label            value: 1 

 

BayesFeatureReducer

Mapper将处理相同的keyitem,并执行合并操作,并将合并的结果输出到BayesFeatureOutput类中配置的路径中。Mapper的输出可以预见每一项输出的value的意义:

LABEL_COUNT          key:_LC,label        value:label下的文档数                         

DOCUMENT_FREQUENCY  key:_DF,label,token value:label下出现token的文档数           

FEATURE_COUNT        key:_FC,token        value:出现token的文档数     

WEIGHT                key:_WT,label,token value: ∑(Log[(1.0+dKJ) /SQRT(∑dKJ2)])(即label下token的TF值    

 

BayesTfIdfMapper

根据BayesFeatureReducer输出到文件中的数据计算IDF=某类下的文档数(LABEL_COUNT/某类下出现该token的文档数(DOCUMENT_FREQUENCY)。输出如下:

WEIGHT              key: _WT,label,token  value: logidf 

WEIGHT              key: _WT,label,token  value: tf 

FEATURE_SET_SIZE   key: _FS               value: 1

 

BayesTfIdfReducer

根据Mapper输出的tf值和idf值计算TF-IDF,并统计FEATURE_SET_SIZE的总和为vocabCount并输出:

FEATURE_SET_SIZE  key: _FS               value: vocabCount

WEIGHT              key:_WT,label,token   value: TF-IDF

 

BayesWeightSummerMapper

每个Mapper统计该Mapper下所有label下某token(_SJ)的TF-IDF的值总和,某label(_SK)下所有tokenTF-IDF的值总和,以及所有label下所有tokenTF-IDF的值:

FEATURE_SUM   key: _SJ,token   value: TF-IDF

LABEL_SUM     key: _SK,label   value: TF-IDF 

TOTAL_SUM     key: _SJSK       value: TF-IDF 

 

BayesWeightSummerReducer

Reducert将各个Mapper node下相同token的值合并,求得所有数据下featurelabeltotal值,即:

FEATURE_SUM   key: _SJ,token   value: SUM(TF-IDF)

LABEL_SUM     key: _SK,label   value: SUM(TF-IDF) 

TOTAL_SUM     key: _SJSK       value: SUM(TF-IDF) 

 

BayesThetaNormalizerMapper

Mapper将求贝叶斯的m-估计,至于其必要性,以及为什么公式是这样的,详见 贝叶斯的m-估计

LABEL_THETA_NORMALIZER key: _LTN,label   value: log(( tfidf +1)/(vocabCount+SigmaK))

 

BayesThetaNormalizerReducer

将所有Mapper的数据执行合并操作

LABEL_THETA_NORMALIZER key: _LTN  label   value: SUM(log(( tfidf +1)/(vocabCount+SigmaK)))

 

分类器分类过程

分类过程有串行和并行两种实现,下面只介绍并行实现。

TestClassifier.classifyParallel()

BayesClassifierDriver.runJob()

BayesClassifierMapper.configure()

ClassifierContext.initialize();

InMemoryBayesDatastore.initialize()

//将训练模型装入datastore

BayesAlgorithm.initialize();

BayesClassifierMapper.map()

ClassifierContext.classifyDocument();

BayesAlgorithm.classifyDocument();

BayesClassifierReducer

 

BayesClassifierMapper

Mapper在初始化时运行ClassifierContext.initialize(),然后调用SequenceFileModelReaderloadModel方法将输入装入datastore。其次,运行map函数,最终调用BayesAlgorithm.classifyDocument()。对每个类别循环,调用documentWeight,先计算文档中每个词的次数生成一个Map类型的wordlist,针对wordlisteach pair计算:

∑[frequency×featureweight(datastore,label,word)]

其中featureweight函数返回log[(tfidf+1.0)/(sumLabelWeight+vocabCount)]

documenWeight返回的值是测试文档属于某类的概率的大小,即所有属性的在某类下的frequency×featureweight之和,值得注意的是sumLabelWeight是类别下权重之和与在其他类下的和值进行比较,取出最大值的label文档就属于此类,并输出:

CLASSIFIER_TUPLE  key:_CT correctLabel classifiedLabel  value:1

 

BayesClassifierReducer

合并Mapper的结果,输出:

CLASSIFIER_TUPLE  key:_CT correctLabel classifiedLabel  value:正确分类的文档数

 

 

总结:贝叶斯原理,后验概率=先验概率×条件概率。此处没有乘先验概率,直接输出为最佳label,可能是因为所用的20个新闻的数据每类中的文档数大致一样先验概率几乎一样)。

http://blog.csdn.net/cyningsun/article/details/8679989

 

 

http://soledede.com/

 

大家可以加我个人微信号:scccdgf

 

 

或者关注soledede的微信公众号:soledede
微信公众号:
分享到:
评论

相关推荐

    mahout源码

    在Mahout中,朴素贝叶斯算法常用于文本分类,如垃圾邮件检测、新闻分类等。Mahout实现的朴素贝叶斯分类器支持多元高斯模型和多项式模型,适应不同类型的特征数据。 3. **Mahout的朴素贝叶斯实现** Mahout提供了两...

    【甘道夫】通过Mahout构建贝叶斯文本分类器案例详解 -- 配套源码

    Apache Mahout是一个基于Hadoop的机器学习库,它提供了一系列的算法,包括聚类、分类和协同过滤,用于大数据分析。贝叶斯分类器是其中一种常用的文本分类方法,因其简单高效而在实际应用中广泛使用。 首先,我们要...

    数据挖掘贝叶斯算法java源代码(内含数据集)

    在Java编程环境中实现贝叶斯算法,可以借助各种库,如Weka、Apache Mahout等,但这里的源代码是独立编写的,可以帮助开发者深入理解算法内部工作流程。源代码可能包括以下几个部分: 1. 数据预处理:数据清洗,去除...

    贝叶斯算法(文本分类算法)java源码借鉴.pdf

    贝叶斯算法是一种基于概率统计的分类方法,尤其在文本分类领域中广泛应用。它的核心思想是利用贝叶斯定理来更新先验概率,通过已知的训练数据集来预测未知数据的类别。在Java中实现贝叶斯算法,通常会涉及到以下几个...

    mahout in action中的源码

    《Mahout in Action》是一本深入探讨Apache Mahout机器学习框架的专业书籍,其源码提供了丰富的实践示例和深入理解Mahout算法的机会。在GitHub上,你可以找到这些源码的完整版本,链接为。下面,我们将详细探讨...

    mahout-distribution-0.7-src.zip

    使用Maven作为构建工具,可以方便地编译和打包Mahout源码。通过以下步骤,你可以自行编译源码并进行测试: 1. 首先,确保安装了Java开发环境(JDK)和Maven。 2. 解压`mahout-distribution-0.7-src.zip`文件到本地...

    apache-mahout-distribution-0.11.0-src.zip

    2. **源码分析**: 在源码中,您可以探索Mahout实现的各种算法,如协同过滤(Collaborative Filtering)、频繁项集挖掘(Frequent Itemset Mining)、近邻搜索(Nearest Neighbor Search)等。这些算法是通过Java...

    mahout-distribution-0.5.tar.gz + 源码

    源码分析可以帮助读者深入理解算法的实现细节,从而更好地定制和优化算法以适应特定需求。 通过阅读源码,你可以学习到如何组织一个大型机器学习项目的代码结构,理解算法的设计思路,以及如何利用Hadoop进行分布式...

    Mahout教程内含源码以及说明书可以自己运行复现.zip

    分类算法在Mahout中主要包括决策树(ID3、C4.5)、朴素贝叶斯和随机森林等。ID3是最早的决策树算法,而C4.5是对ID3的改进,处理连续特征更有效。朴素贝叶斯基于概率模型,假设特征之间相互独立,适用于文本分类。...

    mahout-0.3.tar

    "mahout-0.3.tar"是Mahout项目在0.3版本的源码或二进制发行版的压缩文件,通常包含了项目的源代码、构建脚本、文档和其他必要的资源。 在Mahout 0.3版本中,我们可以探索以下几个关键知识点: 1. **推荐系统**:...

    apache-mahout-trunk_java_物联_源码.zip

    分析Mahout源码有助于理解分布式机器学习的实现细节,对于开发者来说,可以学习如何在实际项目中设计和优化算法,以及如何利用Hadoop进行大数据处理。 8. **持续发展**: Apache Mahout项目不断更新和维护,以...

    spark 朴素贝叶斯实现股票预测数据+代码

    在IT领域,尤其是在数据分析和机器学习中,Spark框架与朴素贝叶斯算法的结合常常用于处理大规模数据,例如股票市场的预测。本项目就是一个基于Spark API的朴素贝叶斯(Naive Bayes)股票预测实例,它包括了从原始...

    Mahout_In_Action(源码)

    总的来说,通过《Mahout in Action》的源码,你将能深入了解机器学习算法的实现原理,以及如何在大数据环境中有效地运用它们。这将对你的数据挖掘技能提升大有裨益,也能为开发智能应用打下坚实的基础。

    mahout in action

    6. **源码分析**:深入源码层面,解析Mahout算法的实现细节,帮助开发者理解如何根据需求进行修改和扩展。 7. **性能调优**:介绍如何优化Mahout的性能,包括调整Hadoop集群参数、并行度控制和内存管理。 8. **...

    [Mahout] 使用Mahout 对Kddcup 1999的数据进行分析 -- Naive Bayes

    Mahout提供了丰富的预定义算法,如协同过滤、决策树、朴素贝叶斯等,用于开发智能应用。 **2. Kddcup 1999数据集** Kddcup 1999是网络安全领域的经典数据集,主要用于异常检测和入侵检测系统的研究。该数据集包含了...

    bigdata-2:大数据 二

    配置庖丁解牛包的配置文件)然后利用mahout 中的牛人已经写好的分布式程序(文本分类器贝叶斯算法cbayes:计算出现在训练集中每一个的概率)在公司是用来根据访问内容判断用户喜好个人评论的分析。开发环境实际是...

    大数据课程分类.docx

    - **Mahout**:接触机器学习库,进行大规模数据的预测和分析。 - **Spark**:深入理解Spark的内存计算模型,适用于批处理和实时分析。 - **Storm**:学习实时数据处理框架,处理连续的数据流。 **大数据数据采集...

Global site tag (gtag.js) - Google Analytics