首页 > 解决方案 > Pyspark columnSimilarities() 用于计算产品之间的余弦相似度

问题描述

我有一个大数据集,需要在产品推荐的项目-项目协同过滤上下文中计算产品之间的余弦相似度。由于数据包含超过 50000 个项目和 25000 行,我选择使用 Spark 并找到columnSimilarities()可以在 DistributedMatrix 上使用的函数,特别是在 aRowMatrixIndexedRowMatrix.

但是,有两个问题我想知道。

1)在文档中,提到:

RowMatrix 由其行的 RDD 支持,其中每一行都是一个局部向量。由于每一行都由一个局部向量表示,因此列数受整数范围的限制,但实际上应该小得多。

由于我有很多产品,这似乎RowMatrix不是从我的输入构建相似度矩阵的最佳选择,即Spark Dataframe. 这就是为什么我决定首先将数据帧转换为 aCoordinateMatrix然后使用toRowMatrix(),因为columnSimilarities()需要输入参数作为 RowMatrix。同时,我不确定它的性能..

2)我发现:

columnSimilarities 方法仅返回相似矩阵的上三角部分的非对角线条目。

参考

这是否意味着我无法获得所有产品的相似度向量?

标签: pysparkcosine-similarity

解决方案


因此,您当前的策略是计算每个项目 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。蒂姆


推荐阅读