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. IMDG中的陷阱和问题

    陷阱 使用cache API时,一个最重要的问题就是潜在的数据加载.因为IMDG提供的分布式集合也都是实现的JDK的Map.Set等接口,以JDK的Map为例,它接口规定put和remove返回被替换 ...

  2. NewSQL数据库VoltDB特性简介

    VoltDB是一个革命性的新型数据库产品,被称作NewSQL数据库.它基于H-Store,号称比当前数据库产品的吞吐量高45倍,同时又具有很高的扩展性.它的特性主要有以下几点: Ø  高吞吐.低延迟: ...

  3. Linux Debugging (九) 一次生产环境下的“内存泄露”

    一个偶然的机会,发现一个进程使用了超过14G的内存.这个进程是一个RPC server,只是作为中转,绝对不应该使用这么多内存的.即使并发量太多,存在内存中的数据太多,那么在并发减少的情况下,这个内存 ...

  4. 带你深入理解STL之迭代器和Traits技法

    在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (in ...

  5. 基于OpenCV 的美颜相机推送直播流

    程序流程: 1.图像采集 先从opencv(2.4.10版本)采集回来摄像头的图像,是一帧一帧的 每一帧图像是一个矩阵,opencv中的mat 数据结构. 2.人脸的美化 人脸美化,我们用的皮肤检测, ...

  6. Swift基础之Animation动画研究

    最近研究了一下,Swift语言中关于Animation动画的实现学习,分两次进行相关内容的讲解 用表格列出各种动画情况 Demo首页显示展示了一种动画显示方式,代码如下: //绘画装饰    func ...

  7. 初探linux子系统集之timer子系统(一)

    一般来说要让整个linux系统跑起来,那么一个必须的就是linux的时钟,也就是时间子系统了,这里正好工作需要,那么就研究下linux下的时间子系统了. linux内核必须完成两种主要的定时测量.一个 ...

  8. 概率论:假设检验-t检验和Augmented Dickey–Fuller test

    http://blog.csdn.net/pipisorry/article/details/51184556 T检验 T检验,亦称student t检验(Student's t test),学生t检 ...

  9. Swift基础之显示波纹样式

    最近项目用到了蓝牙连接,搜索设备的内容,其中需要搜索过程中出现波纹的动画效果,在这里将项目中OC语言编写的这种动画效果,转换成Swift编写,下面简单介绍说明一下代码. 这里用到了两种方法实现波纹效果 ...

  10. 【一天一道LeetCode】#191. Number of 1 Bits

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Write a ...