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 那么保留,反之丢弃