使用 Dataframe 行之间的火花余弦距离
Spark cosine distance between rows using Dataframe
我必须计算每行之间的余弦距离,但我不知道如何优雅地使用 Spark API Dataframes 来计算。这个想法是计算每行(项目)的相似度,并通过比较它们在行之间的相似度来获得前 10 个相似度。 --> 这是 Item-Item 推荐系统的需要。
我所读到的所有内容都是关于计算列的相似性 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])
提前感谢所有帮助
您可以使用mllib.feature.IndexedRowMatrix
的columnSimilarities
功能。它使用余弦度量作为距离函数。它计算列之间的相似性,因此您必须在应用此函数之前进行转置。
pred_ = IndexedRowMatrix(Pred_Factors.rdd.map(lambda x: IndexedRow(x[0],x[1]))).toBlockMatrix().transpose().toIndexedRowMatrix()
pred_sims = pred.columnSimilarities()
我必须计算每行之间的余弦距离,但我不知道如何优雅地使用 Spark API Dataframes 来计算。这个想法是计算每行(项目)的相似度,并通过比较它们在行之间的相似度来获得前 10 个相似度。 --> 这是 Item-Item 推荐系统的需要。
我所读到的所有内容都是关于计算列的相似性 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])
提前感谢所有帮助
您可以使用mllib.feature.IndexedRowMatrix
的columnSimilarities
功能。它使用余弦度量作为距离函数。它计算列之间的相似性,因此您必须在应用此函数之前进行转置。
pred_ = IndexedRowMatrix(Pred_Factors.rdd.map(lambda x: IndexedRow(x[0],x[1]))).toBlockMatrix().transpose().toIndexedRowMatrix()
pred_sims = pred.columnSimilarities()