寒假生活指导20
from pyspark.sql import SparkSession from pyspark.ml.recommendation import ALS # 创建SparkSession spark = SparkSession.builder.appName('RecommendationSystem').getOrCreate() # 假设我们有用户对产品的评分数据,并且已经加载为一个DataFrame data = [ (0, 1, 5.0), (0, 2, 3.0), (1, 1, 4.0), (1, 2, 4.0), (2, 1, 3.0), (2, 2, 4.0), (2, 3, 2.0) ] ratings_df = spark.createDataFrame(data, ["userId", "movieId", "rating"]) # 定义ALS模型参数 als = ALS( userCol="userId", itemCol="movieId", ratingCol="rating", maxIter=5, regParam=0.01, rank=10 ) # 训练模型 model = als.fit(ratings_df) # 预测用户对产品的评分 predictions = model.transform(ratings_df) # 打印预测结果 predictions.show() # 在实际应用中,你可以用模型来为给定的用户生成推荐列表 # 用户ID为0的推荐产品列表 # 获取用户ID为0的前10个推荐产品 # recommendations_for_user_0 = model.recommendForUser(0, 10) # recommendations_for_user_0.show() # 获取对电影ID为1的所有用户的前10个推荐 top_recommendations = model.recommendForAllItems(10) top_users_for_movie_1 = top_recommendations.filter(top_recommendations.movieId == 1) top_users_for_movie_1.show() # 不再需要时,记得停止SparkSession spark.stop()
代码中提供的Spark ALS(交替最小二乘)推荐系统模型训练和预测流程是正确的。然而,在尝试获取对特定电影ID(这里是1)的所有用户的前10个推荐时,直接使用了recommendForAllItems(10)
方法,这会为所有物品生成前10个推荐用户列表。然后过滤出针对电影ID为1的推荐结果。
为了修复并明确实现需求,应该直接针对电影ID为1获取推荐用户列表,而不是先获取所有物品的推荐再进行过滤。以下是修复后的代码:
Python
1# 保持之前的代码不变...
2
3# 获取电影ID为1的前10个推荐用户及其评分
4top_users_for_movie_1 = model.recommendForItem(1, 10) # 更改为 recommendForItem 方法,并传入电影ID 1
5
6# 打印针对电影ID为1的前10个推荐用户信息
7top_users_for_movie_1.show()
8
9# 不再需要时,记得停止SparkSession
10spark.stop()