电影推荐网站"/>
基于python的电影推荐网站
结果:
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
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)
结果:
注:如果数据出现较多的NaNN,对后面的运算影响较大
结果:
-
结果:
构建模型
# 函数解释: # 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) # train = optimizer.minimize(loss) # Optimizer.minimize对一个损失变量基本上做两件事 # 它计算相对于模型参数的损失梯度。 # 然后应用计算出的梯度来更新变量。
第四步:训练模型 # tf.summary的用法 .html tf.summary.scalar( 'loss',loss) #用来显示标量信息
结果:
查看训练结果: 在终端输入 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
结果:
作者:Kervin_Chan 源自: #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“三步”实现数据可视化,炫的不要不要的!所有源代码
2.7G 380份最新数据分析报告
40G 人工智能算法课
已关注的小伙伴,直接回复数据分析报告、人工智能算法
长按二维码,关注我们
更多推荐
基于python的电影推荐网站
发布评论