我有一个大数据集,需要在商品推荐的商品-项目协作过滤的情况下计算商品之间的余弦相似度。由于数据包含超过50000个项目和25000行,因此我选择使用Spark,并发现可以在DistributedMatrix上使用的函数_missing_
,特别是在ActiveWorkbook.RefreshAll
或columnSimilarities()
上使用。>
但是,我想知道两个问题。
1)在文档中提到:
RowMatrix由其行的RDD支持,其中每一行都是本地 向量。由于每行均由局部矢量表示,因此 列受整数范围限制,但应小得多 在实践中。
由于我有很多产品,看来RowMatrix
并不是从我的输入IndexedRowMatrix
构建相似度矩阵的最佳选择。这就是为什么我决定首先将数据帧转换为RowMatrix
,然后使用Spark Dataframe
的原因,因为CoordinateMatrix
需要输入参数作为RowMatrix。同时,我不确定它的性能。
2)我发现:
columnSimilarities方法仅返回的对角线条目 相似度矩阵的上三角部分。
这是否意味着我无法获得所有产品的相似性向量?
答案 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。蒂姆