“协同过滤”是推荐系统中的常用技术,按照分析维度的不同可实现“基于用户”和“基于产品”的推荐。

以下是利用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库,实现起来会比较简洁,因为许多功能如计算相关系数、排序等功能在这些库中已有实现,直接拿来用即可。

  1. import pandas as pd
  2. import numpy as np
  3. #read the data
  4. data={'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5,
  5. 'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5},
  6. 'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5,
  7. 'Just My Luck': 1.5, 'The Night Listener': 3.0},
  8. 'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,
  9. 'Superman Returns': 3.5, 'The Night Listener': 4.0},
  10. 'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0,
  11. 'The Night Listener': 4.5, 'You, Me and Dupree': 2.5},
  12. '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},
  13. 'Jack Matthews': {'Snakes on a Plane': 4.0, 'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5},
  14. 'Toby': {'Snakes on a Plane':4.5,'You, Me and Dupree':1.0,'Superman Returns':4.0}}
  15. #clean&transform the data
  16. data = pd.DataFrame(data)
  17. #0 represents not been rated
  18. data = data.fillna(0)
  19. #each column represents a movie
  20. mdata = data.T
  21. #calculate the simularity of different movies, normalize the data into [0,1]
  22. np.set_printoptions(3)
  23. mcors = np.corrcoef(mdata, rowvar=0)
  24. mcors = 0.5+mcors*0.5
  25. mcors = pd.DataFrame(mcors, columns=mdata.columns, index=mdata.columns)
  26. #calculate the score of every item of every user
  27. #matrix:the user-movie matrix
  28. #mcors:the movie-movie correlation matrix
  29. #item:the movie id
  30. #user:the user id
  31. #score:score of movie for the specific user
  32. def cal_score(matrix,mcors,item,user):
  33. totscore = 0
  34. totsims = 0
  35. score = 0
  36. if pd.isnull(matrix[item][user]) or matrix[item][user]==0:
  37. for mitem in matrix.columns:
  38. if matrix[mitem][user]==0:
  39. continue
  40. else:
  41. totscore += matrix[mitem][user]*mcors[item][mitem]
  42. totsims += mcors[item][mitem]
  43. score = totscore/totsims
  44. else:
  45. score = matrix[item][user]
  46. return score
  47. #calculate the socre matrix
  48. #matrix:the user-movie matrix
  49. #mcors:the movie-movie correlation matrix
  50. #score_matrix:score matrix of movie for different users
  51. def cal_matscore(matrix,mcors):
  52. score_matrix = np.zeros(matrix.shape)
  53. score_matrix = pd.DataFrame(score_matrix, columns=matrix.columns, index=matrix.index)
  54. for mitem in score_matrix.columns:
  55. for muser in score_matrix.index:
  56. score_matrix[mitem][muser]  = cal_score(matrix,mcors,mitem,muser)
  57. return score_matrix
  58. #give recommendations: depending on the score matrix
  59. #matrix:the user-movie matrix
  60. #score_matrix:score matrix of movie for different users
  61. #user:the user id
  62. #n:the number of recommendations
  63. def recommend(matrix,score_matrix,user,n):
  64. user_ratings = matrix.ix[user]
  65. not_rated_item = user_ratings[user_ratings==0]
  66. recom_items = {}
  67. #recom_items={'a':1,'b':7,'c':3}
  68. for item in not_rated_item.index:
  69. recom_items[item] = score_matrix[item][user]
  70. recom_items = pd.Series(recom_items)
  71. recom_items = recom_items.sort_values(ascending=False)
  72. return recom_items[:n]
  73. #main
  74. score_matrix = cal_matscore(mdata,mcors)
  75. for i in range(10):
  76. user = input(str(i)+' please input the name of user:')
  77. print recommend(mdata,score_matrix,user,2)

