Map:

Vector featureVector = features.get();

if (featureVector.size() < minVectorSize) {

      return;

    }

    // Initialize the MinHash values to highest

    for (int i = 0; i < numHashFunctions; i++) {

      minHashValues[i] = Integer.MAX_VALUE;

    }



    for (int i = 0; i < numHashFunctions; i++) {

      for (Vector.Element ele : featureVector.nonZeroes()) {

        int value = hashValue ? (int) ele.get() : ele.index();

        bytesToHash[0] = (byte) (value >> 24);

        bytesToHash[1] = (byte) (value >> 16);

        bytesToHash[2] = (byte) (value >> 8);

        bytesToHash[3] = (byte) value;

        int hashIndex = hashFunction[i].hash(bytesToHash);

        //if our new hash value is less than the old one, replace the old one

        if (minHashValues[i] > hashIndex) {

          minHashValues[i] = hashIndex;

        }

      }

    }

    // output the cluster information

    for (int i = 0; i < numHashFunctions; i++) {

      StringBuilder clusterIdBuilder = new StringBuilder();

      for (int j = 0; j < keyGroups; j++) {

        clusterIdBuilder.append(minHashValues[(i + j) % numHashFunctions]).append('-');

      }

      //remove the last dash

      clusterIdBuilder.deleteCharAt(clusterIdBuilder.length() - 1);



      cluster.set(clusterIdBuilder.toString());



      if (debugOutput) {

        vector.set(featureVector);

        context.write(cluster, vector);

      } else {

        context.write(cluster, item);

      }

    }


 protected void reduce(Text cluster, Iterable<Writable> points, Context context)

    throws IOException, InterruptedException {

    Collection<Writable> pointList = Lists.newArrayList();

    for (Writable point : points) {

      if (debugOutput) {

        Vector pointVector = ((VectorWritable) point).get().clone();

        Writable writablePointVector = new VectorWritable(pointVector);

        pointList.add(writablePointVector);

      } else {

        Writable pointText = new Text(point.toString());

        pointList.add(pointText);

      }

    }

    if (pointList.size() >= minClusterSize) {

      context.getCounter(Clusters.ACCEPTED).increment(1);

      for (Writable point : pointList) {

        context.write(cluster, point);

      }

    } else {

      context.getCounter(Clusters.DISCARDED).increment(1);

    }

  }

 


mahout系列----minhash聚类的更多相关文章

  1. Mahout系列之----kmeans 聚类

    Kmeans是最经典的聚类算法之一,它的优美简单.快速高效被广泛使用. Kmeans算法描述 输入:簇的数目k:包含n个对象的数据集D. 输出:k个簇的集合. 方法: 从D中任意选择k个对象作为初始簇 ...

  2. mahout系列之---谱聚类

    1.构造亲和矩阵W 2.构造度矩阵D 3.拉普拉斯矩阵L 4.计算L矩阵的第二小特征值(谱)对应的特征向量Fiedler 向量 5.以Fiedler向量作为kmean聚类的初始中心,用kmeans聚类 ...

  3. Mahout 系列之--canopy 算法

    Canopy 算法,流程简单,容易实现,一下是算法 (1)设样本集合为S,确定两个阈值t1和t2,且t1>t2. (2)任取一个样本点p属于S,作为一个Canopy,记为C,从S中移除p. (3 ...

  4. ML.NET技术研究系列-2聚类算法KMeans

    上一篇博文我们介绍了ML.NET 的入门: ML.NET技术研究系列1-入门篇 本文我们继续,研究分享一下聚类算法k-means. 一.k-means算法简介 k-means算法是一种聚类算法,所谓聚 ...

  5. Mahout系列之-----相似度

    Mahout推荐系统中有许多相似度实现,这些组件实现了计算不能User之间或Item之间的相似度.对于数据量以及数据类型不同的数据源,需要不同的相似度计算方法来提高推荐性能,在mahout提供了大量用 ...

  6. Mahout系列之----距离度量

       x = (x1,...,xn) 和y = (y1,...,yn) 之间的距离为 (1)欧氏距离   EuclideanDistanceMeasure (2)曼哈顿距离  ManhattanDis ...

  7. Mahout 系列之----共轭梯度

    无预处理共轭梯度 要求解线性方程组 ,稳定双共轭梯度法从初始解 开始按以下步骤迭代: 任意选择向量 使得 ,例如, 对 若 足够精确则退出 预处理共轭梯度 预处理通常被用来加速迭代方法的收敛.要使用预 ...

  8. Mahout系列之----共轭梯度预处理

    对于大型矩阵,预处理是很重要的.常用的预处理方法有: (1) 雅克比预处理 (2)块状雅克比预处理 (3)半LU 分解 (4)超松弛法

  9. mahout系列----Dirichlet 分布

    Dirichlet分布可以看做是分布之上的分布.如何理解这句话,我们可以先举个例子:假设我们有一个骰子,其有六面,分别为{1,2,3,4,5,6}.现在我们做了10000次投掷的实验,得到的实验结果是 ...

随机推荐

  1. 二维码扫描&集合排序

    一.二维码扫描机制 二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构 ...

  2. 【一天一道Leetcode】#190.Reverse Bits

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 我的个人博客已创建,欢迎大家持续关注! 一天一道le ...

  3. ormlite介绍一

    概述       ORMlite是类似hibernate的对象映射框架,主要面向java语言,同时,是时下最流行的android面向数据库的的编程工具. 官方网站:http://ormlite.com ...

  4. 转义字符\(在hive+shell以及java中注意事项):正则表达式的转义字符为双斜线,split函数解析也是正则

    转义字符 将后边字符转义,使特殊功能字符作为普通字符处理,或者普通字符转化为特殊功能字符. 各个语言中都用应用,如java.python.sql.hive.shell等等. 如sql中 "\ ...

  5. ExtJS学习(二)Ext组件模型

    Ext中所有的组件都继承自Ext.component,这种单根继承的模型保证所有组件都拥有相同的通用方法与生命周期,这样在后续对这些组件进行维护管理时将更加便捷,同时也保证了在进行布局时的便利. 组件 ...

  6. iOS9 中关闭ATS的方法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) iOS9中增加了系统的安全性,你会发现默认情况下打开非http ...

  7. 01安卓像素 dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算

    一.基本概念 dip        : Density independent pixels ,设备无关像素. dp        :就是dip px        : 像素 dpi       :d ...

  8. 远程调试Eclipse插件的设置

    1. 被调试方建立一个命令行来运行Eclipse debugEclipse.cmd: eclipse.exe -nl zh_CN -vmargs -XX:+HeapDumpOnOutOfMemoryE ...

  9. 面试常用算法总结——排序算法(java版)

    排序算法 重要性不言而喻,很多算法问题往往选择一个好的排序算法往往问题可以迎刃而解 1.冒泡算法 冒泡排序(Bubble Sort)也是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个 ...

  10. SpringMVC返回json是设置编辑等消息头,消息头信息介绍(respone.setHeader,这个从网上获取)

    1.  SpringMVC中设置消息头,例子如下: ? 因为上面的代码没有添加该文件的编码说明 , WEB应用程序在将jsp翻译成class文件时 , 把该字符串的内容按默认的保存方式指定的编码ASC ...