假设我有1000万个条目,每个条目都有一个100维的实数向量(实际上它们是word2vec嵌入)。对于每个项目,我想得到(大约)前200个最相似的项目,使用余弦相似性。我目前在hadoop(hive)中作为udf函数的余弦相似性标准实现需要大约1s来计算1个项目的余弦相似性,而其他项目只有1000万个。这使得运行整个矩阵是不可行的。我的下一步是在spark上运行它,进行更多的并行化,但它仍然不能完全解决问题。
我知道有一些方法可以减少spars矩阵的计算。但我的矩阵不是稀疏的。
如何有效地为每个项目获取最相似的项目?是否有一个余弦相似性的近似值可以更有效地计算?
1条答案
按热度按时间rkttyhzu1#
可以压缩向量以简化分数计算。通过新的距离方法,如汉明距离。
有一个关键字叫做
vector quantization
矢量压缩算法有很多种。这里是一个例子,使其可与余弦相似性。
https://github.com/tdebatty/java-lsh/blob/master/src/main/java/info/debatty/java/lsh/superbit.java#l208