转利用python实现电影推荐的更多相关文章

  1. 利用python实现电影推荐

    "协同过滤"是推荐系统中的常用技术,按照分析维度的不同可实现"基于用户"和"基于产品"的推荐. 以下是利用python实现电影推荐的具体方法 ...

  2. 利用Surprise包进行电影推荐

    Surprise(Simple Python Recommendation System Engine)是一款推荐系统库,是scikit系列中的一个.简单易用,同时支持多种推荐算法(基础算法.协同过滤 ...

  3. 【大数据 Spark】利用电影观看记录数据,进行电影推荐

    利用电影观看记录数据,进行电影推荐. 目录 利用电影观看记录数据,进行电影推荐. 准备 1.任务描述: 2.数据下载 3.部分数据展示 实操 1.设置输入输出路径 2.配置spark 3.读取Rati ...

  4. 基于物品的协同过滤item-CF 之电影推荐 python

    推荐算法有基于协同的Collaboration Filtering:包括 user Based和item Based:基于内容 : Content Based 协同过滤包括基于物品的协同过滤和基于用户 ...

  5. Python实现个性化推荐二

    基于内容的推荐引擎是怎么工作的 基于内容的推荐系统,正如你的朋友和同事预期的那样,会考虑商品的实际属性,比如商品描述,商品名,价格等等.如果你以前从没接触过推荐系统,然后现在有人拿枪指着你的头,强迫你 ...

  6. 利用Python,四步掌握机器学习

    为了理解和应用机器学习技术,你需要学习 Python 或者 R.这两者都是与 C.Java.PHP 相类似的编程语言.但是,因为 Python 与 R 都比较年轻,而且更加“远离”CPU,所以它们显得 ...

  7. 利用python 掌握机器学习的过程

    转载:http://python.jobbole.com/84326/ 偶然看到的这篇文章,觉得对我挺有引导作用的.特此跟大家分享一下. 为了理解和应用机器学习技术,你需要学习 Python 或者 R ...

  8. 利用python进行数据分析--(阅读笔记一)

    以此记录阅读和学习<利用Python进行数据分析>这本书中的觉得重要的点! 第一章:准备工作 1.一组新闻文章可以被处理为一张词频表,这张词频表可以用于情感分析. 2.大多数软件是由两部分 ...

  9. 《利用python进行数据分析》读书笔记 --第一、二章 准备与例子

    http://www.cnblogs.com/batteryhp/p/4868348.html 第一章 准备工作 今天开始码这本书--<利用python进行数据分析>.R和python都得 ...

随机推荐

  1. jQuery form的load函数与el表达式赋值的冲突问题

    问题: 在使用el表达式给表单中的项赋初始值的时候,总是失败,物流公司没有自动选中,物流单号也没有显示值. <form id="form" method="post ...

  2. %s %d %f 等等是什么意思

    这个是C语言的格式化输出:%s是字符串.%d是整数.%f代表浮点数. 这些是格式声明,格式声明由“%”和格式字符组成.常用的格式字符有:1)d格式符,用来输出一个有符号的十进制整数:2)c格式符,用来 ...

  3. Android的WebView控件载入网页显示速度慢的究极解决方案

    Android的WebView控件载入网页显示速度慢的究极解决方案 [转载来源自http://hi.baidu.com/goldchocobo/] 秒(甚至更多)时间才会显示出来.研究了很久,搜遍了国 ...

  4. 8 -- 深入使用Spring -- 4... Spring的AOP

    8.4 Spring的AOP AOP(Aspect Orient Programming),也就是面向切面编程,最为面向对象编程的一种补充. AOP和OOP互为补充,面向对象编程将程序分解成各个层次的 ...

  5. flexbox父盒子align-content属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. ios开发之-- tableview/collectionview获取当前点击的cell

    方法如下: 一般collectionView 或者 tableview都有自带的点击函数,如下: , collectionView -(void)collectionView:(UICollectio ...

  7. RF实现多次失败重跑结果合并的基础方法和优化方法

    实现思路:通过分次执行失败案例重跑,然后通过结果文件合并命令实现多次失败重跑结果文件的合并,并输出合并后的log和report文件: 说明:具体失败案例重跑命令和结果文件合并命令请参考本博客其他相关章 ...

  8. NUC972裸机调试步骤

    .将开发板设置成USB启动.开发板拨码开关与启动方式设置对应如下: 其中PA1 ,PA0对应S1和S0 上电或复位,使开发板从USB启动.开启NuWriter,选择正确的芯片型号,按下“Continu ...

  9. React Native(九)——实现仿微信朋友圈发表动态功能

    好像很久都没写博客了,罪过罪过~ 许是因为刚接触App有点生疏不得窍门吧,这个月还没有更新过文章.小个把月下来,还是觉得应该边学边总结,这样才能像大神靠近(最近刚接触同业的大牛级人物,还是从中学到了很 ...

  10. IDEA 单元测试 导入JUnit4到项目

    一.IDEA自带JUnit4的jar包,现在让我们来导入. Step 1. IDEA最上面一栏的菜单栏中,选File->Project Structure(从上往下第11个),弹出窗口左边有一个 ...