评分系统是一种常见的推荐系统。可以使用PYTHON等语言基于协同过滤算法来构建一个电影评分预测模型。学习协同过滤算法、UBCF和IBCF。具体理论读者可参考以下文章。如,基于用户的协同过滤推荐算法原理-附python代码实现;协同过滤算法概述与python 实现协同过滤算法基于内容(usr-item,item-item);推荐系统实践–基于用户的协同过滤算法 ;利用python构建一个简单的推荐系统。
接下来将通过笔者利用Python实现的基于用户协同算法推荐系统。本次目标是利用电影数据MovieLes数据集为根据用户相似度,预测用户对未观看过的电影的评分,给用户推荐电影。
获取数据ml-100k:明尼苏达州大学的社会化计算研究中心官网上面下载这些免费数据集,网站链接为http://grouplens.org/datasets/movielens/。
https://grouplens.org/d 网站也提供不同数量级的数据(ml-100k)
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('ml-100k/u.data', sep='\t',names=['user_id','item_id','rating','titmestamp'])
# df = pd.read_csv('u.data', sep='\t',names=['用户id','电影id','评价','时间戳'])
df.head()
movie_titles = pd.read_csv('ml-100k/u.item',sep='|',encoding='utf-8',header=None)
movie_titles.rename(columns = {0: "item_id", 1:"title"}, inplace=True)
movie_titles.head()
df = pd.merge(df, movie_titles[['item_id','title']], on='item_id')
df.head()
用户ID和电影ID的透视表,值为评分rating
user_matrix_train = df.pivot_table(index='user_id', columns='item_id', values='rating')
user_matrix_train.head()
计算用户之间的相似度
user_pearson_train= user_matrix_train.T.corr(method='pearson')
user_pearson_train.head()
def predict(uid,iid,user_matrix_train,user_pearson_train):
similarity = user_pearson_train
#预测用户uid和物品uid的评分
#去掉与用户自己和空值的相似度,然后找出正相关的用户
similar_users = similarity[uid].drop([uid]).dropna()
similar_users = similar_users.where(similar_users>0).dropna()
if similar_users.empty is True:
raise Exception('用户没有相似用户')
#正相关用户的id和不为空的该电影iid评分的用户id的并集
ids = user_matrix_train[iid].dropna().index&similar_users.index
#找出ids中用户的id
final_similar_users = similar_users.loc[list(ids)]
sum_up = 0 #保存评分预测公式的分子
sum_down = 0 #用来保存分母
mean1 = 0
#遍历
for sim_uid,similarity in final_similar_users.iteritems():
#找到该用户对应电影评分的行
sim_user_rated_movies = user_matrix_train.loc[sim_uid].dropna()
#在该行中找到对应改电影的评分
sim_user_rating_for_item = sim_user_rated_movies[iid]
#如此累加计算预测分
sum_up+=similarity*sim_user_rating_for_item
sum_down+=similarity
if sum_down!=0:
predict_rating = sum_up/sum_down
else:
predict_rating = 0
return predict_rating
给某一用户推荐电影(代码中用户ID为2)
def predict_one(uid,user_matrix_train,user_pearson_train):
#所有电影id
# user_ids = user_matrix_train.index
item_ids = user_matrix_train.columns
# title= df.columns
# user= df.index
#逐一预测
rating_list = []
for iid in item_ids:
rating = predict(uid,iid,user_matrix_train,user_pearson_train)
rating_list.append(rating)
return rating_list
predict1 = predict_one(3,user_matrix_train,user_pearson_train)
输入预测评分最高的十部电影作为推荐
import heapq
import numpy
title= user_matrix_train.columns
user= user_matrix_train.index
n = 10
a = numpy.array(predict1)
max_indexs = heapq.nlargest(n, range(len(a)), a.take)
k=0
for i in max_indexs:
k=k+1
print('{}.{},推荐分为:{}'.format(k,df[df['item_id']==i].title.values[0],predict1[i]))
print()