Интерпретация выходных данных от mahout clusterdumper - PullRequest
4 голосов
/ 27 апреля 2011

Я провел кластеризационный тест на просканированных страницах (более 25 тыс. Документов; набор личных данных).Я сделал 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, ...]}

Как интерпретировать этот вывод?

Вкратце: я ищу идентификаторы документов, которые относятся к определенному кластеру.

Что означает:

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

Имеет 0: 0,017 означает "0" - это идентификатор документа, который принадлежит этому кластеру?

Я уже прочитал на mahout wiki-страницах, что означают CL, n, c и r.Но кто-то может объяснить мне их лучше или указывает на ресурс, где это объясняется немного подробнее?

Извините, если я задаю несколько глупых вопросов, но я новичок с apache mahout и использую его как часть моего курса для кластеризации.

Ответы [ 4 ]

4 голосов
/ 24 января 2012
  1. По умолчанию для кластеризации kmeans используется WeightedVector, который не включает имя точки данных.Итак, вы хотели бы создать файл последовательности, используя NamedVector.Существует взаимно однозначное соответствие между количеством файлов seq и задачами сопоставления.Таким образом, если ваша емкость сопоставления равна 12, вы хотите разделить ваши данные на 12 частей при создании seqfiles NamedVecotr:

    vector = new NamedVector(new SequentialAccessSparseVector(Cardinality),arrField[0]);
    
  2. В основном вам нужно загрузить кластерные точки из вашей системы HDFS и записатьваш собственный код для вывода результатов.Вот код, который я написал для вывода членства в точке кластера.

    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 голос
/ 18 марта 2015

Для завершения ответа:

  • VL-x: идентификатор кластера
  • n = y: количество элементов в кластере
  • c = [z, ...]: центр тяжести кластера, где z - веса различных измерений
  • r = [z, ...]: радиус кластера.

Подробнее здесь: https://mahout.apache.org/users/clustering/cluster-dumper.html

0 голосов
/ 04 февраля 2013

Вы можете использовать mahout clusterdump https://cwiki.apache.org/MAHOUT/cluster-dumper.html

0 голосов
/ 28 апреля 2011

Я думаю, вам нужно прочитать исходный код - скачать с http://mahout.apache.org. VL-24130 - это просто идентификатор кластера для сходящегося кластера.

...