scala - 如何有效地计算/估计非晶石矩阵中数十亿对的余弦相似度?
问题描述
考虑一下我有 1000 万个项目,每个项目都用 100 维实数向量标识(实际上它们是 word2vec 嵌入)。对于每个项目,我想(大约)使用余弦相似度获得与其最相似的前 200 个项目。我目前在 Hadoop (hive) 中作为 UDF 函数的余弦相似度标准实现需要大约 1 秒来计算 1 项与 1000 万个其他项目相比的余弦相似度。这使得运行整个矩阵变得不可行。我的下一步是在 Spark 上运行它,并行化程度更高,但仍然不能完全解决问题。
我知道有一些方法可以减少晶石矩阵的计算。但我的矩阵并不稀疏。
如何有效地为每个项目获取最相似的项目?是否存在计算效率更高的余弦相似度近似值?
解决方案
您可以压缩向量以使分数计算更简单。通过新的距离方法,如汉明距离。
有一个关键字叫vector quantization
,还有很多算法讲向量压缩。
这是一个使其与余弦相似度相媲美的示例。
推荐阅读
- python - 计算python列中最新的相同值
- android - Android VpnService MTU参数的使用
- r - HTTR 包未从 API 查询返回完整响应
- binary-data - 扩展包含在列中的列表,使列表中的每个元素对应于自己的列,并表示为二进制变量
- javascript - 如何根据javascript中的类型将嵌套数组对象更改为对象
- python-3.x - 从文本文件中提取数据
- powershell - 用于更改编码的 Powershell 脚本会更改重音字符
- c# - unity 3D 角色 c# 脚本,跳转不起作用?
- jenkins - Jenkinsfile 声明式管道:在阶段步骤中签出另一个 repo
- mongodb - MongoDB:当主节点失败时