python简单实现协同推荐算法
协同推荐算法是一种常用的推荐算法,它通过分析用户的历史行为数据,找到相似的用户或物品,进行推荐。下面是一个简单的Python实现协同推荐算法的例子:
1.加载数据集
我们使用MovieLens 100k数据集,该数据集包含100000个电影评分,由943个用户在1682个电影上进行评分。我们将使用pandas库来加载数据集。
import pandas as pd
加载数据集
columns = ['user_id', 'item_id', 'rating', 'timestamp'] data = pd.read_csv('u.data', sep='\t', names=columns)
2.拆分数据集
我们需要将数据集拆分成训练集和测试集,以便评估模型的准确性。我们将使用scikit-learn库的train_test_split函数来拆分数据集。
from sklearn.model_selection import train_test_split
拆分数据集
train_data, test_data = train_test_split(data, test_size=0.2)
3.创建用户-物品矩阵
我们需要创建一个用户-物品矩阵,用于计算相似性。我们使用pandas库的pivot函数来创建用户-物品矩阵。
创建用户-物品矩阵
ratings_matrix = pd.pivot_table(train_data, values='rating', index='user_id', columns='item_id')
4.计算相似性
我们使用余弦相似度来计算用户之间的相似性。我们将使用scikit-learn库的cosine_similarity函数来计算相似性矩阵。
from sklearn.metrics.pairwise import cosine_similarity
计算相似性矩阵
user_similarity = cosine_similarity(ratings_matrix)
5.进行预测
我们将使用用户相似性矩阵来预测测试集中每个用户对每个物品的评分。我们将使用以下公式:
rating(u,i) = sum(sim(u,v) * rating(v,i)) / sum(sim(u,v))
其中,rating(u,i)是用户u对物品i的预测评分,sim(u,v)是用户u和用户v之间的相似度,rating(v,i)是用户v对物品i的评分。
进行预测
test_data['predicted_rating'] = test_data.apply(lambda x: predict_rating(x['user_id'], x['item_id'], user_similarity, ratings_matrix), axis=1)
6.评估模型
我们将使用均方根误差(RMSE)来评估模型的准确性。RMSE越小,模型的准确性就越高。
from sklearn.metrics import mean_squared_error import math
计算RMSE
rmse = math.sqrt(mean_squared_error(test_data['rating'], test_data['predicted_rating'])) print('RMSE:', rmse)
完整的代码如下:
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.metrics.pairwise import cosine_similarity import math
加载数据集
columns = ['user_id', 'item_id', 'rating', 'timestamp'] data = pd.read_csv('u.data', sep='\t', names=columns)
拆分数据集
train_data, test_data = train_test_split(data, test_size=0.2)
创建用户-物品矩阵
ratings_matrix = pd.pivot_table(train_data, values='rating', index='user_id', columns='item_id')
计算相似性矩阵
user_similarity = cosine_similarity(ratings_matrix)
预测评分
def predict_rating(user_id, item_id, user_similarity, ratings_matrix): # 获取相似度最高的k个用户 k = 5 similar_users = user_similarity[user_id].argsort()[::-1][1:k+1] # 计算预测评分 rating_sum = 0 similarity_sum = 0 for similar_user in similar_users: if ratings_matrix.iloc[similar_user][item_id] > 0: similarity = user_similarity[user_id][similar_user] rating = ratings_matrix.iloc[similar_user][item_id] rating_sum += similarity * rating similarity_sum += similarity if similarity_sum == 0: return 0 else: return rating_sum / similarity_sum
test_data['predicted_rating'] = test_data.apply(lambda x: predict_rating(x['user_id'], x['item_id'], user_similarity, ratings_matrix), axis=1)
计算RMSE
rmse = math.sqrt(mean_squared_error(test_data['rating'], test_data['predicted_rating'])) print('RMSE:', rmse)
原文地址: https://www.cveoy.top/t/topic/bp2w 著作权归作者所有。请勿转载和采集!