您的位置:首页 > 其它

mahout读书笔记 -- 聚类(2)

2013-01-06 15:16 99 查看
最简单例子:

聚类算法包括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里边取得的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: