原标题:基于Python的电影推荐算法

第一步:收集和清洗数据

数据链接:https://grouplens.org/datasets/movielens/

下载文件:ml-latest-small

import pandas as pd import numpy as np import tensorflow as tf

导入ratings.csv文件ratings_df = pd.read_csv('./ml-latest-small/ratings.csv') ratings_df.tail() #tail命令用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾5行。

结果:

userId

movieId

rating

timestamp

99999

671

6268

2.5

1065579370

100000

671

6269

4.0

1065149201

100001

671

6365

4.0

1070940363

100002

671

6385

2.5

1070979663

100003

671

6565

3.5

1074784724

导入movies.csv文件

movies_df = pd.read_csv('./ml-latest-small/movies.csv') movies_df.tail()

结果:

movieId

title

genres

9120

162672

Mohenjo Daro (2016)

Adventure|Drama|Romance

9121

163056

Shin Godzilla (2016)

Action|Adventure|Fantasy|Sci-Fi

9122

163949

The Beatles: Eight Days a Week - The Touring Y...

Documentary

9123

164977

The Gay Desperado (1936)

Comedy

9124

164979

Women of '69, Unboxed

Documentary

将movies_df中的movieId替换为行号

movies_df[ 'movieRow'] = movies_df. index #生成一列‘movieRow’,等于索引值 index movies_df.tail()

结果:

movieId

title

genres

movieRow

9120

162672

Mohenjo Daro (2016)

Adventure|Drama|Romance

9120

9121

163056

Shin Godzilla (2016)

Action|Adventure|Fantasy|Sci-Fi

9121

9122

163949

The Beatles: Eight Days a Week - The Touring Y...

Documentary

9122

9123

164977

The Gay Desperado (1936)

Comedy

9123

9124

164979

Women of '69, Unboxed

Documentary

9124

筛选movies_df中的特征

movies_df = movies_df[[ 'movieRow', 'movieId', 'title']] #筛选三列出来 movies_df.to_csv( './ml-latest-small/moviesProcessed.csv', index= False, header= True, encoding= 'utf-8') #生成一个新的文件moviesProcessed.csv movies_df.tail()

结果:

movieRow

movieId

title

9120

9120

162672

Mohenjo Daro (2016)

9121

9121

163056

Shin Godzilla (2016)

9122

9122

163949

The Beatles: Eight Days a Week - The Touring Y...

9123

9123

164977

The Gay Desperado (1936)

9124

9124

164979

Women of '69, Unboxed

根据movieId,合并rating_df和movie_df

ratings_df = pd.merge(ratings_df, movies_df, on= 'movieId') ratings_df.head()

结果:

userId

movieId

rating

timestamp

movieRow

title

0

1

31

2.5

1260759144

30

Dangerous Minds (1995)

1

7

31

3.0

851868750

30

Dangerous Minds (1995)

2

31

31

4.0

1273541953

30

Dangerous Minds (1995)

3

32

31

4.0

834828440

30

Dangerous Minds (1995)

4

36

31

3.0

847057202

30

Dangerous Minds (1995)

筛选ratings_df中的特征

ratings_df = ratings_df[[ 'userId', 'movieRow', 'rating']] #筛选出三列 ratings_df.to_csv( './ml-latest-small/ratingsProcessed.csv', index= False, header= True, encoding= 'utf-8') #导出一个新的文件ratingsProcessed.csv ratings_df.head()

结果:

userId

movieRow

rating

0

1

30

2.5

1

7

30

3.0

2

31

30

4.0

3

32

30

4.0

4

36

30

3.0 第二步:创建电影评分矩阵rating和评分纪录矩阵record

userNo = ratings_df['userId'].max() + 1 #userNo的最大值 movieNo = ratings_df['movieRow'].max() + 1 #movieNo的最大值 rating = np.zeros((movieNo,userNo)) #创建一个值都是0的数据 flag = 0 ratings_df_length = np.shape(ratings_df)[0] #查看矩阵ratings_df的第一维度是多少 for index,row in ratings_df.iterrows(): #interrows(),对表格ratings_df进行遍历 rating[int(row['movieRow']),int(row['userId'])] = row['rating'] #将ratings_df表里的'movieRow'和'userId'列,填上row的‘评分’ flag += 1 record = rating > 0 record record = np.array(record, dtype = int) #更改数据类型,0表示用户没有对电影评分,1表示用户已经对电影评分 record

结果:

array([[ 0, 0, 0, ..., 0, 1, 1], [ 0, 0, 0, ..., 0, 0, 0], [ 0, 0, 0, ..., 0, 0, 0], ..., [ 0, 0, 0, ..., 0, 0, 0], [ 0, 0, 0, ..., 0, 0, 0], [ 0, 0, 0, ..., 0, 0, 0]])

第三步:构建模型 def normalizeRatings(rating, record): m, n =rating.shape #m代表电影数量,n代表用户数量 rating_mean = np.zeros((m, 1)) #每部电影的平均得分 rating_norm = np.zeros((m,n)) #处理过的评分 for i in range(m): idx = record[i,:] != 0 #每部电影的评分,[i,:]表示每一行的所有列 rating_mean[i] = np.mean(rating[i,idx]) #第i行,评过份idx的用户的平均得分; #np.mean() 对所有元素求均值 rating_norm[i,idx] -= rating_mean[i] #rating_norm = 原始得分-平均得分 return rating_norm, rating_mean rating_norm, rating_mean = normalizeRatings(rating, record)

结果:/root/anaconda2/envs/python3/lib/python3. 6/site-packages/numpy/core/fromnumeric.py: 2957: RuntimeWarning: Mean of empty slice. out= out, **kwargs) /root/anaconda2/envs/python3/lib/python3. 6/site-packages/numpy/core/_methods.py: 80: RuntimeWarning: invalid value encountered in double_scalars ret = ret.dtype. type(ret / rcount)

注:如果数据出现较多的NaNN,对后面的运算影响较大rating_norm =np.nan_to_num(rating_norm) #对值为NaNN进行处理,改成数值0 rating_norm

结果:array([[ 0. , 0. , 0. , ..., 0. , - 3.87246964, - 3.87246964], [ 0. , 0. , 0. , ..., 0. , 0. , 0. ], [ 0. , 0. , 0. , ..., 0. , 0. , 0. ], ..., [ 0. , 0. , 0. , ..., 0. , 0. , 0. ], [ 0. , 0. , 0. , ..., 0. , 0. , 0. ], [ 0. , 0. , 0. , ..., 0. , 0. , 0. ]])

-rating_mean =np.nan_to_num(rating_mean) #对值为NaNN进行处理,改成数值0 rating_mean

结果: array( [[3.87246964], [3.40186916], [3.16101695], ..., [3. ], [0. ], [5. ]])

构建模型 num_features = 10 X_parameters = tf.Variable(tf.random_normal([movie No, num_features],stddev = 0.35)) Theta_parameters = tf.Variable(tf.random_normal([user No, num_features],stddev = 0.35)) #tf.Variables()初始化变量 #tf.random_normal()函数用于从服从指定正太分布的数值中取出指定个数的值,mean: 正态分布的均值。stddev: 正态分布的标准差。dtype: 输出的类型 loss = 1/ 2 * tf.reduce_sum(((tf.matmul(X_parameters, Theta_parameters, transpose_b = True) - rating_norm) * record) ** 2) + 1/ 2 * (tf.reduce_sum(X_parameters ** 2) + tf.reduce_sum(Theta_parameters ** 2)) #基于内容的推荐算法模型

# 函数解释: # reduce_sum() 就是求和,reduce_sum( input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None) # reduce_sum() 参数解释: # 1) input_tensor:输入的张量。 # 2) axis:沿着哪个维度求和。对于二维的input_tensor张量,0表示按列求和,1表示按行求和,[0, 1]表示先按列求和再按行求和。 # 3) keep_dims:默认值为Flase,表示默认要降维。若设为True,则不降维。 # 4) name:名字。 # 5) reduction_indices:默认值是None,即把input_tensor降到 0维,也就是一个数。对于2维input_tensor,reduction_indices=0时,按列;reduction_indices=1时,按行。 # 6) 注意,reduction_indices与axis不能同时设置。 # tf.matmul(a,b),将矩阵 a 乘以矩阵 b,生成a * b # tf.matmul(a,b)参数解释: # 1) a:类型为 float16,float32,float64,int32,complex64,complex128 和 rank > 1的张量。 # 2) b:与 a 具有相同类型和 rank。 # 3) transpose_a:如果 True,a 在乘法之前转置。 # 4) transpose_b:如果 True,b 在乘法之前转置。 # 5) adjoint_a:如果 True,a 在乘法之前共轭和转置。 # 6) adjoint_b:如果 True,b 在乘法之前共轭和转置。 # 7) a_is_sparse:如果 True,a 被视为稀疏矩阵。 # 8) b_is_sparse:如果 True,b 被视为稀疏矩阵。 # 9) name:操作名称(可选)

优化算法

optimizer = tf.train.AdamOptimizer( 1e- 4) # https://blog.csdn.net/lenbow/article/details/52218551 train = optimizer.minimize(loss) # Optimizer.minimize对一个损失变量基本上做两件事 # 它计算相对于模型参数的损失梯度。 # 然后应用计算出的梯度来更新变量。

