推荐系统
目前推荐系统被应用于各个领域,例如淘宝的商品推荐、b站的视频推荐、网易云音乐的每日推荐等等,这些都是基于用于往日在平台的行为模式给用户推荐他们可能喜欢的商品、视频、音乐。
下面我们将以电影推荐系统举例,一步一步通过Python实现一个简单的电影推荐系统。
由于数据量的原因,我们可能无法做到精度较高的推荐系统,但是做一个差不多能实现推荐功能的电影推荐系统是完全没有问题的。
导入模块
import io
import os
import sys
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from sklearn.impute import SimpleImputer
from sklearn.metrics.pairwise import cosine_similarity
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
收集数据
早期讲构造机器学习系统的时候说到,我们第一步往往是需要收集数据。
由于本次要做的推荐系统是和电影有关的,而为了给用户推荐他喜欢的电影,一般会收集每个用户对自己看过的电影的评分。这里我们假设用户看完电影一定会给电影评分,并且评分范围为${1,2,3,4,5}$,即评分最低为1分,最高为5分。如果用户没有评分则意味着用户没有看过该电影。
如果是大型的推荐系统,往往需要通过很多途径获得各种数据,如爬虫、平台合作,并且可能还会考虑用户本身的各种信息,如身高、体重、年龄、兴趣爱好……和电影的各种信息,如篇名、导演、演员阵容、上映时间……,通常这种大型系统针对的数据维度往往都是上万,上十万的。由于数据限制,因此这里只假设用户喜欢看的电影和他对电影的评分有关。
由于这是一个简单的推荐系统版本,所以我们假设我们已经获取了用户对自己看过的电影的评分,即数据在movie.xlsx
表格中。
# 收集数据
# 没有表格文件时自定义数据
csv_data = '''
《肖申克的救赎》,《控方证人》,《这个杀手不太冷》,《霸王别姬》,《美丽人生》,《阿甘正传》,《辛德勒的名单》,姓名
,4.0,,4.0,,5.0,,'刘一'
4.0,,5.0,3.0,5.0,,,'陈二'
3.0,4.0,,3.0,2.0,3.0,3.0,'张三'
2.0,3.0,,3.0,,,,'李四'
3.0,4.0,,5.0,3.0,3.0,,'王五'
,,4.0,,4.0,2.0,,'赵六'
3.0,,1.0,5.0,3.0,3.0,2.0,'孙七'
2.0,,2.0,,1.0,,,'周八'
1.0,2.0,,,,2.0,,'吴九'
,5.0,,4.0,,3.0,3.0,'郑十'
'''
if not os.path.exists('datasets/movie.xlsx'):
# 将文件读入内存
csv_data = io.StringIO(csv_data)
df = pd.read_csv(csv_data, header=0)
df.index = df['姓名'].tolist()
else:
# 从表格中获取数据
df = pd.read_excel('datasets/movie.xlsx', header=0)
df.index = df['姓名'].tolist()
df
《肖申克的救赎》 | 《控方证人》 | 《这个杀手不太冷》 | 《霸王别姬》 | 《美丽人生》 | 《阿甘正传》 | 《辛德勒的名单》 | 姓名 | |
---|---|---|---|---|---|---|---|---|
刘一 | NaN | 4.0 | NaN | 4.0 | NaN | 5.0 | NaN | 刘一 |
陈二 | 4.0 | NaN | 5.0 | 3.0 | 5.0 | NaN | NaN | 陈二 |
张三 | 3.0 | 4.0 | NaN | 3.0 | 2.0 | 3.0 | 3.0 | 张三 |
李四 | 2.0 | 3.0 | NaN | 3.0 | 3.0 | 2.0 | NaN | 李四 |
王五 | 3.0 | 4.0 | NaN | 5.0 | 3.0 | 3.0 | NaN | 王五 |
赵六 | NaN | NaN | 4.0 | NaN | 4.0 | 2.0 | NaN | 赵六 |
孙七 | 3.0 | NaN | 1.0 | 5.0 | 3.0 | 3.0 | 2.0 | 孙七 |
周八 | 2.0 | NaN | 2.0 | NaN | 1.0 | NaN | 2.0 | 周八 |
吴九 | 1.0 | 2.0 | 2.0 | NaN | 1.0 | 1.0 | NaN | 吴九 |
郑十 | NaN | 5.0 | NaN | 4.0 | NaN | 3.0 | 3.0 | 郑十 |