海量数据相似性度量与聚类: LHS-MinHash
写本文的原因是近期在涉猎用户画像相关的无监督学习理论,刚好看到一篇运用LHS-MinHash做用户聚类的文章,却讲得过于笼统,对我这样的萌新(菜鸡)不太友好。于是我去搜索了关于LHS-MinHash和simhash的相关博客,有的写得非常不负责,甚至误导了我,有的写的比较详细,但部分细节总感觉有点断片,好像漏掉了什么。同时,这些博客的内容比较相似,原以为是互相借鉴的,后来发现它们都是复述Stanford的大数据课程,又没写清楚。因此我也来总结一篇,只求我自己搞清楚LHS-MinHash的原理和用途。因此,本篇文章的大部分内容将源于Stanford课程(下称课程)Mining of Massive Datasets的第三章,有兴趣的同学可以自行查阅。
对待社交网络中每天都在更新的千亿级别的无标签数据,传统的聚类方法效率太低了,比方说Kmeans,每个样本都必须与所有候选中心计算相似度,才能进行归类,因此算法的时间复杂度是 O(NK) O ( N K ) ,其中 K K 是聚类数,
是样本数(上千亿),太奢侈了,根本无法实现日均多次滚动,无法上线或产品化。聚类的核心是“发现相似物品”,这与其他的一些问题是异曲同工的,比如社区检测(Community Detection),海量数据查重等等。Stanford课程中举的例子就是海量网页的查重,为了高效地解决这个问题,课程依次提出了“Shingling”和“MinHash”算法,而针对数据量过大的问题,提出了“LSH hashing”,本文也将挑取其中的“MinHash”和“LSH hashing”进行总结。
预备知识:Jaccard 相似度

MinHash
对于一个网页(或文章),我们可以用Word2vec、用BOW、用k-shingle来表达,这些方法无一例外地占用非常大的空间,使得文章本身的存储就是一个问题,更不要提文章之间的相似度运算了。如果将word看成特征,那么文章就是在一个高维词空间中的向量,对于这样一种数据表达,很容易想到对它进行降维,minhash正是这么一个思路。为了讲清楚minhash,首先要定义一种集合的矩阵表达。
假设全集为 {
a,b,c,d,e} { a , b , c , d , e } ,四个子集分别是 S1={
a,d} S 1 = { a , d } , S2={
c} S 2 = { c } , S3={
b,d,e} S 3 = { b , d , e } , S4={
a,c,d} S 4 = { a , c , d } 。则可以定义一个叫“characteristic matrix”的矩阵 C(r,c) C ( r , c ) ,矩阵的列对应一个子集,矩阵的行对应全集里的一个元素,若第 c c 个子集中包含元素
,则 C(r,c)=1 C ( r , c ) = 1 ,否则 C(r,c)=0 C ( r , c ) = 0 ,如下图所示。为了方便理解,可以将characteristic matrix的行看成物品(product),列看成用户(customer),该矩阵的意义即用户的购买历史列表。显然,characteristic matrix是一个极度稀疏的高维矩阵。

Minhashing
为了方便解释,下面都把子集称为“用户”,把元素称为“商品”好了。所谓“MinHash”(最小哈希),就是指将上面的characteristic matrix的行随机打乱,然后取每一列中第一个非零元素的行号作为该用户的“MinHash Value”(最小哈希值),进行 d d 次打乱产生
个“MinHash Value”,构成该用户的“MinHash Signature”(最小哈希签名)向量,由于签名向量的维度通常远低于商品个数,因此相当于做了降维。使用降维的特征向量来衡量用户之间的相似度。
以上是MinHash的综述,光这么讲很难理解,下面给出一个例子。假设随机打乱函数 h h ,将矩阵的行顺序变成了
,如下图所示, S1 S 1 列的首个非零元素是 a a ,则用
作为 S1 S 1 的签名,即 h(S1)=a h ( S 1 ) = a 。同理,可以得到 h(S2)=c h ( S 2 ) = c , h(S3)=b h ( S 3 ) = b , h(S4)=a h ( S 4 ) = a 。

之所以称之为“MinHash”,我认为,characteristic matrix的每一列都可以看作是对一个用户的哈希化,不同的行排列方式能获得不一样的哈希串,如果两个用户的购买列表足够相似,那么两个哈希串也将是很相似的。而“最小”体现在取“第一个非零元素的所在行”。为什么要费尽心思定义这样一个奇怪的哈希值呢?
是由于一个神奇的定理:两个集合的MinHash值相等的概率,等于这两个集合的Jaccard相似度。
首先证明该定理。现在我们拿 S