2017-10-10 273 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 –