解释mahout clusterdumper的输出

时间:2011-04-27 13:52:47

标签: hadoop cluster-analysis k-means mahout

我在抓取的网页上运行了一个群集测试(超过25K个文档;个人数据集)。 我做了一个clusterdump:

$MAHOUT_HOME/bin/mahout clusterdump --seqFileDir output/clusters-1/ --output clusteranalyze.txt

运行集群转储器后的输出显示25个元素“VL-xxxxx {}”:

VL-24130{n=1312 c=[0:0.017, 10:0.007, 11:0.005, 14:0.017, 31:0.016, 35:0.006, 41:0.010, 43:0.008, 52:0.005, 59:0.010, 68:0.037, 72:0.056, 87:0.028, ... ] r=[0:0.442, 10:0.271, 11:0.198, 14:0.369, 31:0.421, ... ]}
...
VL-24868{n=311 c=[0:0.042, 11:0.016, 17:0.046, 72:0.014, 96:0.044, 118:0.015, 135:0.016, 195:0.017, 318:0.040, 319:0.037, 320:0.036, 330:0.030, ...] ] r=[0:0.740, 11:0.287, 17:0.576, 72:0.239, 96:0.549, 118:0.273, ...]}

如何解释此输出?

简而言之:我正在寻找属于特定群集的文档ID。

是什么意思:

  • VL-x?
  • n = y c = [z:z',...]
  • r = [z'':z''',...]

0:0.017表示“0”是属于该集群的文档ID吗?

我已经在mahout wiki页面上阅读了CL,n,c和r的含义。但是,有人可以更好地向我解释它们或者指向一个更详细解释的资源吗?

很抱歉,如果我问一些愚蠢的问题,但我是一名新手,并且使用它作为我的课程作业的一部分进行聚类。

4 个答案:

答案 0 :(得分:4)

  1. 默认情况下,kmeans群集使用不包含数据点名称的WeightedVector。因此,您希望使用NamedVector自行创建序列文件。 seq文件的数量与映射任务之间存在一对一的对应关系。因此,如果您的映射容量为12,那么在制作seqfiles时,您希望将数据分成12个部分 NamedVecotr:

    vector = new NamedVector(new SequentialAccessSparseVector(Cardinality),arrField[0]);
    
  2. 基本上,您需要从HDFS系统下载clusteredPoints并编写自己的代码以输出结果。这是我编写的用于输出集群点成员资格的代码。

    import java.io.*;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.SequenceFile;
    import org.apache.mahout.clustering.WeightedVectorWritable;
    import org.apache.mahout.common.Pair;
    import org.apache.mahout.common.iterator.sequencefile.PathFilters;
    import org.apache.mahout.common.iterator.sequencefile.PathType;
    import org.apache.mahout.common.iterator.sequencefile.SequenceFileDirIterable;
    import org.apache.mahout.math.NamedVector;
    
    public class ClusterOutput {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
            // TODO Auto-generated method stub
            try {
                    BufferedWriter bw;
                    Configuration conf = new Configuration();
                    FileSystem fs = FileSystem.get(conf);
                    File pointsFolder = new File(args[0]);
                    File files[] = pointsFolder.listFiles();
                    bw = new BufferedWriter(new FileWriter(new File(args[1])));
                    HashMap<String, Integer> clusterIds;
                    clusterIds = new HashMap<String, Integer>(5000);
                    for(File file:files){
                            if(file.getName().indexOf("part-m")<0)
                                    continue;
                            SequenceFile.Reader reader = new SequenceFile.Reader(fs,  new Path(file.getAbsolutePath()), conf);
                            IntWritable key = new IntWritable();
                            WeightedVectorWritable value = new WeightedVectorWritable();
                            while (reader.next(key, value)) {
                                    NamedVector vector = (NamedVector) value.getVector();
                                    String vectorName = vector.getName();
                                    bw.write(vectorName + "\t" + key.toString()+"\n");
                                    if(clusterIds.containsKey(key.toString())){
                                            clusterIds.put(key.toString(), clusterIds.get(key.toString())+1);
                                    }
                                    else
                                            clusterIds.put(key.toString(), 1);
                            }
                            bw.flush();
                            reader.close(); 
                    }
                    bw.flush();
                    bw.close();
                    bw = new BufferedWriter(new FileWriter(new File(args[2])));
                    Set<String> keys=clusterIds.keySet();
                    for(String key:keys){
                            bw.write(key+" "+clusterIds.get(key)+"\n");
                    }
                    bw.flush();
                    bw.close();
                    } catch (IOException e) {
                            e.printStackTrace();
                    }
            }
    }
    

答案 1 :(得分:1)

完成答案:

  • VL-x:是群集的标识符
  • n = y:是群集中元素的数量
  • c = [z,...]:是集群的质心,带有 z是不同维度的权重
  • r = [z,...]:是群集的半径。

更多信息: https://mahout.apache.org/users/clustering/cluster-dumper.html

答案 2 :(得分:0)

我认为您需要阅读源代码 - 从http://mahout.apache.org下载。 VL-24130只是聚合群集的群集标识符。

答案 3 :(得分:-1)

您可以使用mahout clusterdump https://cwiki.apache.org/MAHOUT/cluster-dumper.html