Hashing(哈希)

数据挖掘中很重要的一个问题就是,发现数据中的相似项。使用的主要就是Hashing算法。整个流程如下图所示:

发现相似项的用途:
* 论文查重
* 协同过滤(collaborative filtering):相似兴趣用户推荐

流程:
image.png

1、Shingling

我们可以用此来表征集合或者说文档的相似度。

1.1 k-shingling

shingling就是说将一个字符串,变成一个由字符组成的集合。

1.1.1 示例1

比如一个文档: “a rose is a rose is a rose”。首先进行分词,分词后的集合是:(a,rose,is,a,rose,is, a, rose)

k=4的4-shingling集合:{ (a,rose,is,a), (rose,is,a,rose), (is,a,rose,is), (a,rose,is,a), (rose,is,a,rose) }
去掉重复后的集合:{ (a,rose,is,a), (rose,is,a,rose), (is,a,rose,is) }

1.1.2 示例2

我们来比较两个单词:document,monument。首先进行k-shingling,然后我们求他们的相似度。
k=1:
‘document’: { d, o, c, u, m, e, n, t } ;‘monument’:{ m, o,n, u, m, e, n, t }
然后我们求他们的相似度:
SIM( { d, o, c, u, m, e, n, t } , { m, o,n, u, m, e, n, t } ) = 6/8
k=4:
‘document’:{ doc, ocu, cum, ume, men, ent } ;‘monument’:{mon, onu, num, ume, men, ent }
SIM( { doc, ocu, cum, ume, men, ent },{mon, onu, num, ume, men, ent } ) = 3/9

从上面我们可以看出,k大小的选择,对于结果有很大影响。k的选择应该足够的大,因为太小根本没有比较的必要。比如极端情况下,我们取k=1,那么所有的文档,都可以用26个字母的集合来表示,也就没有相似度可言。
但是k选的足够大的话,将会带来存储上的困扰,会造成数据量相当大。对于比较短的文档,我们选择k=5即可;对于比较长的文本我们可以选择k=10。
刚才说到,如果k选择过大,计算每一个匹配的相似度,将是非常耗费时间的事情,而且,如果文档很大,将非常耗时,所以我们需要对数据继续进行处理。

2、Min-hashing

2.1 集合的相似度(jaccard相似度)

定义:是指两个集合的交集与他们并集的比率。
公式:
image.png
示例:
image.png

2.2 集合的矩阵表示:

首先我们将数据,变成矩阵形式,表示成其特征矩阵,这会非常有利于我们的理解。

扫描二维码关注公众号,回复: 1108967 查看本文章

表示规则:

  • :对应数据的每个集合;
  • :对应某个集合的全部元素

2.2.1 示例:

比如下面的例子,我们来构造特征矩阵:
我们对四个字符串进行shingling后得到四个集合,简单起见,我们选择1-shingling。得到的四个集合是S1 = {a,d};S2 = {c};S3 = {b,d,e};S4={a,c,d}。四个集合表示成矩阵:
特征矩阵
我们可以清楚地看到矩阵如何得出的。求四个集合的并集,作为如果这个集合的行索引,如果这个集合的元素,在并集中,则为1否则为0。

2.2.2 计算两个集合的相似度:

计算公式:
image.png
image.png
比如S1和S2两个集合。S3=01011;S4=10110。他们交集是1,并集是5,所以相似度是1/5。

2.3 最小哈希签名

刚才提到数据量大,耗时会很大,我们需要对数据进行处理,我们使用Min hashing(最小哈希)将集合的特征矩阵,转变成签名矩阵。

2.3.1 签名矩阵(Signature Matrix)

回到前面介绍的集合的特征矩阵表示M。我们随机选择n个排列转换,用于M的行处理。一般m的选择为一百或几百,数量越大效果越好,但是随之计算量增大。对于集合S对应的列,分别调用最小哈希函数(随机排列变换)h1,h2….hn,便可以构建矩阵M的最小哈希签名矩阵(Signature Matrix)。也就是[h1(S),h2(S),h3(S)…..hn(S)],一般写成列向量的形式。
上面注意,否则后面的计算看不懂

哈希函数:其实在这里是按照随机n个排列,某一列,最先出现1的行数。
签名矩阵的行列数,行数是n,列数与M相同。

我们来看几个例子:

例子1:
image.png
例子2:
这一个解释更加清晰。
image.png

2.3.2 一个特殊性质:

我们考虑两个集合C1,C2,对特征矩阵,进行n(数百次)随机排列变换,变换后h(C1)=h(C2)的概率,与Sim(C1,C2)(C1和C2的相似度)相等。
这里我们不对这个性质,进行证明和过多解释,看清计算公式,其实这个很好理解。

