Как выполнить кластеризацию k-средних в mahout с векторными данными, хранящимися как CSV?

У меня есть файл, содержащий векторы данных, где каждая строка содержит разделенный запятыми список значений. Мне интересно, как выполнить кластеризацию k-means на этих данных с помощью mahout. В примере, приведенном в wiki, упоминается создание sequenceFiles, но в противном случае я не уверен, что мне нужно сделать какой-то тип преобразования для получения этих sequenceFiles.

2 ответов


Я бы рекомендовал вручную читать записи из CSV-файла, создавать из них NamedVectors, а затем использовать файл последовательности для записи векторов в файл последовательности. У KMeansDriver метод run должен знать, как обрабатывать эти файлы.

файлы последовательности кодируют пары ключ-значение, поэтому ключ будет идентификатором образца (он должен быть строкой), а значение-векторной оберткой вокруг векторов.

вот простой код пример о том, как это сделать:

    List<NamedVector> vector = new LinkedList<NamedVector>();
    NamedVector v1;
    v1 = new NamedVector(new DenseVector(new double[] {0.1, 0.2, 0.5}), "Item number one");
    vector.add(v1);

    Configuration config = new Configuration();
    FileSystem fs = FileSystem.get(config);

    Path path = new Path("datasamples/data");

    //write a SequenceFile form a Vector
    SequenceFile.Writer writer = new SequenceFile.Writer(fs, config, path, Text.class, VectorWritable.class);
    VectorWritable vec = new VectorWritable();
    for(NamedVector v:vector){
        vec.set(v);
        writer.append(new Text(v.getName()), v);
    }
    writer.close();

кроме того, я бы рекомендовал прочитать главу 8 из Mahout в действии. Он дает более подробную информацию о представлении данных в Mahout.


возможно, вы могли бы использовать Elephant Bird для записи векторов в формате mahout

https://github.com/kevinweil/elephant-bird#hadoop-sequencefiles-and-pig