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

最简单例子:

聚类算法包括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里边取得的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值