minhash算法

来源:互联网 发布:课堂教学互动软件 编辑:程序博客网 时间:2024/05/21 22:53
minhash算法是一个降维算法,对于我们如果要找出许多集合样例中相似的集合,类似于聚合.但是因为每个集合里面的元素过多,如果一个集合一一去跟其他集合匹配,因为集合里面的元素过多,造成比较的维度过大,那么将计算量会很大,那么minhash算法便是降低每个集合的维度,减少计算量而诞生的.
例如:有很多本书,我们要找出内容主题相似的书籍.当我们找出来后,这就意味着我们可以将相似的书籍推荐给读者.现在问题就是怎么找呢?有个方法,我们可以提取没本书内容的关键词,那么没本书都将可以看作一个集合,每个集合里面有很多个元素,每个元素都是一个关键词,然后通过比较两两本书集合内元素的重复程度,那么我们将可以得出两两本书之间的相似性.但是有个问题,那就是,没本书里面包含的关键词很多,所以计算量将会很大.那么minhash算法将派上用场.


minhash方法是:通过构建k个不同的hash函数,应用到不同的集合中,从而获取到k个hash值,这k个hash值便可以构建成一个新的向量,作为集合的一个新的特征值.比如:我们原先每个集合有100维,每一维都是0或1,那么我们的hash函数可以是第一个不为0,为1的下标.或者是其他其他,只要能不出现冲突就好.


minhash原理是:集合A = 看过芈月传的人群
              集合B = 看过琅琊榜的人群
相似度 = |A∩B| / |A∪B| = 既看过芈月传又看过琅琊榜的人数 / 看过芈月传或琅琊榜的人数.
已知集合X,设每次用来索引的函数为H(X),索引中第一个元素为Hmin(X),则对任意H(X),满足Himin(A) = Himin(B)的充要条件就是A和B中都存在一个相同的元素,所以有如下公式:
Pr[Hmin(A) = Hmin(B)] = |A∩B| / |A∪B|
注:Pr表示概率。
公式左侧的概率,我们可以通过选取有限个数的H(X)来趋近理论值,即:
满足Hmin(A) = Hmin(B)的H(X)的个数 / H(X)的个数 ≈ Pr[Hmin(A) = Hmin(B)] = |A∩B| / |A∪B|
以上就是MinHash算法的讲解。在实际应用中,当一个集合A的元素确定后,就可以调用一系列预先定义好的H(X)进行计算,得到一个数组[ H1min(A), H2min(A) ... Himin(A) ... Hnmin(A) ],将该数组作为中间数据进行存储,在每次需要即时计算任意两个集合A和B的相似度时读取每个集合对应的数组,通过定义如下随机变量r:
r = 1 if Hmin(A) = Hmin(B) else 0
得到相似度为:
∑r / n
在我这边的应用里,n = 2048。所以不管每个集合里有几百几千万个元素,都会被预先降维成包含2048个元素的数组(一律2048,通通2048,算起来不吃亏,算起来不上当^_^),后续的相似度计算的复杂度自然也成了一个常数。
0 0
原创粉丝点击