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