利用python实现电影推荐
来源:互联网 发布:信鸽推送demo php 编辑:程序博客网 时间:2024/04/27 16:28
“协同过滤”是推荐系统中的常用技术,按照分析维度的不同可实现“基于用户”和“基于产品”的推荐。
以下是利用python实现电影推荐的具体方法,其中数据集源于《集体编程智慧》一书,后续的编程实现则完全是自己实现的(原书中的实现比较支离、难懂)。
这里我采用的是“基于产品”的推荐方法,因为一般情况下,产品的种类往往较少,而用户的数量往往非常多,“基于产品”的推荐程序可以很好的减小计算量。
其实基本的思想很简单:
首先读入数据,形成用户-电影矩阵,如图所示:矩阵中的数据为用户(横坐标)对特定电影(纵坐标)的评分。
其次根据用户-电影矩阵计算不同电影之间的相关系数(一般用person相关系数),形成电影-电影相关度矩阵。
其次根据电影-电影相关度矩阵,以及用户已有的评分,通过加权平均计算用户未评分电影的预估评分。例如用户对A电影评3分、B电影评4分、C电影未评分,而C电影与A电影、B电影的相关度分别为0.3和0.8,则C电影的预估评分为(0.3*3+0.8*4)/(0.3+0.8)。
最后对于每一位用户,提取其未评分的电影并按预估评分值倒序排列,提取前n位的电影作为推荐电影。
以下为程序源代码,大块的注释还是比较详细的,便于理解各个模块的作用。此外,程序用到了pandas和numpy库,实现起来会比较简洁,因为许多功能如计算相关系数、排序等功能在这些库中已有实现,直接拿来用即可。
import pandas as pdimport numpy as np#read the datadata={'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5},'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 'Just My Luck': 1.5, 'The Night Listener': 3.0}, 'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0, 'Superman Returns': 3.5, 'The Night Listener': 4.0},'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'The Night Listener': 4.5, 'You, Me and Dupree': 2.5},'Mick LaSalle': {'Just My Luck': 2.0, 'Lady in the Water': 3.0,'Superman Returns': 3.0, 'The Night Listener': 3.0, 'You, Me and Dupree': 2.0}, 'Jack Matthews': {'Snakes on a Plane': 4.0, 'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5},'Toby': {'Snakes on a Plane':4.5,'You, Me and Dupree':1.0,'Superman Returns':4.0}}#clean&transform the datadata = pd.DataFrame(data)#0 represents not been rateddata = data.fillna(0)#each column represents a moviemdata = data.T#calculate the simularity of different movies, normalize the data into [0,1]np.set_printoptions(3)mcors = np.corrcoef(mdata, rowvar=0)mcors = 0.5+mcors*0.5mcors = pd.DataFrame(mcors, columns=mdata.columns, index=mdata.columns)#calculate the score of every item of every user#matrix:the user-movie matrix#mcors:the movie-movie correlation matrix#item:the movie id#user:the user id#score:score of movie for the specific user def cal_score(matrix,mcors,item,user): totscore = 0 totsims = 0 score = 0 if pd.isnull(matrix[item][user]) or matrix[item][user]==0: for mitem in matrix.columns: if matrix[mitem][user]==0: continue else: totscore += matrix[mitem][user]*mcors[item][mitem] totsims += mcors[item][mitem] score = totscore/totsims else: score = matrix[item][user] return score#calculate the socre matrix#matrix:the user-movie matrix#mcors:the movie-movie correlation matrix#score_matrix:score matrix of movie for different users def cal_matscore(matrix,mcors): score_matrix = np.zeros(matrix.shape) score_matrix = pd.DataFrame(score_matrix, columns=matrix.columns, index=matrix.index) for mitem in score_matrix.columns: for muser in score_matrix.index: score_matrix[mitem][muser] = cal_score(matrix,mcors,mitem,muser) return score_matrix#give recommendations: depending on the score matrix#matrix:the user-movie matrix#score_matrix:score matrix of movie for different users #user:the user id#n:the number of recommendationsdef recommend(matrix,score_matrix,user,n): user_ratings = matrix.ix[user] not_rated_item = user_ratings[user_ratings==0] recom_items = {} #recom_items={'a':1,'b':7,'c':3} for item in not_rated_item.index: recom_items[item] = score_matrix[item][user] recom_items = pd.Series(recom_items) recom_items = recom_items.sort_values(ascending=False) return recom_items[:n] #mainscore_matrix = cal_matscore(mdata,mcors)for i in range(10): user = input(str(i)+' please input the name of user:') print recommend(mdata,score_matrix,user,2)
0 0
- 利用python实现电影推荐
- 【Python】 大规模电影推荐
- ALS实现电影推荐
- 使用Python MrJob的MapReduce实现电影推荐系统
- 使用Python MrJob的MapReduce实现电影推荐系统
- 使用Python MrJob的MapReduce实现电影推荐系统
- 使用Python MrJob的MapReduce实现电影推荐系统
- 两行Python代码实现电影打分与推荐
- 利用prolog实现电影助手
- python爬虫实现下载电影天堂电影
- 电影推荐实例(python源代码)
- 使用SVD方法实现电影推荐系统
- R语言实现电影评分推荐
- 基于Mahout的电影推荐系统实现
- 利用Python实现基于协同过滤算法的影片推荐
- 电影推荐
- 推荐电影
- 推荐电影
- 多态、抽象类、接口
- shell脚本调试方法
- 异步过程调用(Asynchronous Procedure Calls,APCs)
- Maven学习总结(16)——深入理解maven生命周期和插件
- 常见复制延迟产生的原因
- 利用python实现电影推荐
- Java中的static关键字解析
- POSIX 线程详解
- 抽象类、接口作为方法形参、返回值
- Kafka到Storm
- 在Android项目中,遇到过的坑
- HashMap排序
- [kipmi0]进程导致系统负载高
- 详解QuickCocos2dX状态机模式设计