2015-07-21 91 views
11

我们如何才能在PySpark中获得十大推荐产品。据我所知,有些方法会像推荐产品为单个用户推荐产品,并预测所有预测{用户,商品}对的评分。但是,有没有一种有效的方式可以为所有用户输出每个用户的前10个项目?如何向所有用户推荐Spark ALS的十大产品?

+0

使用Scala,你可以用'recommendProductsForUser'但此时这个功能不是由PySpark API暴露。 – zero323

回答

5

我写了这个功能,因此,它被分配则通过用户获得每个产品的评级和评价它们排序,并输出的8顶部推荐产品列表中的分区乘以用户特征和产品特性。

#Collect product feature matrix 
productFeatures = bestModel.productFeatures().collect() 
productArray=[] 
productFeaturesArray=[] 
for x in productFeatures: 
    productArray.append(x[0]) 
    productFeaturesArray.append(x[1]) 
matrix=np.matrix(productFeaturesArray) 
productArrayBroadCast=sc.broadcast(productArray) 
productFeaturesArraybroadcast=sc.broadcast(matrix.T) 

def func(iterator): 
     userFeaturesArray = [] 
     userArray = [] 
     for x in iterator: 
      userArray.append(x[0]) 
      userFeaturesArray.append(x[1]) 
      userFeatureMatrix = np.matrix(userFeaturesArray) 
      userRecommendationArray = userFeatureMatrix*(productFeaturesArraybroadcast.value) 
      mappedUserRecommendationArray = [] 
      #Extract ratings from the matrix 
      i=0 
      for i in range(0,len(userArray)): 
       ratingdict={} 
       j=0 
       for j in range(0,len(productArrayBroadcast.value)): 
        ratingdict[str(productArrayBroadcast.value[j])]=userRecommendationArray.item((i,j)) 
        j=j+1 
       #Take the top 8 recommendations for the user 
       sort_apps=sorted(ratingdict.keys(), key=lambda x: x[1])[:8] 
       sort_apps='|'.join(sort_apps) 
       mappedUserRecommendationArray.append((userArray[i],sort_apps)) 
       i=i+1 
     return [x for x in mappedUserRecommendationArray] 


recommendations=model.userFeatures().repartition(2000).mapPartitions(func) 
4

PySpark> = 1.6.0提供MatrixFactorizationModel.recommendProductsForUsers

>> model.recommendProductsForUsers(3).take(2) 
[(1, 
    (Rating(user=1, product=2975, rating=0.003626774788608227), 
    Rating(user=1, product=1322, rating=0.002494393082165332), 
    Rating(user=1, product=8746, rating=0.002176665942528324))), 
(2, 
    (Rating(user=2, product=4060, rating=0.011020947406565042), 
    Rating(user=2, product=2332, rating=0.009479319983658458), 
    Rating(user=2, product=1979, rating=0.004587168057824856)))] 
+0

对于隐式评级(用户不明确评估产品),您可能不想过滤掉测试数据。 – hwaxxer

+0

但是用户已经对该项目执行了一个操作(查看,购买,无论),我们希望将其推荐给他/她? – tokland

+0

我们不能认为必须从结果中删除任何“评分”项目。与用户交互的用户可能是一个强烈的指标,他们喜欢该项目,并且应该向他们推荐,无论他们以前是否看过。与推荐有关的业务逻辑,比如过滤掉某些项目,最好在推荐引擎之外完成。其他API让我们做到这一点,如[predictAll(http://spark.apache.org/docs/latest/api/python/pyspark.mllib.html#pyspark.mllib.recommendation.MatrixFactorizationModel.predictAll)。 – hwaxxer