在我的第一篇文章中,介绍了用于近似计算二元集合Jaccard 系数的MinHash算法。但是现实世界中加权集合更加普遍,例如,用于文本处理的词袋模型,每个词都会赋予一个非负实数(我们称之为权重weight)来表示这个词在文本中的重要性。为了有效处理weight,加权Jaccard相似度(weighted Jaccard similarity)被提出来,它被用于计算加权集合的相似度,相应地,加权最小哈希(Weighted MinHash)算法用于估计weighted Jaccard similarity。目前,这类算法大体上可以分为三类,如下图所示。本文着重介绍 Quantization-based 和 Others
Quantization-based 思想非常简单,既然MinHash算法用于binary set,如果我们能够将weighted set转化成binary set,就可以使用MinHash 算法。为此,我们将weighted set中的每个元素量化成weight=1 的子元素,每个子元素互不相同。这样,我们就得到一个binary set,其大小大于weighted set,并且这个binary set中所有元素各不相同,进而就可以使用MinHash算法。
这种方法,存在两个问题。1. 如何量化每个元素,在大多数情况下,weight范围在0~10,直接以1为单位量化会产生很大误差,尤其对于weight<1的元素无法进行量化。最简单的方法就是对每个元素乘以一个较大的整数C,进而以1为单位量化。2. 即使乘以一个较大的整数,大多数weight仍有可能是小数,第二个问题即如何处理weight的小数部分。因为MinHash算法只能处理存在的元素(weight=1)和不存在的元素(weight=0),所以小数部分或者直接保存(weight=1)或者直接抛弃(weight=0)。
[Haveliwala et. al., 2000]算法采用四舍五入法来处理weight的小数部分。而[Haeupler et. al., 2014]算法则以概率来决定是否保留,具体而言,产生一个均匀分布的随机数,如果该随机数小于或等于小数部分数值,则保留;否则抛弃。
显然,Quantization-based算法复杂度和较大的整数C紧密相关,C越大,产生的子元素越多,结果越精确,但是计算所需的时间也多。
在Others类别算法中,已经提出的算法各异,没有一个统一的idea,因此把它们归于该类别。[Gollapudi et. al., 2006]这篇文章提出了两个方法,第一个算法提出了重要的概念--active index,进而启发了CWS算法框架,该算法将在下一章中详细介绍。第二个算法[Gollapudi et. al., 2006](2)则比较简单,类似Quantization-based算法,将weighted set转化成binary set然后使用MinHash算法。该算法首先对集合权重进行归一化处理,将所有weight转化成0~1之间。然后对每个元素产生一个随机数,如果该随机数小于或等于归一化后的weight,则保留该元素(weight=1),否则抛弃(weight=0)。该算法误差较大。
[Chum et. al., 2008]方法及其简单,尽管存在误差,但是算法非常高效,仅需一次扫描集合。对每个元素以公式 $h(S_k) = dfrac{-log x_k}{S_k}$ 赋予一个随机数,其中$S_k$表示第k个元素的weight,$x_k~Uniform(0,1)$,表示对应第k个元素的标准均匀分布随机数。具有最小hash值的元素作为fingerprint。本质上,$h(S_k)$是以$weight=S_k$为参数的指数分布,该算法实际上以正比于元素weight的概率进行抽样。例如,如果集合S中有3个元素,weight分别为{0.1, 0.2, 0.3}。以0.1/(0.1+0.2+0.3)=1/6概率抽取第一个元素,以0.2/(0.1+0.2+0.3)=2/6概率抽取第二个元素,以0.3/(0.1+0.2+0.3)=3/6概率抽取第三个元素。
[Shrivastava, 2016]算法本质上基于rejection sampling。在扫描整个数据集获取每个元素weight的最大值之后,如下图所示,$U_i$代表元素 $S_i$在整个数据集中weight的最大值,很容易发现在每个集合中,每个元素的weight ($S_i$)可以将$U_i$划分为红绿两部分,绿色代表实际weight值,红色代表与$U_i$的差值。接下来操作就很简单了,生成一系列均匀分布在$[0, U_1+U_2+U_3+U_4+U_5]$的随机数,如果该随机数落在该集合的绿色部分,则停止并将已产生随机数的个数作为hash值。该算法最大的弱点就是需要首先遍历一遍整个数据集以获得每个元素weight的最大值,因此不适合流数据处理。当然,根据rejection sampling性质,如果对weight最大值设置足够大的数可以避免扫描,但是这个会造成低效的有效采样(即采样绿色部分),进而影响算法的实际应用。
注:关于上述所有算法的随机数产生,我们需要注意全局产生随机数,即,对于不同集合的相同元素(例如上图中,两个集合S和T,$S_1$和$T_1$分别对应这两个集合中第一个元素的weight值,但都表示第一个元素),产生的一个或者一系列随机数在一次hash过程中必须是相同的,为此,我们可以以该元素为种子产生随机数,保证随机数针对不同集合中相同元素的全局性。
参考文献:
[Haveliwala et. al., 2000] T. H. Haveliwala, A. Gionis, and P. Indyk, “Scalable Techniquesfor Clustering the Web,” inWebDB, 2000, pp. 129–134.
[Haeupler et. al., 2014] B. Haeupler, M. Manasse, and K. Talwar, “Consistent Weighted Sampling Made Fast, Small, and Easy,” arXivpreprintarXiv:1410.4266, 2014.
[Gollapudi et. al., 2006] S. Gollapudi and R. Panigrahy, “Exploiting Asymmetry in Hierar-chical Topic Extraction,” inCIKM, 2006, pp. 475–482.
[Chum et. al., 2008] O. Chum, J. Philbin, and A. Zisserman, “Near Duplicate ImageDetection: Min-Hash and Tf-Idf Weighting.” inBMVC, vol. 810,2008, pp. 812–815.
[Shrivastava, 2016] A. Shrivastava, “Simple and Efficient Weighted Minwise Hash-ing,” inNIPS, 2016, pp. 1498–1506.