Pyspark columnSimilarities()用于计算产品之间的余弦相似度

时间:2018-10-29 16:38:41

标签: pyspark cosine-similarity

我有一个大数据集,需要在商品推荐的商品-项目协作过滤的情况下计算商品之间的余弦相似度。由于数据包含超过50000个项目和25000行,因此我选择使用Spark,并发现可以在DistributedMatrix上使用的函数_missing_,特别是在ActiveWorkbook.RefreshAllcolumnSimilarities()上使用。

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

1)在文档中提到:

  

RowMatrix由其行的RDD支持,其中每一行都是本地   向量。由于每行均由局部矢量表示,因此   列受整数范围限制,但应小得多   在实践中。

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

2)我发现:

  

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

reference

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

1 个答案:

答案 0 :(得分:1)

因此,您当前的策略是计算i和其他每个项目之间的相似度。这意味着充其量您必须计算距离矩阵的上三角,我认为是(i ^ 2/2)-i计算。然后,您必须为每个i项目排序。

如果您希望在运行时的准确性上进行权衡,则可以使用近似最近邻居(ANN)。您可能找不到确切的项目顶部NNS,但是您会发现非常相似的项目,并且速度要快几个数量级。没有人处理中等大小的数据集来计算(或有时间等待计算)整个距离。

每种ANN搜索方法都会创建一个索引,该索引只会生成少量候选对象并计算该子集中的距离(这是快速的部分)。索引的构造方式为NN检索的准确性提供了不同的保证(这是近似部分)。

有各种各样的ANN搜索库,烦人的,nmslib,LSH。可访问的介绍在这里:https://erikbern.com/2015/10/01/nearest-neighbors-and-vector-models-part-2-how-to-search-in-high-dimensional-spaces.html

HTH。蒂姆