Edu*_*nal 5 java apache hadoop mahout
我正在用Mahout分析k-means算法.我将运行一些测试,观察性能,并根据我得到的结果做一些统计.
我无法弄清楚在Mahout中运行我自己的程序的方法.但是,命令行界面可能就足够了.
要运行示例程序,我这样做
$ mahout seqdirectory --input uscensus --output uscensus-seq
$ mahout seq2sparse -i uscensus-seq -o uscensus-vec
$ mahout kmeans -i reuters-vec/tfidf-vectors -o uscensus-kmeans-clusters -c uscensus-kmeans-centroids -dm org.apache.mahout.common.distance.CosineDistanceMeasure -x 5 -ow -cl -k 25
Run Code Online (Sandbox Code Playgroud)
数据集是一个大型CSV文件.每一行都是一条记录.功能以逗号分隔.第一个字段是ID.由于输入格式,我不能马上使用seqdirectory.我正在尝试实现这个类似问题的答案如何使用存储为CSV的矢量数据在mahout中执行k-means聚类?但我还有两个问题:
要以SequenceFile格式获取数据,您可以采取几种策略.两者都涉及编写自己的代码 - 即,不是严格的命令行.
策略1 使用Mahout的CSVVectorIterator类.您传递了一个java.io.Reader,它将在您的CSV文件中读取,将每一行转换为DenseVector.我从来没有使用过这个,但是在API中看到了它.如果你对DenseVectors没问题的话,看起来很直接.
策略2 编写自己的解析器.这很简单,因为你只需将每一行拆分为",",你就可以循环使用一个数组.对于每行中的每个值数组,使用以下内容实例化向量:
new DenseVector(<your array here>);
Run Code Online (Sandbox Code Playgroud)
并将其添加到List(例如).
然后......一旦你有了一个向量列表,就可以使用类似的东西将它们写入SequenceFiles(我在下面的代码中使用了NamedVectors):
FileSystem fs = null;
SequenceFile.Writer writer;
Configuration conf = new Configuration();
List<NamedVector> vectors = <here's your List of vectors obtained from CSVVectorIterator>;
// Write the data to SequenceFile
try {
fs = FileSystem.get(conf);
Path path = new Path(<your path> + <your filename>);
writer = new SequenceFile.Writer(fs, conf, path, Text.class, VectorWritable.class);
VectorWritable vec = new VectorWritable();
for (NamedVector vector : dataVector) {
vec.set(vector);
writer.append(new Text(vector.getName()), vec);
}
writer.close();
} catch (Exception e) {
System.out.println("ERROR: "+e);
}
Run Code Online (Sandbox Code Playgroud)
现在,您有一个SequenceFile格式的"points"目录,可用于K-means聚类.您可以将此目录中的命令行Mahout命令指定为输入.
无论如何,这是一般的想法.可能还有其他方法.