您好,登录后才能下订单哦!
协同过滤(Collaborative Filtering, CF)是推荐系统中最为经典和广泛使用的算法之一。它通过分析用户的行为数据(如评分、点击、购买等)来发现用户之间的相似性或物品之间的相似性,从而为用户推荐他们可能感兴趣的物品。协同过滤算法主要分为两类:基于用户的协同过滤(User-Based CF)和基于物品的协同过滤(Item-Based CF)。本文将详细介绍如何使用Python实现协同过滤算法,并提供一个完整的代码示例。
基于用户的协同过滤算法通过找到与目标用户兴趣相似的其他用户,然后根据这些相似用户的喜好来推荐物品。具体步骤如下:
基于物品的协同过滤算法通过找到与目标物品相似的其他物品,然后根据这些相似物品的评分或行为来推荐物品。具体步骤如下:
在实现协同过滤算法之前,我们需要准备一些数据。通常,协同过滤算法需要用户对物品的评分数据。我们可以使用MovieLens数据集,这是一个经典的电影评分数据集,包含了用户对电影的评分。
我们可以从MovieLens官网下载数据集,或者使用surprise
库中自带的数据集。
from surprise import Dataset
from surprise import Reader
# 加载MovieLens 100k数据集
data = Dataset.load_builtin('ml-100k')
# 查看数据集
print(data.raw_ratings[:5])
在加载数据后,我们需要将数据转换为适合协同过滤算法的格式。通常,数据会被转换为一个用户-物品评分矩阵,其中行表示用户,列表示物品,矩阵中的值表示用户对物品的评分。
import pandas as pd
# 将数据转换为DataFrame
ratings = pd.DataFrame(data.raw_ratings, columns=['user_id', 'item_id', 'rating', 'timestamp'])
# 删除时间戳列
ratings = ratings.drop('timestamp', axis=1)
# 查看数据
print(ratings.head())
我们可以使用余弦相似度来计算用户之间的相似度。余弦相似度通过计算两个用户评分向量的夹角余弦值来衡量他们的相似度。
from sklearn.metrics.pairwise import cosine_similarity
# 创建用户-物品评分矩阵
user_item_matrix = ratings.pivot(index='user_id', columns='item_id', values='rating').fillna(0)
# 计算用户相似度矩阵
user_similarity = cosine_similarity(user_item_matrix)
# 将相似度矩阵转换为DataFrame
user_similarity_df = pd.DataFrame(user_similarity, index=user_item_matrix.index, columns=user_item_matrix.index)
# 查看用户相似度矩阵
print(user_similarity_df.head())
在计算了用户相似度之后,我们可以根据相似用户的评分来预测目标用户对未评分物品的评分,并生成推荐。
def predict_rating(user_id, item_id, user_similarity_df, user_item_matrix):
# 获取目标用户的相似用户
similar_users = user_similarity_df[user_id].sort_values(ascending=False)[1:11]
# 获取相似用户对目标物品的评分
similar_users_ratings = user_item_matrix.loc[similar_users.index, item_id]
# 计算加权平均评分
weighted_sum = (similar_users_ratings * similar_users).sum()
sum_of_weights = similar_users.sum()
if sum_of_weights == 0:
return 0
else:
return weighted_sum / sum_of_weights
# 预测用户1对物品1的评分
predicted_rating = predict_rating(1, 1, user_similarity_df, user_item_matrix)
print(f"预测用户1对物品1的评分为: {predicted_rating}")
我们可以为每个用户生成Top-N推荐列表,即推荐评分最高的N个物品。
def generate_top_n_recommendations(user_id, user_similarity_df, user_item_matrix, n=10):
# 获取用户未评分的物品
unrated_items = user_item_matrix.loc[user_id][user_item_matrix.loc[user_id] == 0].index
# 预测用户对未评分物品的评分
predicted_ratings = {}
for item_id in unrated_items:
predicted_ratings[item_id] = predict_rating(user_id, item_id, user_similarity_df, user_item_matrix)
# 按评分排序并生成Top-N推荐
top_n_recommendations = sorted(predicted_ratings.items(), key=lambda x: x[1], reverse=True)[:n]
return top_n_recommendations
# 为用户1生成Top-10推荐
top_n_recommendations = generate_top_n_recommendations(1, user_similarity_df, user_item_matrix, n=10)
print(f"用户1的Top-10推荐: {top_n_recommendations}")
与基于用户的协同过滤类似,我们可以使用余弦相似度来计算物品之间的相似度。
# 创建物品-用户评分矩阵
item_user_matrix = user_item_matrix.T
# 计算物品相似度矩阵
item_similarity = cosine_similarity(item_user_matrix)
# 将相似度矩阵转换为DataFrame
item_similarity_df = pd.DataFrame(item_similarity, index=item_user_matrix.index, columns=item_user_matrix.index)
# 查看物品相似度矩阵
print(item_similarity_df.head())
在计算了物品相似度之后,我们可以根据相似物品的评分来预测目标用户对未评分物品的评分,并生成推荐。
def predict_rating_item_based(user_id, item_id, item_similarity_df, user_item_matrix):
# 获取目标物品的相似物品
similar_items = item_similarity_df[item_id].sort_values(ascending=False)[1:11]
# 获取用户对相似物品的评分
user_ratings = user_item_matrix.loc[user_id, similar_items.index]
# 计算加权平均评分
weighted_sum = (user_ratings * similar_items).sum()
sum_of_weights = similar_items.sum()
if sum_of_weights == 0:
return 0
else:
return weighted_sum / sum_of_weights
# 预测用户1对物品1的评分
predicted_rating = predict_rating_item_based(1, 1, item_similarity_df, user_item_matrix)
print(f"预测用户1对物品1的评分为: {predicted_rating}")
同样地,我们可以为每个用户生成Top-N推荐列表。
def generate_top_n_recommendations_item_based(user_id, item_similarity_df, user_item_matrix, n=10):
# 获取用户未评分的物品
unrated_items = user_item_matrix.loc[user_id][user_item_matrix.loc[user_id] == 0].index
# 预测用户对未评分物品的评分
predicted_ratings = {}
for item_id in unrated_items:
predicted_ratings[item_id] = predict_rating_item_based(user_id, item_id, item_similarity_df, user_item_matrix)
# 按评分排序并生成Top-N推荐
top_n_recommendations = sorted(predicted_ratings.items(), key=lambda x: x[1], reverse=True)[:n]
return top_n_recommendations
# 为用户1生成Top-10推荐
top_n_recommendations = generate_top_n_recommendations_item_based(1, item_similarity_df, user_item_matrix, n=10)
print(f"用户1的Top-10推荐: {top_n_recommendations}")
除了手动实现协同过滤算法外,我们还可以使用surprise
库来简化实现过程。surprise
是一个专门用于推荐系统的Python库,提供了多种协同过滤算法的实现。
首先,我们需要安装surprise
库。
pip install scikit-surprise
from surprise import KNNWithMeans
from surprise.model_selection import train_test_split
from surprise import accuracy
# 加载数据集
data = Dataset.load_builtin('ml-100k')
# 划分训练集和测试集
trainset, testset = train_test_split(data, test_size=0.2)
# 使用KNNWithMeans算法(基于用户的协同过滤)
algo = KNNWithMeans(k=50, sim_options={'name': 'cosine', 'user_based': True})
# 训练模型
algo.fit(trainset)
# 预测评分
predictions = algo.test(testset)
# 计算RMSE
accuracy.rmse(predictions)
# 使用KNNWithMeans算法(基于物品的协同过滤)
algo = KNNWithMeans(k=50, sim_options={'name': 'cosine', 'user_based': False})
# 训练模型
algo.fit(trainset)
# 预测评分
predictions = algo.test(testset)
# 计算RMSE
accuracy.rmse(predictions)
本文详细介绍了如何使用Python实现协同过滤算法,包括基于用户的协同过滤和基于物品的协同过滤。我们首先手动实现了这两种算法,并使用surprise
库简化了实现过程。协同过滤算法是推荐系统中最为经典和广泛使用的算法之一,通过分析用户的行为数据,能够为用户推荐他们可能感兴趣的物品。在实际应用中,我们可以根据具体需求选择合适的协同过滤算法,并结合其他推荐算法(如基于内容的推荐、混合推荐等)来提高推荐效果。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。