如何使用存储为CSV的矢量数据在mahout中执行k-means聚类?

时间:2012-01-09 08:01:51

标签: mahout k-means

我有一个包含数据向量的文件,其中每行包含逗号分隔的值列表。我想知道如何使用mahout对这些数据执行k-means聚类。维基中提供的示例提到创建sequenceFiles,但是我不确定是否需要进行某种类型的转换才能获得这些sequenceFiles。

2 个答案:

答案 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