mahout之MinHash实现

MinHash可用于聚类或者计算相似度,详情概述参见"MinHash概述及举例"博客,此处阐述mahout的MinHash实现,mahout用minhash来聚类。

涉及主要类:

 

org.apache.mahout.clustering.minhash.MinHashDriver
org.apache.mahout.clustering.minhash.MinHashMapper
org.apache.mahout.clustering.minhash.MinHashReducer

 

 参数说明如下:

 

 

Path input //输入数据文件,为SequenceFileInputFormat格式,其key为Text value为VectorWritable
Path output //输出数据文件,由debugOutput决定,true时为为SequenceFileOutputFormat false为TextOutputFormat,其key为Text value为VectorWritable或者Text
int minClusterSize    //最小族数,默认为5,达不到此值直接丢弃
int minVectorSize    //最小参与计算的vector size默认为5
String hashType      //hash type,有 LINEAR, POLYNOMIAL, MURMUR, MURMUR3,默认LINEAR
int numHashFunctions  //hash 函数个数,默认10,也就是hash次数
int keyGroups         //此值比较有意思,后面详述
int numReduceTasks  //reduce个数
boolean debugOutput //决定输出数据文件的数据格式和value值

 

Mapper执行过程:

 

1.针对Vector的每个元素执行hash运算,每次获取最小hash值,执行numHashFunctions次,共获取numHashFunctions个最小hash值

2.mahout分族采用的是keyGroups的形式去操作,也就是说需要分的族数,这样就利用每次hash的最小值执行组合操作,keyGroups为1那么不进行任何组合,只要hash最小值有相同的那么就在一个族中

3.针对keyGroups举例如下:

numHashFunctions为3

V1:1,2,3

V2:3,2,1

如果keyGroups为1那么V1和V2在一个族中,属于 1,2,3这三个族

如果keyGroups为2那么V1组合1-2,2-3,3-1;V2组合3-2,2-1,1-3那么V1和V2不在一个族中

也就是说keyGroups可以避免每次Hash的冲突

reduce执行过程:

1.获取每个组的Collection<Writable>

2.如果Collection<Writable>大于指定的minClusterSize 那么保留,反之丢弃

 

你可能感兴趣的:(Mahout)