第四步:训练模型 # tf.summary的用法 https://www.cnblogs.com/lyc-seu/p/8647792.html tf.summary.scalar( 'loss',loss) #用来显示标量信息

结果: summaryMerged = tf.summary.merge_all() #merge_all 可以将所有summary全部保存到磁盘,以便tensorboard显示。 filename = './movie_tensorborad' writer = tf.summary.FileWriter(filename) #指定一个文件用来保存图。 sess = tf.Session() #https://www.cnblogs.com/wuzhitj/p/6648610.html init = tf.global_variables_initializer() sess.run(init) #运行 for i in range(5000): _, movie_summary = sess.run([train, summaryMerged]) # 把训练的结果summaryMerged存在movie里 writer.add_summary(movie_summary, i) # 把训练的结果保存下来

查看训练结果: 在终端输入 tensorboard --logir=./

第五步:评估模型Current_X_parameters, Current_Theta_parameters = sess.run([X_parameters, Theta_parameters]) # Current_X_parameters为用户内容矩阵,Current_Theta_parameters用户喜好矩阵 predicts = np.dot(Current_X_parameters,Current_Theta_parameters.T) + rating_mean # dot函数是np中的矩阵乘法,np.dot(x,y) 等价于 x.dot(y) errors = np.sqrt(np.sum((predicts - rating)**2)) # sqrt(arr) ,计算各元素的平方根 errors

结果:4037.9002717628305 第六步:构建完整的电影推荐系统user_id = input('您要想哪位用户进行推荐?请输入用户编号:') sortedResult = predicts[:, int(user_id)].argsort()[::-1] # argsort()函数返回的是数组值从小到大的索引值; argsort()[::-1] 返回的是数组值从大到小的索引值 idx = 0 print('为该用户推荐的评分最高的20部电影是:'.center(80,'=')) # center() 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串。默认填充字符为空格。 for i in sortedResult: print('评分: %.2f, 电影名: %s' % (predicts[ i,int(user_id)],movies_df.iloc[ i][ 'title'])) # .iloc的用法:https://www.cnblogs.com/harvey888/p/6006200.html idx += 1 if idx == 20:break

结果:您要想哪位用户进行推荐?请输入用户编号:123 ==============================为该用户推荐的评分最高的20部电影是:=============================== 评分: 5.03, 电影名: Fireworks Wednesday (Chaharshanbe-soori) (2006) 评分: 4.88, 电影名: Woman on the Beach (Haebyeonui yeoin) (2006) 评分: 4.73, 电影名: Mummy's Ghost, The (1944) 评分: 4.66, 电影名: Maborosi (Maboroshi no hikari) (1995) 评分: 4.63, 电影名: Boiling Point (1993) 评分: 4.60, 电影名: Mala Noche (1985) 评分: 4.49, 电影名: All-Star Superman (2011) 评分: 4.47, 电影名: Bill Hicks: Relentless (1992) 评分: 4.45, 电影名: Something Borrowed (2011) 评分: 4.37, 电影名: Box of Moon Light (1996) 评分: 4.37, 电影名: Kwaidan (Kaidan) (1964) 评分: 4.35, 电影名: Sacrifice, The (Offret - Sacraficatio) (1986) 评分: 4.29, 电影名: Hotel de Love (1996) 评分: 4.27, 电影名: Aria (1987) 评分: 4.23, 电影名: Querelle (1982) 评分: 4.22, 电影名: Rocky VI (1986) 评分: 4.21, 电影名: Little Lord Fauntleroy (1936) 评分: 4.19, 电影名: Hardcore (1979) 评分: 4.16, 电影名: Three of Hearts (1993) 评分: 4.15, 电影名: White Stripes Under Great White Northern Lights, The (2009)

作者:Kervin_Chan 源自:https://juejin.im/post/5afbfe316fb9a07aa5427d73 #heading-5

转发此文到朋友圈并截图到后台,

获得20G

python入门视频课

往期实战及福利

关注本公众号,牧原小主 送您

2.7G 380份最新数据分析报告

40G 人工智能算法课

已关注的小伙伴,直接回复数据分析报告、人工智能算法

关注后,回复 PM2.5 获得 Python分析北京PM2.5,原来每年的值都在变少...所有源代码

关注后,回复“python3.7”,获得python 3.7官方最新pdf 文档

关注后,回复 世界杯, 获得 2018世界杯来了,利用Python预测冠军(附全部代码和数据集)所有源代码

关注后,回复“豆瓣电影“,获得 Python实战 | 手把手教你爬取豆瓣电影 Top 250(附全部代码及福利哦)所有源代码

关注后,回复“python可视化”,获得 利用python“三步”实现数据可视化,炫的不要不要的!所有源代码

长按二维码,关注我们

责任编辑:

