You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.6 KiB

10.5 实战案例

电影评分数据

本次使用电影评分数据为672个用户对9123部电影的评分记录,部分数据如下:

userId movieRow rating
1 30 2.5
7 30 3
31 30 4
32 30 4

其中:

userId用户编号
movieRow:电影编号
rating:评分值

如:

  • 第一行数据表示用户1对电影30评分为2.5分。
  • 第二行数据表示用户7对电影30评分为3分。

然后,我们还有电影编号与电影名字对应的数据如下:

movieRow title
0 Toy Story (1995)
1 Jumanji (1995)
2 Grumpier Old Men (1995)
3 Waiting to Exhale (1995)

其中:

movieRow电影编号
title电影名称

数据下载连接 提取码ve3v

构造用户-电影评分矩阵

大家已经知道,要使用基于矩阵分解的协同过滤算法,首先得有用户与电影评分的矩阵,而我们实际中的数据并不是以这样的形式保存,所以在使用算法前要先构造出用户-电影评分矩阵,python实现代码如下:

import numpy as np
import pandas as pd

# 读取电影数据
ratings_df = pd.read_csv('data.csv')

# 获取用户数
userNo = max(ratings_df['userId'])+1
# 获取电影数
movieNo = max(ratings_df['movieRow'])+1

# 创建电影评分表
rating = np.zeros((userNo,movieNo))
for index,row in ratings_df.iterrows():
    rating[int(row['userId']),int(row['movieRow'])]=row['rating']

构造出表格后,我们就能使用上一关实现的方法来对用户进行电影推荐了:

# 使用上一节中实现的推荐算法进行推荐
recommend(1,1e-4,0.999,20,100,rating)
>>>
为用户1推荐的电影为
1:Rumble Fish (1983)
2:Aquamarine (2006)
3:Stay Alive (2006)
4:Betrayal, The (Nerakhoon) (2008)
5:Midnight Express (1978)

# 使用上一节中实现的推荐算法进行推荐
recommend(666,1e-4,0.999,20,100,rating) 
>>>
为用户666推荐的电影为
1:Aquamarine (2006)
2:It's a Boy Girl Thing (2006)
3:Kill the Messenger (2014)
4:Onion Field, The (1979)
5:Wind Rises, The (Kaze tachinu) (2013)

# 使用上一节中实现的推荐算法进行推荐
recommend(555,1e-4,0.999,20,100,rating) 
>>>
为用户555推荐的电影为
1:Return from Witch Mountain (1978)
2:Hitcher, The (2007)
3:Betrayal, The (Nerakhoon) (2008)
4:Listen to Me Marlon (2015)
5:World of Tomorrow (2015)

# 使用上一节中实现的推荐算法进行推荐
recommend(88,1e-4,0.999,20,100,rating) 
>>>
为用户88推荐的电影为
1:Now, Voyager (1942)
2:Betrayal, The (Nerakhoon) (2008)
3:Aquamarine (2006)
4:Post Grad (2009)
5:Hitcher, The (2007)