pyspark - Pyspark columnSimilarities() 用于计算产品之间的余弦相似度
问题描述
我有一个大数据集,需要在产品推荐的项目-项目协同过滤上下文中计算产品之间的余弦相似度。由于数据包含超过 50000 个项目和 25000 行,我选择使用 Spark 并找到columnSimilarities()
可以在 DistributedMatrix 上使用的函数,特别是在 aRowMatrix
或IndexedRowMatrix
.
但是,有两个问题我想知道。
1)在文档中,提到:
RowMatrix 由其行的 RDD 支持,其中每一行都是一个局部向量。由于每一行都由一个局部向量表示,因此列数受整数范围的限制,但实际上应该小得多。
由于我有很多产品,这似乎RowMatrix
不是从我的输入构建相似度矩阵的最佳选择,即Spark Dataframe
. 这就是为什么我决定首先将数据帧转换为 aCoordinateMatrix
然后使用toRowMatrix()
,因为columnSimilarities()
需要输入参数作为 RowMatrix。同时,我不确定它的性能..
2)我发现:
columnSimilarities 方法仅返回相似矩阵的上三角部分的非对角线条目。
这是否意味着我无法获得所有产品的相似度向量?
解决方案
因此,您当前的策略是计算每个项目 i 和其他项目之间的相似度。这意味着充其量你必须计算距离矩阵的上三角,我认为这是 (i^2 / 2) - i 计算。然后你必须对这些 i 项目中的每一个进行排序。
如果您愿意为运行时牺牲一点准确性,您可以使用近似最近邻 (ANN)。您可能找不到某个项目的确切顶级 NNS,但您会发现非常相似的项目,并且速度会快几个数量级。没有人处理中等大小的数据集计算(或有时间等待计算)完整的距离集。
每个 ANN 搜索方法都会创建一个索引,该索引只会生成一小组候选对象并计算该子集中的距离(这是快速部分)。构建索引的方式为 NN 检索的准确性提供了不同的保证(这是近似部分)。
那里有各种 ANN 搜索库,annoy、nmslib、LSH。可访问的介绍在这里:https ://erikbern.com/2015/10/01/nearest-neighbors-and-vector-models-part-2-how-to-search-in-high-dimensional-spaces.html
HTH。蒂姆
推荐阅读
- c# - 如何在集成测试中传递 TempData 值以进入 .net 核心页面
- sql - Tableau:查看和/或编辑现有 Redshift 连接的初始 SQL
- oracle - 我试图在我的应用程序中使用 oracle 数据库在 heroku 上部署一个 spring boot 应用程序
- php - 在 php 中将视频上传到 youtube 播放列表
- python - 一个函数,它接受单个 ("a1b2c3") 字符串并递归返回字符串,如 'abc, 123'
- powershell - 在 Powershell 中使用 Import-PfxCertificate 命令安装证书 pfx 文件时找不到私钥
- python - 如何从 Python 字典中检测“丢失”的键?
- node.js - 将猫鼬查询数据保存在数组中
- vue.js - 如何为 Vue Toastify 添加持续时间
- bash - shell(bash)json整数显示为字符串而不是整数