python电影推荐算法_基于Python的电影推荐算法相关推荐

  1. java 好友推荐 算法_基于jsp的好友推荐-JavaEE实现好友推荐 - java项目源码

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的好友推荐, 该项目可用各类java课程设计大作业中, 好友推荐的系统架构分为前后台两部分, 最终实现在线上进行好友 ...

  2. python爬虫项目毕业设计_基于python爬虫的电影推荐网站的设计与实现毕业论文+初稿+项目源码+安装说明+使用说明...

    摘 要 现在电影资源是网络资源的重要组成部分,随着网络上电影资源的数量越来越庞大,设计电影个性化推荐系统迫在眉睫.所以本文旨在为每一个用户推荐与其兴趣爱好契合度较高的电影. 本系统包含电影前端展示界面 ...

  3. python回归算法_基于Python的函数回归算法验证

    看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归 回归方法就是寻找方差的最小值 y = kx + b xi, ...

  4. python多叉树遍历_基于Python的多叉树遍历算法

    [ 综直厘翹 S 赛理 ) 信息记录材料 2019 年 5 月第 20 卷第 5 期 基于 Python 的多叉树遍历算法 钱雨波 , 王金祥 ( 指导老师 ) ( 延边大学 吉林 延边 1 3300 ...

  5. 文本处理算法_基于 Python 的 11 种经典数据降维算法

    网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA.MDS.LLE. ...

  6. python实现ocr识别算法_基于Python的OCR实现示例

    摘要: 近几天在做一个东西,其中需要对图像中的文字进行识别,看了前辈们的文章,找到两个较简单的方法:使用python的pytesseract库和调用百度AI平台接口.写下这篇文章做一个比较简短的记录和 ...

  7. python批量检索文献_基于Python的文献检索系统设计与实现

    基于 Python 的文献检索系统设计与实现 杜兰 ; 刘智 ; 陈琳琳 [期刊名称] <软件> [年 ( 卷 ), 期] 2020(041)001 [摘要] 毕业设计是大学本科教育的一个 ...

  8. 基于python的房地产数据分析_基于Python的数据分析

    转载 | CSDN 编辑 | 雷课小雷 下面来介绍一下基于Python的数据分析,主要介绍数据分析的概念.数据分析流程.Python优势.常用模块的用途以及使用Python进行数据分析的学习方法及步骤 ...

  9. python兼职平台信号处理_基于Python的数字信号处理初步

    作者:许欢 来源:EETOP 行者无疆(论坛usrname:ICNO.1) 的博客 Python 是目前的热门语言,一直觉得掌握一门编程语言对作为搞技术的来说还是很有必要的,结合工作中能用到的一些数据 ...

最新文章

  1. 沃丰报告:物联网的未来
  2. python 如何把小数变成百分数格式
  3. TensorFlow 2.0快速上手指南12条:“Keras之父”亲授 | 高赞热贴
  4. 【tensorFlow】——图像数据增强、读取图像、保存图像
  5. UIWebView UITextView
  6. 使用 Azure Site Recovery 灾难恢复至 Azure 的功能现已正式发布
  7. 程序员需要避免的 10 个坏习惯
  8. 将一个日程分割成多个日程_在家庭日程中开展工作的6个技巧
  9. 【分布式缓存系列】Redis实现分布式锁的正确姿势
  10. 机器学习-吴恩达-笔记-7-机器学习系统的设计
  11. python 学习DAY12
  12. 入门嵌入式HTML/CSS/脚本引擎 sciter
  13. AidLearning上手使用经验谈
  14. C语言int类型转换为char类型
  15. 启动docker 服务时 虚拟机端口转发 外部无法访问
  16. mocha java mv_代码覆盖Mocha
  17. 软件开发七宗罪(转发)
  18. 985 高校副教授一年能够拿到多少工资?
  19. 动态规划解决最长公共子序列
  20. 5分钟完成核磁共振检查,Facebook的AI技术现在还经不住考验

热门文章

  1. 无刷直流电机(BLDC)无传感器控制,采用的是容积卡尔曼观测,能够很好的估计转速和转子位置,有对应的simulink文件跟ckf代码
  2. spring注解详解,看完你就都全懂了!!
  3. HTML的怎么使用,开发工具以及常用标签。
  4. 基于Java的员工工资管理系统(源码分享)
  5. 年终,使用 Python 汇总各月开发的报表数量
  6. 为什么打开某个网站时IE地址栏的兼容性视图总是开启的?
  7. java毕业设计学生请假管理系统Mybatis+系统+数据库+调试部署
  8. java毕业设计厨房管理系统Mybatis+系统+数据库+调试部署
  9. Perl脚本实现tiptop数据导出EXCEL模板
  10. mysql导入bak文件