本篇文章7282字,读完约18分钟
几乎每个人都喜欢在闲暇时间和家人朋友一起看电影。每个人都可能有过这样的经历:我想在接下来的两个小时里看一部电影,但我在沙发上坐了20分钟,不知道该看什么。再次选择的困难让我感到沮丧。因此,我们需要一个电脑代理来推荐电影。
现在,电影智能推荐系统已经成为日常生活的一部分。
数据科学中心曾经说过:
“尽管很难获得确凿的数据,但知情人士估计,对于亚马逊(Amazon)和网飞等大型电子商务平台而言,推荐系统将为它们带来高达10%至25%的收入增长。”
在这个项目中,我研究了一些电影推荐的基本算法,并尝试将深度学习融入到电影推荐系统中。
将娱乐和视觉艺术结合起来,电影就是一个很好的例子。电影海报可以直接快速地将电影信息传达给观众。设计曼蒂奇说:“电影海报是发行前后制造噱头的主要因素。大多数人(目标观众)根据海报决定是买票还是看电影。”我们甚至可以根据海报字体来猜测这部电影的情感。
这听起来有点像魔术——但是通过看海报来预测电影的类型确实是可能的。以我为例。我看了一眼海报就知道我是否想看这部电影。例如,我不是一个卡通迷。当我看到卡通海报时,我知道它不是我喜欢的类型。这个决策过程很简单,不需要阅读电影评论(不确定谁真的有时间阅读这些评论)。因此,除了标准的电影推荐算法,我还使用深度学习来处理海报,并向用户推荐类似的电影。最终的目标是模仿人类的视觉,通过观察海报进行深度学习,创建一个直观的电影推荐系统。这个项目的灵感来自伊森罗森塔尔的博客。我修改了他博客中的代码,以适应这个项目的算法。
我们使用从movielens下载的电影数据集。他拥有9066部电影和671名用户,分为100000个分数和1300个标签。该数据集最近一次更新是在2016年10月。
协同过滤大致说来,推荐系统有三种类型(不包括简单的评分方法)
基于内容的推荐
协同过滤
混合模型
“基于内容的推荐”是一个返回问题。我们以电影内容为特征,预测用户对电影的评价。
然而,在“协同过滤”推荐系统中,通常不可能事先获得内容特征。通过用户之间的相似性(用户对电影给予相同的评价)和电影之间的相似性(具有相似用户评价的电影),我们可以学习潜在的特征并预测用户对电影的评价。另外,在了解了电影的特点后,我们可以衡量电影之间的相似性,并根据用户的历史观看信息向他们推荐最相似的电影。
基于内容的推荐和协作过滤是10多年前最先进的技术。显然,有许多模型和算法可以提高预测效果。例如,鉴于事先缺乏用户电影分级信息,隐式矩阵分解可用于用偏好和置信度来代替用户电影分级,例如,用户点击电影推荐的次数,用于协同过滤。另外,我们可以结合“内容推荐”和“协同过滤”的方法,将内容作为辅助信息来提高预测精度。这种混合方法可以通过“学习排序”算法来实现。
在这个项目中,我将重点介绍“协同过滤”方法。首先,我将讨论如何用电影(用户)的相似度来代替Return来预测分数,并根据相似度进行电影推荐。然后,我将讨论如何使用返回学习潜在的功能,并在同一时间提出电影建议。最后,我们将讨论如何在推荐系统中使用深度学习。
对于基于协同过滤的推荐系统,首先要建立评分矩阵。其中,每行代表一个用户,每列对应一部电影的分数。建立的评分矩阵如下:
df=pd.read_csv( ratings.csv,sep=,)
df _ id = PD . read _ CSV(link . CSV,sep=,)
df=pd.merge(df,df_id,on=[ movieid ])
rating _ matrix = NP . zeros((df . userid . unique)()。形状[0],最大值(df.movieid))
forrowindf.itertuples():
rating _ matrix[行[1]-1,行[2]-1]=行[3]
等级矩阵=等级矩阵[:,:9000]
这里,“ratings.csv”包含用户id、电影id、分级和时间信息;“link.csv”包括电影id、imdb id和tmdb id。每部电影都使用api从电影数据库网站获取海报,这需要IMDB标识——因此,我们将这两个表结合在一起。我们测试了评分矩阵的稀疏性,如下所示:
稀疏性=浮动(len(ratings .非零()[0])
稀疏度/=(评级.形状[0]*评级.形状[1])
稀疏度*=100
当非零条目仅为1.40%时,评级矩阵是稀疏的。现在,为了训练和测试,我们将评分矩阵分解成两个较小的矩阵。我们从分数矩阵中删除了10个分数,并将它们放入测试集。
train _ matrix = rating _ matrix . copy()
test _ matrix = NP . zero(ratings _ matrix . shape)
for iinxrange(rating _ matrix . shape[0]):
rating_idx=np.random.choice(
评级矩阵[i,]。非零()[0],
尺寸=10,
replace=true)
train_matrix[i,rating_idx]=0.0
测试矩阵[i,rating_idx]=评级矩阵[i,rating _ idx]
根据以下公式计算用户/电影中的(余弦)相似度
这里s(u,v)是用户u和v之间的余弦相似度。
相似性_用户=列车_矩阵.点(列车_矩阵. t)+1e-9
norms=np.array([np.sqrt(np .对角线(相似性_用户))])
相似性_用户=(相似性_用户/(规范*规范. t))
相似性_电影= train _ matrix . t . dot(train _ matrix)+1e-9
范数=np.array([np.sqrt(np .对角线(相似性_电影))])
相似性_电影=(相似性_电影/(规范*规范. t))
利用用户之间的相似性,我们可以预测每个用户的评分并计算相应的均方误差。预测是基于相似用户的分数。特别地,得分预测可以根据以下公式来执行:
用户u对电影I的预测是用户v对电影评分的(归一化)加权和。权重是用户u和v的相似度。
fromsk learn . metrics importmean _ square _ error
预测=相似性_用户.点(train_matrix)/np.array([np.abs(相似性_用户))。总和(轴=1)]。t
预测=预测[test_matrix .非零()]。展平()
test _ vector = test _ matrix[test _ matrix .非零()]。展平()
mse =均方误差(预测,测试向量)
打印毫秒= +str(毫秒)
预测均方差为9.8252。这个数字是什么意思?这个推荐系统是好还是坏?仅仅看均方误差结果来评价预测效果是不太直观的。因此,我们直接查看电影推荐进行评估。我们将搜索一部有趣的电影,让电脑代理推荐几部电影。首先,我们应该得到相应的电影海报,这样我们就可以看到推荐什么电影。我们使用imdb id及其api从电影数据库网站获取海报。
导入请求
importjson
fromipython.displayimportimage
from ipython . displayimportdisplay
fromipython.displayimporthtml
idx_to_movie={}
forrowindf_id.itertuples():
idx_to_movie[row[1]-1]=row[2]
idx _ to _电影
k=6
idx=0
movies =[idx _ to _ movie[x]for xinnp . arg sort(similarity _ movie[idx,])[:-k-1:-1] ]
movies = filter(lambdaimdb:len(str(IMDB))= = 6,movies)
n_display=5
url=[0]*n_display
imdb=[0]*n_display
i=0
formovieinmovies:
(url[i],IMDB[I])= get _ post(电影,base_url)
i+=1
图像=
for line range(n _ display):
images+= " float:left;边框:1px纯黑;src= %s />"\
%url[i]
显示(html(图像))
乐趣来了!让我们搜索一部电影,看看四个最相似的推荐。让我们尝试搜索FireWire,第一个在左手边,接下来是四部推荐的电影。
火线是1995年上映的美国犯罪电影,由劳勃·狄·尼诺和阿尔·帕西诺主演。搜索结果看起来不错。但是“离开拉斯维加斯”可能不是一个好建议。我想原因是在电影《闯关东》中有尼古拉斯·凯奇和“摇滚”,这对喜欢“火线”的观众来说是一个很好的推荐。这可能是相似矩阵和协同过滤的缺点之一。让我们尝试更多的例子。
这个看起来不错。《玩具总动员2》绝对应该推荐给喜欢《玩具总动员》的观众。但是阿甘似乎不适合我。显然,因为汤姆·汉克斯的声音出现在《玩具总动员》中,阿甘也被推荐了。值得注意的是,我们可以通过看海报来区分《玩具总动员》和《阿甘正传》,比如电影类型和情感。假设每个孩子都喜欢玩具总动员,他们可能会忽略阿甘。
交替随机梯度下降在前面的讨论中,我们简单地计算了用户和电影之间的余弦相似度,并预测了用户对电影的评价,根据电影推荐了其他电影。现在,我们可以把这个问题看作一个返回问题;给所有电影添加潜在特征y,给所有用户添加权重向量x。目标是最小化由得分预测的均方误差(在2-范数的正则化条件下)。
雷锋提醒:权向量和特征向量都是决策变量。显然,这不是凸函数问题,也不需要太担心这个非凸函数的收敛性。有许多方法可以解决非凸函数的优化问题。一种方法是交替求解权重向量(对于用户)和特征向量(对于电影)。当处理权重向量时,假设特征向量是常数向量。当处理特征向量时,假设权重向量是常数向量。解决这个返回问题的另一种方法是将权重向量和特征向量的更新结合起来,并在同一迭代中更新它们。此外,随机梯度下降可以加速计算。这里,我使用随机梯度下降来解决这个返回问题,我们的均方误差预测如下:
这个均方差比相似矩阵得到的要小得多。当然,我们也可以使用网格搜索和交叉验证来调整模型和算法的参数。看看电影搜索的推荐:
看起来不太好。我认为这四部电影不应该通过搜索“火线”来推荐给我。它们似乎与《火线》没有任何关系。这四部电影浪漫而富有戏剧性。如果我在找一部有大明星的美国犯罪电影,为什么我会想看一部戏剧电影?这让我很困惑——一个好的mse结果可能会给我们一个不相关的建议。
因此,我们讨论了基于协同过滤的推荐系统的弱点。
协同过滤通过使用数据找到相似的用户和电影,这将使流行电影比利基电影更容易被推荐。
因为新发布的电影没有太多的使用数据,期望协同过滤向用户推荐任何新电影是不现实的。
接下来,我们将考虑另一种方法来处理协同过滤问题——通过深度学习来推荐电影。
深入学习,我们将使用vgg16在keras训练神经网络。我们的数据集中没有目标,只有倒数第二层作为特征向量。我们使用这个特征向量来描述数据集中的每一部电影。雷锋。(公开号码:雷锋。com)提醒在训练神经网络之前,需要做一些预处理。培训过程如下。
df _ id = PD . read _ CSV(link . CSV,sep=,)
idx_to_movie={}
forrowindf_id.itertuples():
idx_to_movie[row[1]-1]=row[2]
电影总数=9000
电影=[0]*总计_电影
电影镜头:
ifiinidx _ to _ movie.keys()和len(str(idx _ to _ movie[I])= = 6:
电影[i]=(idx_to_movie[i])
movies=filter(lambdaimdb: imdb!=0,电影)
total_movies=len(电影)
URL =[0]*总计_电影
IMDB =[0]*电影总数
url_imdb={"url":[]," imdb":[]}
i=0
formovieinmovies:
(url[i],IMDB[I])= get _ post(电影,base_url)
ifurl[i]!=base_url+" ":
url_imdb["url"]。追加(url[i])
url_imdb["imdb"]。追加(imdb[i])
i+=1
# url =筛选器(lambda url: url!= base_url+" ",url)
df=pd.dataframe(数据=url_imdb)
total_movies=len(df)
importurllib
poster _ path = "/users/wann Jin/desktop/nycdsa/project _ 5 _pro荐人/海报/"
电影范围(总电影数):
urllib.urlretrieve(df.url[i],poster_path+str(i)+"。jpg”)
from keras . applicationimportvgg 16
from keras . applications . vgg 16 importpreparation _ input
from keras . preprocessing importimageskillage
图像=[0]*总计_电影
x =[0]*电影总数
电影范围(总电影数):
image[i]=kimage.load_img(poster_path+str(i)+".jpg",target_size=(224,224))image[i]=kimage.load_img(海报_path+str(i)+"。jpg ",target_size=(224,224))
x[i]=kimage.img_to_array(image[i])x[I]= ki mage . img _ to _ array(image[I])
x[i]=np.expand_dims(x[i],轴=0)
x[i]=预处理_输入(x[I])
model=vgg16(include_top=false,weights= imagenet)
预测=[0]*电影总数
matrix _ RES = NP . zero([total _ movies,25088])
电影范围(总电影数):
预测(x[i])。拉威尔()
matrix_res[i,]=预测[i]
相似性_深度=矩阵_res.dot(矩阵_res.t)
范数=np.array([np.sqrt(np .对角线(相似性_深度))])
相似性_深度=相似性_深度/规范/规范。t
在代码中,我们首先使用api和imdb id从tmdb网站获取电影海报。然后向vgg16提供海报来训练神经网络。最后,利用vgg16学习的特征计算余弦相似度。在获得电影的相似度后,我们可以推荐相似度最高的电影。vgg16中有25088个学习特性,我们用它们来描述数据集中的每部电影。
让我们看看使用深度学习的电影推荐系统。
爱情剧不再出现导火线!这些电影海报有一些共同的特征:深蓝色,上面的人物,等等。让我们再试一次玩具总动员。
阿甘不会再被推荐了!结果看起来不错。我感到非常欣慰。让我们试试别的!
请注意,这些海报中有一两个人,他们的主题风格是冷色。
这些海报想让观众知道相应电影的气氛是愉悦和紧张的,而且有很多动作镜头,所以海报的色彩也很浓。
与最后一组不同,这些海报想告诉观众这些电影是关于一个单身汉的。
我们发现了一部类似《功夫熊猫》的电影。
这个小组非常有趣。一群和汤姆·克鲁斯相似的怪物!
所有这些海报都有姿势相似的女性。等等,那是奥尼尔!?
成功找到蜘蛛侠!
这些海报的布局设计非常接近。
结论
在推荐系统中有几种使用深度学习的方法:
无监督学习
协同过滤的潜在特征预测
深度学习产生的特征被用作辅助信息
电影海报有视觉元素来创造噱头和兴趣。在这个项目中,我们使用无监督的深度学习通过海报来学习电影的相似性。显然,这只是在推荐系统中使用深度学习的第一步,我们可以尝试很多东西。例如,我们可以使用深度学习来预测协同过滤产生的潜在特征。Spotify的音乐推荐也使用了类似的方法,不同于图像处理。他们使用深度学习通过处理歌曲的声音来预测协同过滤的潜在特征。还有另一个可能的方向。通过深度学习获得的特征被用作辅助信息以提高预测的准确性。
雷锋编辑的《生命科学》
“张量流&神经网络算法高级应用类”已经开始!
从初级到高级,理论+实战,一站式深入了解张量流!
本课程面向深入学习的开发人员,教授如何使用张量流解决特定问题,如图像识别和文本分析。为期10周的课程将从张量流的原理和基本实践技能开始,逐步教会学生如何在张量流上构建cnn、自编码、rnn、gan等模型,最终掌握一套基于张量流的深度学习和发展的专业技能。
作为思想工作的高级技术专家,童达和白华川两位教师在构建大数据平台和开发深度学习系统方面有着丰富的经验。
时间:每周二和周四晚上20: 00到21: 00
课程时长:共20小时,10周完成,每周2次,每次1小时
在线教学地址:lae iphone/special/custom/mooc 04
相关文章:
从理论到实践,本文详细阐述了人工智能推荐系统的三种算法
雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。
来源:搜狐微门户
标题:如何用深度学习推荐电影?教你做自己的推荐系统!
地址:http://www.shwmhw.com/shxw/61413.html