首页 > 解决方案 > 如何有效地计算/估计非晶石矩阵中数十亿对的余弦相似度?

问题描述

考虑一下我有 1000 万个项目,每个项目都用 100 维实数向量标识(实际上它们是 word2vec 嵌入)。对于每个项目,我想(大约)使用余弦相似度获得与其最相似的前 200 个项目。我目前在 Hadoop (hive) 中作为 UDF 函数的余弦相似度标准实现需要大约 1 秒来计算 1 项与 1000 万个其他项目相比的余弦相似度。这使得运行整个矩阵变得不可行。我的下一步是在 Spark 上运行它,并行化程度更高,但仍然不能完全解决问题。

我知道有一些方法可以减少晶石矩阵的计算。但我的矩阵并不稀疏

如何有效地为每个项目获取最相似的项目?是否存在计算效率更高的余弦相似度近似值?

标签: scalaapache-sparkhadoopcosine-similarity

解决方案


您可以压缩向量以使分数计算更简单。通过新的距离方法,如汉明距离。

有一个关键字叫vector quantization,还有很多算法讲向量压缩。

这是一个使其与余弦相似度相媲美的示例。

https://github.com/tdebatty/java-LSH/blob/master/src/main/java/info/debatty/java/lsh/SuperBit.java#L208


推荐阅读