2.3.3 最小哈希签名矩阵(Minhash Signatures)

对于大规模特征矩阵进行显示排列变换是不可行的,对于上百万的行,选择一个随机排列是极其耗时的。所以真正计算时,我们采用别的方法, 使用一个随机哈希函数来模拟随机排列转换的效果。
首先给出算法:

Initialize: M(i,c) to inf for all i and c
for each row r
    for each column c
        if c has 1 in row r
            for each hash function hi do
                if hi(r) is a smaller value than M(i,j)
                    M(i,c) = hi(c)

估计看了云里雾里的,直接看例子就懂了。
示例:
首先我们有一个特征矩阵,和两个哈希函数分别是h1(x)=x+1 mod5h2(x)=3x+1 mod5。初始化矩阵是:
image.png
* 1、分别用两个哈希函数对特征矩阵进行操作:
image.png
解释下这个图是如何得出来的,对哈希函数hi(x),x是我们行数。对上图,则是对0,1,2,3,4行分别运算得到。和特征矩阵并无关系。
* 2、第一次循环:
首先对第0行,再按列循环,我们发现,S1和S4的值均为1,然后我们求其哈希函数,h1(x)对S1求得1、1,h2(x)同样求得1和1,然后对M(i,c)进行更新,得到下图:
image.png
* 3、第二次循环:
我们到了特征矩阵的第1行,按列循环,我们发现只有S3为1,此时h1(x)和h(x)分别是2和4。然后对M(i,c)进行更新:
image.png
* 4、循环直到结束:
继续按行进行循环,第2行,第3行。。。进行和上一步类似的步骤,矩阵更新分别为:
image.png
image.png
最终得到的签名矩阵是:
image.png
其实这里面我们漏掉了很多细节,很多只给出了结论活方法,并没有解释为什么这么用,这么用是否等价,具体可以看参考资料。
至此,我们成功完成Min Hashing得到了签名矩阵。我们成功的将每一个文档的进行了“压缩”,我们可以用更少的数据来表示。BUT!BUT!如果我们有百万个文档需要比较,也就是一百万中选2个,排列组合后我们发现计算量依然很大,所以我们引入局部敏感哈希。

3、LSH/Locality Sensitive Hashing(局部敏感哈希)

3.1、大致思想:

我们使用一个函数f(x,y),来判断x和y是否是一个候选对(candidate pair),然后我们只从这些候选对中,检查他们的相似度。
这里我们引入两个专有名词,伪反例(False Negative)和伪正例(False Positive)。
伪反例: 没有映射到相同桶(bucket)的真正相似的文档。
伪正例: 映射到相同桶(bucket)的非相似的文档。
我们希望这两个数值,都越低越好,这样我们得到的效果才更好。

3.2、具体实现:

直接上图,会好理解很多:
image.png
过程:
* 1、将特征矩阵M划分成b个行条(bands),每个行条r行数据;
* 2、对每一个行条,我们对里面的r行进行哈希,将他们哈希到k个桶中(bucket),k尽可能的大;
* 3、候选对,是那些哈希到同一个桶中的集合(bucket);他们可以来自一个或多个行条
其实我们就是增加了一个预处理的过程,这种方法,在很多算法中见到过。

3.3、行条的特性

假设某对具体文档的Jaccard相似度是s,经过LSH后,我们可以计算这些文档作为候选对的概率,计算过程:
* 1、某个行条所有的签名相等的概率是s^r;
* 2、某个具体行条中至少一对签名不相等的概率是1 - s^r;
* 3、所有行条都至少有一对签名不相等的概率是(1 - s^r)^b;
* 4、在一个特定行条中C1和C2相等的概率1-(1 - s^r)^b
根据上述概率,我们可以得到大致的概率函数图像,S曲线。
image.png
横坐标:C1、C2的相似度
纵坐标:概率
t:阈值。
其实通过这样计算我们使得,本来相似的两个文档,变得更加的相似,本来不相似的文档,变得更加的不相似。

3.3 学习LSH函数:

大家可能注意到,我们在给出LSH的大致思想时,提到了函数f(x,y)但是并没有说,如何获得,是什么样子。
我们可以通过学习方法获得,这里就不再详细展开了。

文章参考斯坦福的数据挖掘课程,ppt,和我们老师的ppt,还有《Mining of Massive Datasets》这本书.
下载地址
斯坦福数据挖掘课程全部ppt

参考文献:

1.https://blog.csdn.net/aspirinvagrant/article/details/41281101
2.《Mining of Massive Datasets》
3.http://www.mmds.org/

猜你喜欢

转载自blog.csdn.net/linxid/article/details/79745964