什么是Mahout?" Apache Mahout? project's goal is to build a scalable machine learning library "我来拓展一下:(1) Mahout 是Apache旗下的开源项目,集成了大量的机器学习算法。(2) 大部分算法,可以运行在Hadoop上,具有很好的拓展性,使得大数据上的
什么是Mahout?" Apache Mahout? project's goal is to build a scalable machine learning library "我来拓展一下:(1) Mahout 是Apache旗下的开源项目,集成了大量的机器学习算法。(2) 大部分算法,可以运行在Hadoop上,具有很好的拓展性,使得大数据上的机器学习成为可能。本篇主要探讨 Mahout 0.9 中的聚类(Clustering)工具的用法。一、数据准备Mahout聚类算法的输入为List,即需要将每个待聚类的文档,表示为向量形式。在本文中,我们选择经典的 Reuters21578?文本语料。尝试对新闻内容进行文本聚类。1、下载数据[crayon-53b01de37e087548071658/]2、解压缩数据[crayon-53b01de37e08d580286630/]解压缩之后,reuters-sgm下,包含了若干*.sgm文件,每个文件中又包含了若干下属结构化文档:[crayon-53b01de37e092370305269/]在下文中,我们主要使用和中的文本。即标题+正文。3、抽取Mahout中内置了对上述Reuters预料的抽取程序,我们可以直接使用。[crayon-53b01de37e097623779753/]如上所述,抽取好的结果在./reuters-out文件夹下面,每篇文档,变成了一个独立的文件。一共有21578个txt,即数据集中含有21578篇文档:-)说下命名规则吧,例如:文件名:./reuters-out/reut2-006.sgm-246.txt,表示来自于./reuters-sgm/reut2-006.sgm中的第246篇文档,下标从0开始。4、转换成SequenceFile对于传统的文本聚类算法而言,下一步应该是:将文本转化为词的向量空间表示。然而,不要太着急哦。由于Mahout运行在Hadoop上,HDFS是为大文件设计的。如果我们把上述21578个txt都拷贝上去,这样是非常不合适的设想下:假设对1000万篇新闻进行聚类,难道要拷贝1000w个文件么?这会把name node搞挂的。因此,Mahout采用SequenceFile作为其基本的数据交换格式。内置的seqdirectory命令(这个命令设计的不合理,应该叫directoryseq才对),可以完成 文本目录->SequenceFile的转换过程。[crayon-53b01de37e09b762719714/]上述命令蕴含了2个大坑,在其他文档中均没有仔细说明:(1) -xm sequential,表示在本地执行,而不是用MapReduce执行。如果是后者,我们势必要将这些小文件上传到HDFS上,那样的话,还要SequenceFile做甚……(2) 然而seqdirectory在执行的时候,并不因为十本地模式,就在本地文件系统上寻找。而是根据-i -o的文件系统前缀来判断文件位置。也就是说,默认情况,依然十在HDFS上查找的……所以,这个file://的前缀是非常有必要的。其他2个参数:- -c UTF8:编码。
- -chunk 64:64MB一个Chunk,应该和HDFS的BLOCK保持一致或者倍数关系。
- -ow( 或?--overwrite):即使输出目录存在,依然覆盖。
- --weight(或 -wt) tfidf:权重公式,大家都懂的。其他可选的有tf (当LDA时建议使用)。
- --maxDFPercent(或 -x) 85:过滤高频词,当DF大于85%时,将不在作为词特征输出到向量中。
- --namedVector (或-nv):向量会输出附加信息。
- --analyzerName(或-a):指定其他分词器。
- --minDF:最小DF阈值。
- --minSupport:最小的支持度阈值,默认为2。
- --maxNGramSize(或-ng):是否创建ngram,默认为1。建议一般设定到2就够了。
- --minLLR(或 -ml):The minimum Log Likelihood?Ratio。默认为1.0。当设定了-ng > 1后,建议设置为较大的值,只过滤有意义的N-Gram。
- --logNormalize(或 -lnorm):是否对输出向量做Log变换。
- --norm(或 -n):是否对输出向量做p-norm变换,默认不变换。
- dictionary.file-0:词文本 -> 词id(int)的映射。词转化为id,这是常见做法。
- frequency.file:词id -> 文档集词频(cf)。
- wordcount(目录): 词文本 -> 文档集词频(cf),这个应该是各种过滤处理之前的信息。
- df-count(目录): 词id -> 文档频率(df)。
- tf-vectors、tfidf-vectors (均为目录):词向量,每篇文档一行,格式为{词id:特征值},其中特征值为tf或tfidf。有用采用了内置类型VectorWritable,需要用命令"mahout vectordump -i "查看。
- tokenized-documents:分词后的文档。
- -i:输入为上面产出的tfidf向量。
- -o:每一轮迭代的结果将输出在这里。
- -k:几个簇。
- -c:这是一个神奇的变量。若不设定k,则用这个目录里面的点,作为聚类中心点。否则,随机选择k个点,作为中心点。
- -dm:距离公式,文本类型推荐用cosine距离。
- -x :最大迭代次数。
- --clustering:在mapreduce模式运行。
- --convergenceDelta:迭代收敛阈值,默认0.5,对于Cosine来说略大。
- -i :我们只看最终迭代生成的簇结果。
- -d :使用 词 -> 词id 映射,使得我们输出结果中,可以直接显示每个簇,权重最高的词文本,而不是词id。
- -dt:上面映射类型,由于我们是seqdictionary生成的,so。。
- -o:最终产出目录
- -n:每个簇,只输出20个权重最高的词。
- T1 > T2,具体值是文档及距离计算公式而定。
- 若T1过大,会使得许多点属于多个Canopy,造成各个簇的中心点距离比较近,使得簇之间的区分不明显。
- 若T2过大,强标记数据点的数量会增加,从而减少簇个数。
- 若T2过小,会增加簇的个数,以及计算时间。
- 对数据进行采样。
- 计算所有文档之间的平均距离(使用要在Canopy中用的距离公式)。
- T1 = 平均距离 * 2;T2 = 平均距离。
- 对数据进行采样。
- 选择一个T2,T1 = 2 * T1。
- 进行聚类,并评测聚类效果,可使用k-fold交叉验证。
- 迭代选择下一个T2。
- 直到找到最优的T1 T2。
- 可以对非欧式距离空间的点进行聚类。传统K-Means将点视为向量,并计算距离。而谱聚类算法要求直接给出两样本间相似度的矩阵。使得一些不便于在欧式空间计算的多特征聚类问题,有了更好的解法。(例如,性别,年龄2个特征,在欧式空间中就没有显著意义)。
- 上面的这一更宽泛的约束条件,使得谱聚类对样本空间的形状无限制,并能收敛于全局最优解(无需使用)。
- 构建样本集的相似度矩阵W。
- 对相似度矩阵W进行稀疏化,形成新的相似度矩阵A。
- 构建相似度矩阵A的拉普拉斯矩阵L。
- 计算拉普拉斯矩阵L的前k个特征值与特征向量,构建特征向量空间。
- 将前k个特征向量(列向量)组合成N*k的矩阵,每一行看成k维空间的一个向量,利用K-means或其它经典聚类算法对该矩阵进行聚类。
- 传统K-Means等聚类中,需要将每个样本转化为一个向量。
- 谱聚类中,则需要直接给一个矩阵,其中存储了任意两个样本之间的相似度。
- -i :输入的相似度矩阵,邻接矩阵。
- -k:目标聚成2个簇。
- -o:聚簇中间结果。
- -d:相似度矩阵维度为6,也即样本共6个。
- -x:100,最多迭代100次。
- -cd:收敛阈值,默认0.5
- -ssvd:使用svd矩阵分解降维。
- -q:svd相关。
- sc-spectral/clusters-0:初始聚簇。
- sc-spectral/kmeans_out/clusteredPoints:最终结果,样本->聚簇映射。
- sc-spectral/kmeans_out/clusters-1-final:最终聚簇的信息。
- 给定主题数k,输出文档属于每个主题的概率(越大表示越贴近该主题)。
- 输出每个主题中,权重最大的几个词。相当于传统聚类之后的Tag。
- -k 主题数20
- -dt:输出的?
- -o:输出的?
- -x:迭代100次,其实对于LDA,1000~2000次是比较合理的。
- -nt:词的数量,即dictionary.file-0的大小。
- Key是文档id,与文件的对应关系可以在/user/coder4/reuters-cvb-vectoers/docIndex中查看。
- Value是文档属于Topic 0~19的概率。按照值Sort一下,就能知道文档属于哪个主题的概率最大。
- 一共有20行有效输出,Key 0~19,代表了20个主题。
- 每个Value中有41806个词的权重。表示了词属于当前主题的权重。
原文地址:Mahout – Clustering (聚类篇), 感谢原作者分享。