c++ 哈希_最小哈希(MinHash)算法

我们处在大数据时代,面临着各种各样的数据任务,而它们大部分都可以用数据挖掘和机器学习知识解决,例如分类、聚类、检索等。进一步,这些问题可以归结为最近邻搜索(Nearest Neighbor Search)问题。我们先给出一个真实的应用场景:考虑一个搜索引擎上的应用场景,当我们输入若干个关键字时,搜索引擎可以返回很多结果页面。如果不做任何处理,我们会发现很多页面是重复的。但是,我们更希望返回的结果页面不同,即返回网页的多样性。这时我们需要进行网页查重检测(webpage duplicate detection),能够快速地排除掉重复率很高的页面。这个应用问题可以建模为最近邻搜索。

如下图所示,在一个二维平面内有若干个点,假设我们直观地以二维平面内的欧几里得距离作为衡量标准,我们需要查询距离红点的最近邻居。为了找到这个点(图中为蓝点),我们需要一一计算每个点和红点的距离然后返回最小值对应的点。假设有N个点,时间复杂度就是O(N)。在大数据时代背景下,N非常大,导致时间复杂度非常高;如果每个点的表达也复杂的话,例如,每个点表达成10万维的向量,时间复杂度将更加感人。。。

c++ 哈希_最小哈希(MinHash)算法_第1张图片

在介绍求解方法之前,我们先给出上述最近邻搜索问题的两个引申问题。

  1. $R$-Near Neighbor: 不同于找到查询点的最近邻居,该问题旨在找到所有与查询点距离小于阈值R的所有点。
  2. $c$-Approximate Near Neighbor: 基于$R$-Near Neighbor,以1-delta 的概率找到与查询点距离小于$cR$的点($c$>=1)。

不止欧几里得距离,很多度量被提出来衡量两点相隔远近,我们称之为相似度(similarity)或者距离(distance),包括,欧几里得距离(Euclidean distance),余弦相似度(Cosine similarity),曼哈顿距离(Manhattan distance),雅卡尔指数(Jaccard similarity)。显然,相似度越大,距离越小,两个点相隔越近。

在大数据背景下,精确计算相似度是不现实的,所以主要是近似计算相似度。这里,我主要介绍一种近似算法 -- Data Independent Hashing (数据独立性哈希) or Randomized Hashing (随机哈希)。这种方法使用一组(比如,n)随机哈希函数将每个数据点(m维数据,n<< m)映射到 n维空间,使得相似的数据点在n维空间中相隔很近,不相似的点相隔很远。显然,在这个过程中实现了降维。简单来说,Randomized Hashing算法本质就是,对原始数据进行降维处理,比如 n维向量表达,然后计算n维向量两两距离,以此来近似原始数据相似度。此外,该算法还有一个特点,整个过程中没有任何学习过程,因此进一步提高效率。在网页查重检测问题中,网页的表达相当复杂,我们可以用这种方法快速地对网页进行降维表达并计算近似相似度,进而排除掉重复网页。

接下来,我将介绍其中一种数据独立性哈希 -- MinHash (最小哈希)。它用于近似计算集合或者向量的Jaccard similarity。

先举例介绍集合的向量表达:一个全集$U={1,2,3,4,5,6,7}$和子集$S={1,3,6,7}$,我们可以用一个7维向量表达S,每一维依次对应全集中的元素1,2,...,7,如果S包含这个元素,对应的维度值为1,否则为0,即,$S=[1,0,1,0,0,1,1]$。

随机置换$pi$:pi: U -> U

考虑随机置换的高复杂度,可以使用随机哈希函数近似:f: U -> R,即,均匀地将每个元素单射到实数轴上。

之后,我们可以全局地将随机置换或者随机哈希函数用于所有子集上,如下图所示。

c++ 哈希_最小哈希(MinHash)算法_第2张图片

对于MinHash算法而言,每个子集最重要的元素就是第一个元素,例如,S中的元素7,因为置换后它排在第一个,而随机哈希后它映射到最左端。整个过程我们可以表示成 $h(S)=argmin(pi(S))$ or $h(S)=argmin(f(S))$,同时,我们发现通过一次随机置换或者随机哈希函数(我们称之为一次hash过程),我们可以用一个元素表示整个集合,如果我们使用n个随机置换或者随机哈希函数,子集就可以表示成一个n维的signature(签名)。接下来,就可以两两计算hamming距离来近似Jaccard系数。

c++ 哈希_最小哈希(MinHash)算法_第3张图片

上图给出两个集合,S1和S2,使用两个哈希函数,h1和h2,最后计算两个2维签名,[h1(S1),h2(S1)]=[1, 3]和[h1(S2),h2(S2)]=[1, 1],对应维度上相同元素占哈希函数个数比例来近似Jaccard系数,用数学表达就是,Pr(h(S1)=h(S2)) = Jaccard Similarity(S1, S2),即n维签名中对应元素相等的概率等于Jaccard系数。这个例子中近似后误差比较大,当然,随着哈希函数增加,误差会逐步减小直至平稳。

上述描述了一个binary set (二元集合)模型,即向量表达式中只有 0 和 1两个取值,但是现实世界中,普遍存在一种情况,每个维度的值是大于等于0的任意实数,例如在词袋模型中,假设每个维度对应一个单词,它的值表示tf-idf值,我们抽象出一个weighted set (加权集合)。显然MinHash算法无法处理实值,它只是简单地将非0值当成1来处理,无法体现不同值所代表的不同重要性。

你可能感兴趣的:(c++,哈希,路由器距离向量算法计算举例,页面置换算法实验报告c语言)