寒假生活
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()


浙公网安备 33010602011771号