- 浏览: 303326 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ae6623:
ae6623 写道大哥,你是怎么知道它对临时文件有限制的,我也 ...
导出excel2007 poi3.8 -
ae6623:
大哥,你是怎么知道它对临时文件有限制的,我也发现这个bug了, ...
导出excel2007 poi3.8 -
coralandbill:
下载不了啊 能不能给我发一个simpleProj.war包啊 ...
jqgrid使用步骤及说明 -
maojin:
这是jqgrid几?那个电话号码校验的函数能调到吗?
jqgrid使用步骤及说明 -
qingyezhu:
请问,用poi3.8中的wordtohtmlconver类将d ...
导出excel2007 poi3.8
根据http://blog.163.com/jiayouweijiewj@126/blog/static/17123217720113115027394/进行了bayes学习分析,部分内容做了更改:
首先解释下 TFIDF原理:
TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份 文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻 引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结 果中出现的顺序。
TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很 少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF反文档频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有 很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也 大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代 表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处.
在一份给定的文件里,词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。) 逆向文件频率 (inverse document frequency, IDF) 是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。 某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语
实现包括三部分:The Trainer(训练器)、The Model(模型)、The Classifier(分类器)
1、训练
首先, 要对输入数据进行预处理,转化成Bayes M/R job 读入数据要求的格式,即训练器输入的数据是 KeyValueTextInputFormat 格式,第一个字符是类标签,剩余的是特征属性(即单词)。以 20 个新闻的例子来说,从官网上下载的原始数据是一个分类目录,下面每个文件夹名就是类标签,里面是属于此类的一些文档(一个文件是一篇文章)。 mahout 通过 org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups 对数据进行预处理,完成的工作是对于原始的一个分类目录下面的所有文件,依次遍历,并将目录名作为类别名,就这样完成了 inputDir -- >outputFile 的转变。如果要处理 html 文件的话,那么就需要在 BayesFileFormatter 调用 html clean , extract body text 的过程,生成 cleaned text 。
PrepareTwentyNewsgroups调用 org.apache.mahout.classifier.BayesFileFormatter 和 org.apache.lucene.analysis.standard.StandardAnalyzer 进行分析处理,将数据转换成了:类标签作为一个文件的名字,文件里每一个行(一个回车算一行)是包含在此类中的一篇文章(格式是:类标签 一篇文章中的所有单词)。
BayesFileFormatter的作用是把一个目录里的所有文件转换成一个文件, label \t content 其中的文件内容全部经过 tokenize ,词之间加入空格,存入 content 。 BayesFileFormatter.collapse 的作用是将一个目录的所有文件加上 label 处理成 MapReduce 所需要的按行处理的文件格式 , 变成 1 个文件。
其次, 调用org.apache.mahout.classifier.bayes.TrainClassifier 进行训练,结果生成 newsmodel 。
这个类会根据命令行参数调用两个训练器: trainCNaiveBayes 和 trainNaiveBayes ,其中trainCNaiveBayes 函数调用 CBayesDriver 类; trainNaiveBayes 调用 BayesDriver 类。
这里只分析org.apache.mahout.classifier.bayes.mapreduce.bayes.BayesDriver 类,它实现了 BayesJob 接口,在 runJob 函数里调用 4 个 map/reduce 作业类:
第一个:BayesFeatureDriver 负责 Read the features in each document normalized by length of each document
第二个:BayesTfIdfDriver 负责 Calculate the TfIdf for each word in each label
第三个:BayesWeightSummerDriver 负责 alculate the Sums of weights for each label, for each feature
第四个:BayesThetaNormalizerDriver 负责: Calculate the normalization factor Sigma_W_ij for each complement class
以20-news 的例子分别分析这四个类:
⑴BayesFeatureDriver
所在包:package org.apache.mahout.classifier.bayes.mapreduce.common;
输入格式:KeyValueTextInputFormat.class
输出格式:BayesFeatureOutputFormat.class
输出key 类型: StringTuple.class
输出value 类型: DoubleWritable.class
Map: BayesFeatureMapper.class
Reduce: BayesFeatureReducer.class
注意:BayesFeatureDriver 可以独立运行,默认的输入和输出:/home/drew/mahout/bayes/20news- input /home/drew/mahout/bayes/20-news-features
只要在 hdfs上存在输入路径,运行完成后会有输出
input=new Path("/home/drew/mahout/bayes/20news-input");
output=new Path("/home/drew/mahout/bayes/20-news-features");
p=new BayesParameters(1) gramsize默认为 1
BayesFeatureOutputFormat继承了 MultipleOutputFormat ,定义了产生的四个文件路径及名字,文件的格式还是 SequenceFileOutputFormat. :
$OUTPUT/trainer-wordFreq
$OUTPUT/trainer-termDocCount
$OUTPUT/trainer-featureCount
$OUTPUT/trainer- docCount
① BayesFeatureMapper的输出为:
一行一个map,根据数据处理的格式即一篇文章一个map,以下的label指类标签,token是属性即单词,dKJ是某token在本篇文章中出现的次数,∑dKJ 2 是本篇文章中所有token出现次数的平方和,以下及后面的表格是觉得看着清楚自己画的,输出时只是里面的内容,例如:_WT,label,token空格value的值
key |
value |
_WT,label,token |
L og[(1.0+dKJ)/(∑dKJ 2 ) 1/2 ]即为某词在一个文档中的TF值 通俗点就是: L og[(1.0+某属性在本篇文章中出现的次数)/(本篇文章中所有属性出现次数的平方和) 1/2 ] |
_DF,label,token |
1.0出现的 文档 数 |
_FC,token |
1.0 出现的 文档 数 |
_LC,label |
1.0 出现的 文档 数 |
② BayesFeatureReducer的输出为:
相同的key 放在一个 reduce 里执行合并
key |
value |
输出 |
_WT,label,token |
∑ L og[(1.0+dKJ)/(∑dKJ 2 ) 1/2 ]即某类中某属性的TF值 |
trainer-wordFreq |
_DF,label,token |
某label中出现某token的文档数 |
trainer-termDocCount |
_FC,token |
所有训练集文章中出现某token的文档数 |
trainer-featureCount |
_LC,label |
某label下的文档数 |
trainer- docCount |
_FT,token |
与_FC的value一样 |
没输出且只在mhaout-0.4里出现这部分计算,0.3里没有 |
⑵BayesTfIdfDriver
输入格式:SequenceFileInputFormat.class
输出格式:BayesTfIdfOutPutFormat.class
输出key 类型: StringTuple.class
输出value 类型: DoubleWritable.class
输入路径:就是第一个map/reduce 生成的 trainer-wordFreq 、 trainer-termDocCount 、 trainer-featureCount 文件
输出:trainer-tfIdf 文件
Map: BayesTfIdfMapper.class
Reduce: BayesTfIdfReducer.class
根据BayesFeatureReducer 的输出文件计算 TF-IDF 值,但是只调用了以上的 trainer-wordFreq 、 trainer-termDocCount 、 trainer-featureCount 三个文件,计算完毕后生成两个文件 trainer-tfIdf 和 trainer- vocabCount( BayesTfIdfOutPutFormat 里有)。 最后在BayesDriver里会删除这些中间文件,
Path docCountOutPath = new Path(output, "trainer-docCount");
HadoopUtil.delete(conf, docCountOutPath);
① BayesTfIdfMapper的输出为:
TF值是调用 trainer-wordFreq 中的value
Idf=某类下的文档数 / 某类下出现该 token 的文档数
其中某类下出现该token 的文档数是调用 trainer-termDocCount 中的value
key |
value |
_WT,label,token |
TF值 |
_WT,label,token |
logidf |
_FS |
1.0 |
②BayesTfIdfReducer 的输出为:
key |
value |
输出 |
_WT,label,token |
TF × logidf |
trainer- tfidf |
_FS |
属性总数 |
trainer- VocabCount |
⑶BayesWeightSummerDriver
输入文件格式:SequenceFileInputFormat.class
输出文件格式:BayesWeightSummerOutputFormat.class
输出key : StringTuple.class
输出value : DoubleWritable.class
输入路径:是第二个map/reduce 生成的 trainer-tfIdf 文件
输出:trainer-weights 文件
Map: BayesWeightSummerMapper.class
Reduce: BayesWeightSummerReducer.class
这里只调用了第二个map/reduce 生成的 trainer-tfIdf ,没有调 trainer- VocabCount
① BayesWeightSummerMapper的输出为:
key |
value |
_SJ,token |
TFIdf值 |
_SK,label |
TFIdf值 |
_SJSK |
TFIdf值 |
②BayesWeightSummerReducer 的输出为:
key |
value |
输出 |
_SJ,token |
某属性的全部TFIdf总和 |
Sigma_j |
_SK,label |
某类下的所有属性的TFIdf总和 |
Sigma_k |
_SJSK |
所有的TFIdf值 |
Sigma_kSigma_j |
⑷ BayesThetaNormalizerDriver
输入文件格式:SequenceFileInputFormat.class
输出文件格式:SequenceFileOutputFormat.class
输出key : StringTuple.class
输出value : DoubleWritable.class
输入路径: 第二个map/reduce 生成的 trainer-tfIdf/ 下的 trainer-tfIdf 和 trainer- VocabCount,以及 trainer-weights/ 的 Sigma_k 和 Sigma_kSigma_ j
输出:trainer-thetaNormalizer 文件
① BayesWeightSummerMapper的输出为:
Log里的分子中 TFIdf是某类下某属性的TFIdf值,分母中 VocabCount是属性总数
key |
value |
_LTN,label |
Log[(TFIdf+1.0)/(sigma_k+ VocabCount )] |
②BayesWeightSummerReducer 的输出为:
将Map 的结果合并
key |
value |
_LTN,label |
ΣLog[(TFIdf+1.0)/(sigma_k+ VocabCount )] |
发表评论
-
hive 安装运行权限错误Permission denied: user=hive, access=WRITE,
2013-07-24 17:10 18345在安装hive过程中遇到了hive权限错误: : E ... -
hadoop 源码编译 导入eclipse
2013-04-25 18:23 3834hadoop 源码编译 导入eclipse h ... -
hive null 和空值
2013-02-28 09:46 3515hive的数据源是基于hdfs的数据文件,如果文件的某一个字 ... -
mahout中bayes分类分析—2
2012-11-27 17:40 26902、 模型 以上训练部分的四个job 执行完毕后,整 ... -
谷歌开源 Supersonic 查询引擎
2012-11-21 11:25 1069谷歌近日开源了其Supersonic项目。据谷歌描述,Supe ... -
Cloudera Impala:基于Hadoop的实时查询开源项目
2012-11-13 11:08 1141摘要:号外!Cloudera发布了实时查询开源项目Impala ... -
hadoop 运行任务超时
2012-08-29 15:08 1127在默认指定的10分钟或具体在配置文件指定的时间内没有报告状态, ... -
Task process exit with nonzero status of 1.
2012-08-28 11:08 3092在平时跑mapReduce程序时,经常会遇到这样的错误,网上也 ... -
mahout中bayes分类分析—1
2012-08-21 16:18 1473引用:http://blog.163.com/ji ... -
导出excel2007 poi3.8
2012-07-27 19:17 5423poi3.8默认情况下,用到的临时目录是系统自带的临时目录,在 ... -
hbase 导出 excel报表 jxl
2012-07-27 18:58 2809package sina.hive.vipfaninfo; ... -
hbase 导入导出
2012-07-12 19:17 3409hbase导入导出第一方案: hbase已经自带了这个命令,下 ... -
hive函数大全
2012-06-29 19:14 237161.内置运算符 1.1关系运 ... -
Hadoop Job Scheduler作业调度器
2012-06-21 11:46 4084Hadoop Job Scheduler Hadoop的作业调 ... -
关于hadoop2.0自定义计数器
2012-06-07 11:38 1697最近写了个mapReduce进行数据分析,发现数据不合理,想写 ... -
hadoop Text编码问题
2012-06-01 17:33 1895Hadoop写map/reduce作业开始,就遇到了输入数据是 ...
相关推荐
http://blog.csdn.net/u010967382/article/details/25368795#comments 博客配套源码
Chapter 1 Meet Mahout Chapter 2 Setting things up Part II — Coding with Mahout Chapter 3 In-core Algebra Chapter 4 Distributed Algebra Part III — Approximating Distributed Problems Chapter 5 ...
Next, you will learn about different classification algorithms and models such as the Naïve Bayes algorithm, the Hidden Markov Model, and so on. Finally, along with the examples that assist you in ...
1 ■ Meet Apache Mahout 1 PART 1 RECOMMENDATIONS ...................................................11 2 ■ Introducing recommenders 13 3 ■ Representing recommender data 26 4 ■ Making ...
NULL 博文链接:https://rangerwolf.iteye.com/blog/2093940
一些支持 Map-Reduce 的集群实现包括 k-Means、模糊 k-Means、Canopy、Dirichlet 和 Mean-Shift。 Distributed Naive Bayes 和 Complementary Naive Bayes 分类实现。
You will learn about Mahout building blocks, addressing feature extraction, reduction and the curse of dimensionality, delving into classification use cases with the random forest and Naïve Bayes ...
yelp-数据集-项目 Yelp 学术数据集项目 该项目分为以下目录:- 1.) DSParser:- a.) 包含解析数据集的库 b.) 与数据库交互 c.) 过滤数据并将数据从文本... 5.) SLURM_Scripts:- 包含运行 Mahout Naive Bayes 的 SLURM
比较典型算法有用于聚类的K-Means、用于统计学习的SVM和用于分类的Naive Bayes,主要使用的工具有Hadoop的Mahout等。 该过程的特点和挑战主要是用于挖掘的算法很冗杂,并且计算涉及的`数据量和计算量都很大,还有,...
MAHOUR,具体是将并行化算法移植到R语言中的一个数据分析平台,由海量数据研究中心负责开发,以下是具体安装步骤。 环境准备:系统要求 ubuntu,jdk最好为1.6 确保hadoop,mahout,R安装正确,并且可以顺利运行。 以下...