目录
主要分为高维稀疏向量和稠密向量两大方向。
高维稀疏向量的相似查找——minhash, lsh, simhash
针对高维稀疏数据情况,如何通过哈希技术进行快速进行相似查找。
例如,推荐系统中item-user矩阵。如果你有item数量是百万级别,user是千万级别,这个矩阵是十分稀疏的。你如何计算每一个item的Top N相似item呢?
同样海量文本场景,文本集合可以看成doc-word 稀疏矩阵,如何求解每个文档的Top N相似文档?
如果采用两两比较的话,至少有两个问题:
O(n^2) 遍历时间复杂度;
两个高维向量之间计算相似度,比如jaccard相似度,时间很耗时。
常见的解决方法如下:
正排是doc-words,倒排是word-docs
对正排里doc1的所有words,拉出对应的倒排docs,归并
对正排里doc2的所有words,拉出对应的倒排docs,归并
对上述两个向量求相似度
问题:虽然时间复杂度可以减小,但高频词可能导致倒排的拉链长度太长,导致效率下降。
minhash
例如,小写字母代表词,大写字母代表文档:
S1={a, d}, S2={c}, S3={b, d, e}, S4={a, c, d}
然后,把原来的词典{a, b, c, d, e} 顺序随机重排,例如得到{b, e, a, d, c},
定义一个函数h:计算集合S最小的minhash值,就是在这种顺序下最先出现1的元素。那么,
h(S1) = a, h(S2)=c, h(S3)=b, h(S4)=a
类似地,如果进行n次重排的话,就会有n个minhash函数,{h1(S), h2(S)…, hn(S)}, 那原来每个高维集合,就会被降到n维空间,比如S1->{h1(S1), h2(S1)…, hn(S1)}。
但是实际中因为重排比较耗时,会用若干随机哈希函数替代。比如设定一个哈希函数: h(x) = (i+1) % 5.
以{a, b, c, d, e}顺序,“i”表示各个索引,比如a的“i”值为1, b的“i”值为2等。
对集合S1,计算各个元素哈希值为{2,0},其中h(a->i) = 2, h(d->i) = 0,