python完整的代码 使用两种协同过滤算法想用户推荐相似的电影。#数据格式为用户ID,电影(商品)ID,评分,时间段完整的代码
时间: 2023-05-20 14:00:53 浏览: 105
这里提供一个简单的Python代码,使用两种协同过滤算法来推荐相似的电影给用户:
1. 基于用户的协同过滤算法:
```python
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
# 读取电影评分数据
ratings = pd.read_csv('ratings.csv')
# 计算用户相似度矩阵
user_similarity = cosine_similarity(ratings)
# 选择一个用户
user_id = 1
# 找到该用户没有评分过的电影
movies = ratings.columns[1:]
user_ratings = ratings.loc[user_id, movies]
unrated_movies = user_ratings[user_ratings.isnull()].index
# 计算该用户对未评分电影的预测评分
predicted_ratings = []
for movie_id in unrated_movies:
# 找到与该用户相似度最高的K个用户
similar_users = user_similarity[user_id].argsort()[::-1][1:K+1]
# 计算这K个用户对该电影的平均评分
similar_ratings = ratings.loc[similar_users, movie_id]
predicted_rating = similar_ratings.mean()
predicted_ratings.append(predicted_rating)
# 推荐预测评分最高的N部电影
recommendations = pd.Series(predicted_ratings, index=unrated_movies).sort_values(ascending=False)[:N]
```
2. 基于物品的协同过滤算法:
```python
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
# 读取电影评分数据
ratings = pd.read_csv('ratings.csv')
# 计算电影相似度矩阵
item_similarity = cosine_similarity(ratings.T)
# 选择一个用户
user_id = 1
# 找到该用户评分最高的K部电影
user_ratings = ratings.loc[user_id]
top_rated_movies = user_ratings.sort_values(ascending=False)[:K].index
# 计算这K部电影与其他电影的相似度
similar_movies = []
for movie_id in top_rated_movies:
similar_movies.extend(list(item_similarity[movie_id].argsort()[::-1][1:K+1]))
# 去重并排序
similar_movies = list(set(similar_movies))
similar_movies.sort()
# 找到该用户没有评分过的电影
movies = ratings.columns[1:]
user_ratings = ratings.loc[user_id, movies]
unrated_movies = user_ratings[user_ratings.isnull()].index
# 计算该用户对未评分电影的预测评分
predicted_ratings = []
for movie_id in unrated_movies:
# 找到与该电影相似度最高的K部电影
similar_items = item_similarity[movie_id].argsort()[::-1][1:K+1]
# 计算这K部电影的平均评分
similar_ratings = user_ratings[similar_items]
predicted_rating = similar_ratings.mean()
predicted_ratings.append(predicted_rating)
# 推荐预测评分最高的N部电影
recommendations = pd.Series(predicted_ratings, index=unrated_movies).sort_values(ascending=False)[:N]
```
以上代码仅供参考,实际应用中需要根据具体情况进行调整和优化。
阅读全文