Как выполнить кластеризацию 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