【问题标题】:Spark cosine distance between rows using Dataframe使用Dataframe的行之间的火花余弦距离
【发布时间】:2018-03-21 16:27:40
【问题描述】:

我必须计算每行之间的余弦距离,但我不知道如何优雅地使用 Spark API 数据帧。这个想法是计算每行(项目)的相似性,并通过比较它们在行之间的相似性来获取前 10 个相似性。 --> 这是 Item-Item Recommender System 的需要。

我所读到的所有内容都涉及计算列上的相似性Apache Spark Python Cosine Similarity over DataFrames 可能有人说是否可以使用 PySpark Dataframe 的 API 或 RDD 优雅地计算行之间的余弦距离,或者我必须手动计算?

这只是一些代码来显示我打算做什么

def cosineSimilarity(vec1, vec2):
    return vec1.dot(vec2) / (LA.norm(vec1) * LA.norm(vec2))


#p.s model is ALS
Pred_Factors = model.itemFactors.cache() #Pred_Factors = DataFrame[id: int, features: array<float>]

sims = []

for _id,_feature in Pred_Factors.toLocalIterator():
    for id, feature in Pred_Factors.toLocalIterator():

        itemFactor = _feature

        sims = sims.append(_id, cosineSimilarity(asarray(feature),itemFactor))

sims = sc.parallelize(l)
sortedSims = sims.takeOrdered(10, key=lambda x: -x[1])

提前感谢所有帮助

【问题讨论】:

  • 在哪里可以在数据框上应用列相似性?

标签: apache-spark pyspark spark-dataframe cosine-similarity


【解决方案1】:

您可以使用mllib.feature.IndexedRowMatrixcolumnSimilarities 函数。它使用余弦度量作为距离函数。它计算列之间的相似性,因此,您必须在应用此函数之前进行转置。

pred_ = IndexedRowMatrix(Pred_Factors.rdd.map(lambda x: IndexedRow(x[0],x[1]))).toBlockMatrix().transpose().toIndexedRowMatrix()
pred_sims = pred.columnSimilarities()

【讨论】:

  • 你如何使用它来获得前 10 个相似的项目? @IvanShelonik
  • 这可以用于任何 df 吗?
  • 您必须将数据框转换为 rdd 才能应用此方法。
  • RDD 中的转换大大减少了分区的数量,我怎样才能使并行化更有效?在矩阵的底层 rdd 上调用 repartition 意味着我不必再次将其转换为 rowMatrix ..还有其他方法吗?
猜你喜欢
  • 2018-01-03
  • 2016-11-29
  • 2020-02-11
  • 1970-01-01
  • 2017-08-03
  • 2021-07-15
  • 1970-01-01
  • 2017-07-10
  • 2017-12-12
相关资源
最近更新 更多