5

我对抓取的页面(超过 25K 文档;个人数据集)进行了聚类测试。我做了一个集群转储:

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

运行 cluster dumper 后的输出显示 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=yc=[z:z', ...]
  • r=[z'':z''', ...]

0:0.017 是否意味着“0”是属于该集群的文档 ID?

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

抱歉,如果我问一些愚蠢的问题,但我是一个新手,使用 apache mahout 并将它用作我的集群课程作业的一部分。

4

4 回答 4

4
  1. 默认情况下,kmeans 聚类使用不包含数据点名称的 WeightedVector。因此,您想使用 NamedVector 自己制作一个序列文件。seq 文件的个数和映射任务是一一对应的。因此,如果您的映射容量为 12,则在制作 seqfiles NamedVecotr 时,您希望将数据切成 12 块:

    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();
                    }
            }
    }
    
于 2012-01-24T15:53:57.750 回答
1

要完成答案:

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

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

于 2015-03-18T20:02:53.093 回答
0

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

于 2011-04-28T06:10:47.930 回答
-1

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

于 2013-02-04T12:24:50.613 回答