最简单例子:
聚类算法包括k-means,canopy,fuzzy k-means,lda等,例子是用k-means讲解的。
mahout的聚类算法要求输入格式是sequencefile,hadoop库也广泛使用这一格式
为mahout准备输入数据分为三步:
1:数据预处理
2:使用预处理数据创建vectors
3:保存vectors到sequencefile
具体到例子,第一步不需要做了,从第二步做起,上代码:
public static List<Vector> getPoints(double[][] raw) {
List<Vector> points = new ArrayList<Vector>();
for (int i = 0; i < raw.length; i++) {
double[] fr = raw[i];
Vector vec = new RandomAccessSparseVector(fr.length);
vec.assign(fr);
points.add(vec);
}
return points;
}
从代码中清楚看到,使用的是RandomAccessSparseVector,长度是每个点的维数,这里就是2了,这些Vector都放入到一个Vector List里边备用
下一步是要把这些vectors转换到mahout能使用的sequencefile
sequencefile和writeable这套东西可以看成hadoop自己搞的一套序列化的东东,你按他的要求做就行了
这篇文章对sequencefile的讲解比较好,http://yaoyinjie.blog.51cto.com/3189782/922368
hadoop SequenceFile 是一个由二进制形式key/value的字节流组成的存储文件,SequenceFile可压缩可切分
压缩方式有三种:CompressionType.NONE,CompressionType.RECORD,CompressionType.BLOCK
sequencefile的头格式包括:version,key和value的类名,是否压缩及压缩类名
sequencefile的写入通过SequenceFile.Writer来实现,调用append(key, value)方法写入
下面是实例代码:
public static void writePointsToFile(List<Vector> points,
String fileName,
FileSystem fs,
Configuration conf) throws IOException {
Path path = new Path(fileName);
SequenceFile.Writer writer = new SequenceFile.Writer(fs, conf,
path, LongWritable.class, VectorWritable.class);
long recNum = 0;
VectorWritable vec = new VectorWritable();
for (Vector point : points) {
vec.set(point);
writer.append(new LongWritable(recNum++), vec);
}
writer.close();
}
可以看到,append的时候,key是一个从0递增的整数LongWritable化,而value是VectorWritable化的vector,这里的vector是上面生成的vector list里边取得的