注:这里为了演示方便简单用出现的次数来作为词频向量,实际上生产上一般不会这么干,一般会利用 TF-IDF 算法来生成词频向量,本文不作展开,感兴趣的读者可以自行研究于是问题表现为了如何在空间中计算这两个向量的相似度了,我们可以把这两个向量认为是两条线段,从原点[0, 0, xxx],指向这两点的线段,这两个线段形成了一个夹角,夹角越小,说明这两个向量越相似,如何知道这两个夹角的大小呢,计算它们的余弦值(cosθ)即可,如果值越接近 1, 说明 θ 越小,两个向量就越接近,文本也就越相似于是问题转化为了如何计算 cosθ 的值,回忆下大学的数据公式,其值计算如下于是我们可以根据以上公式计算出句子 A 和句子 B 的 cosθ 值为:高达 93.8% 的相似度!这与实际情况吻合,既然使用余弦定理就可以计算文章的相似性,那为啥还要搞出 simhash 这样的算法呢,细心的朋友不难发现它的缺点,计算余弦的过程涉及到很多的乘法开方等计算,n 个分词最终转化后就是 n 维向量,一篇文章的分词是非常多的,也就意味着这个 n 是非常大的,所以计算余弦是非常耗时的,肯定无法应用于 Google 这样需要海量网页判重的场景。由此分析可知余弘定理计算主要性能瓶颈在于文章转化后的高维度向量,高维度所需的计算量较复杂,那能否考虑降维呢,即把 n 维降低到 k 维(k 远小于 n)甚至是一维,维度越小,计算量就越小,接下来我们就来看看如何利用随机投影实现数据降维。
基于随机投影来实现空间向量的降维
向量点积含义
随机投影的基础方法,是向量点积运算。所以理解随机投影的基础,是理解向量点积运算的含义。设二维空间内有两个向量,则其点积(也叫内积)定义为以下实数:点积运算表示的是两个投影积,一个是在上的投影长度:一个是 OB 在其本身的投影长则为 |OB|,如果我们把看作是新空间的坐标轴,那么点 A 在新空间的坐标是 假设有如下两个向量那么点 A 以向量所在直线为坐标轴的空间中,坐标为 a.b=7*1+3* (-1)=4,发现了吗,此时点 A 在新空间中的坐标由 2 维降到了 1 维,实际上向量点积不光可以实现二维降一维,也可以实现从 M 维降到 K 维。只要基于高斯分布(即正态分布),在原向量空间中找到一个 k 维向量就可以让原来任意一个在 M 维空间的向量 M 通过点积 M ⋅ R 将其降维到 K 维,Johnson–Lindenstrauss 引理指出:在欧式空间中的若干点,经过相同的映射后进入新的空间,它们仍然会保持原来的相对位置,也就是说原来向量之间的夹角在向量降维映射到新空间后依然可以认为基本不变,这也就意味着降维后不会对文本的相似度计算产生影响。
知道了什么是基于随机投影的局部敏感哈希, 也就不难理解随机超平面 hash 了,它也是随机投影 hash 离散化的变种,对于一个 n 维向量 v,如果要得到一个由 0,1 组成的 f 位签名(f 远小于 n),它的算法如下:
随机产生 f 个 n 维的向量 r1,…rf;
对每一个向量 ri,如果 v 与 ri 的点积大于 0(说明在此向量划分的空间是相似的),则最终签名的第 i 位为 1,否则为 0。
这个算法相当于随机产生了 f 个 n 维超平面,每个超平面将向量 v 所在的空间一分为二,v 在这个超平面上方则得到一个 1,否则得到一个 0,然后将得到的 f 个 0 或 1 组合起来成为一个 f 维的签名如图所示,随机在空间里划几个超平面,就可以把数据分到不同空间里,比如中间这个小三角的区域就可以赋值为110每个降维后的 f 维签名,就是文章的最终签名!通过这样的解释相信大家不难理解通过异或比较位数的不同来判断文章的相似度的几何意义:位数不同,代表其在相应超平面上不相似