Как мы можем получить 10 лучших продуктов в PySpark. Я понимаю, что есть методы, такие как рекомендовать продукты, чтобы рекомендовать продукты для одного пользователя и предсказывать, чтобы предсказать рейтинг для пары {user, item}. Но есть ли эффективный способ вывода 10 лучших элементов для каждого пользователя для всех пользователей?
Как рекомендовать 10 лучших продуктов в Spark ALS для всех пользователей?
Ответ 1
Я написал эту функцию, которая умножает функции пользователя и функции продукта на разделы, чтобы он распределялся, тогда он получает оценки для каждого продукта пользователем и сортирует их по рейтингу и выводит список из 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)
Ответ 2
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)))]