2017-10-10 54 views
0

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

所有我读过有关它被称为计算相似度超过列Apache Spark Python Cosine Similarity over DataFrames 可能有人说是它可以计算余弦距离优雅的使用PySpark数据帧的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]) 

在此先感谢所有帮助

+0

您可以在哪里应用数据框的列相似性? –

回答

2

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

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

非常感谢,所有工作都很好,因为我希望这样做。 –

+0

如果有帮助,请接受答案 – ashwinids

+0

如何使用此功能获得前10个类似项目? @IvanShelonik –