寒假生活指导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()
posted @ 2024-01-28 18:23  一个小虎牙  阅读(6)  评论(0编辑  收藏  举报