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

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

Ответы [ 2 ]

8 голосов
/ 11 января 2012

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

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

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

</p> <pre> 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.

0 голосов
/ 22 января 2013

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

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

...