我有一个包含数据向量的文件,其中每行包含逗号分隔的值列表。我想知道如何使用mahout对这些数据执行k-means聚类。维基中提供的示例提到创建sequenceFiles,但是我不确定是否需要进行某种类型的转换才能获得这些sequenceFiles。
答案 0 :(得分:8)
我建议手动读取CSV文件中的条目,从中创建NamedVectors,然后使用序列文件writer在序列文件中写入向量。从那以后,KMeansDriver运行方法应该知道如何处理这些文件。
序列文件对键值对进行编码,因此键将是样本的ID(它应该是一个字符串),并且值是围绕向量的VectorWritable包装器。
以下是有关如何执行此操作的简单代码示例:
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();
另外,我建议阅读Mahout in Action的第8章。它提供了关于Mahout中数据表示的更多细节。
答案 1 :(得分:0)
也许您可以使用Elephant Bird以mahout格式编写矢量
https://github.com/kevinweil/elephant-bird#hadoop-sequencefiles-and-pig