在处理多媒体数据时,我们经常遇到高维数据,动则几十维上百维。如何快速索引和查找这些高维数据呢?LSH是一个不错的选择。
LSH基于的想法是比较简单的:如果两个点距离比较近,那么经过投影生成的两个点的距离会以较高的概率比较接近。这里我们设v是查询的点,x是投影向量(从高斯分布中随机采样而来),b为随机向量,w为量化步长,h为哈希的结果,我们有以下公式:
h = floor((x . v + b) / w)
以上公式可用的前提是需要满足如下条件:
P[h(p) = h(q)] ≥ P1 如果 ||p− q|| ≤ R1
P [h(p) = h(q)] ≤ P2 如果 ||p− q|| ≥ cR1 (c > 1)
意思就是说两个点距离越近,落在同一个哈希桶的概率就越大,反之距离越大,落在同一个桶的概率就越小,这里P1 > P2。
通过采用k(k > 1)个投影我们可以扩大 两者概率的比值,(P1/P2)^k > (P1/P2)。通过k次投影,我们就为输入的数据得到了一个k维的哈希坐标。
k维的坐标查找起来同样不方便,所以我们需要对它再做一次投影。投影的方法和之前的投影区别不大,只不过b和w要做相应的调整。
做完之后我们就得到了一个最终的哈希值H,大写它是因为它得来的很辛苦哈。我们在索引的过程中实际上就可以用H作为键值,原始数据的ID作为值存在哈希表中。在实际工程中为了做进一步的校验,我们往往生成两个H,有一个做键值,有一个留作校验。
至于这些乱七八糟的参数怎么选择我就不做介绍了,有兴趣的可以去看看相关的资料。