基于用户的音乐推荐平台
摘 要
随着信息技术和互联网的飞速发展,信息过载问题日益严重,在这样的前提下,个性化推荐的研究也越来越重要。音乐平台推荐系统中最核心的技术就是推荐算法,它在很大程度上左右着音乐平台推荐系统性能的好坏。协同过滤是利用最广泛的推荐算法之一。协同过滤大致可以分为基于用户行为为基础的协同过滤和基于物品关联特征的协同过滤两种。在本论文中,研究了基于用户行为为基础的协同过滤推荐算法以及该算法在音乐平台中的使用,设计开发了针对音乐平台的个性化推荐原型系统,提升了音乐平台对用户的个性化服务。 详细介绍了推荐系统现状和基于用户行为为基础的协同过滤推荐算法在音乐平台的应用的步骤。
关键词:音乐平台;基于用户;协同过滤推荐算法
目 录
1.1 课题产生的背景及意义
1.1.1 课题产生的背景
在网络还不发达的年代,人们的休闲娱乐方式很单一也很匮乏,随着互联网技术的飞速发展,数字音乐已经进入到人们的生活当中,而面对音乐数据库里数以百万、千万的音乐曲目,我们不可能让用户听完后再决定喜欢哪些歌曲。各种不同的的音乐曲目让人不知如何选择,人们找到自己喜欢听的音乐需要花费大量的时间,这无疑会导致淹没在信息过载问题中的用户不断流失。为了解决这些痛点问题,个性化的音乐推荐平台应运而生。
个性化音乐推荐系统是一种基于海量数据挖掘的智能平台,它帮助音乐平台为其用户提供完全个性化的服务,并能给音乐平台带来巨大的经济效益。一个好的个性化推荐系统可以发现用户喜欢的音乐并推荐给用户。如果用户打开音乐平台,就可以找到自己喜欢的音乐,这将节省用户大量的时间和精力,这样的音乐平台肯定会受到用户的青睐。一个好的个性化推荐系统在用户提供便利同时,也提高了用户与平台之间的粘合程度,避免了用户流失,并提高了音乐平台的占有率和竞争力。
1.2 推荐系统研究现状
随着互联网的快速发展,推荐系统逐渐引起越来越多研究者的关注。国外对推荐系统的研究上起步比较早。在2000年,计算机协会ACM主办了对个性化推荐系统研究的专刊,个性化推荐系统开始飞速发展。在2006年10月,DVD租赁公司Netflix组织了一场比赛,奖励使推荐系统准确率提升10%的组织或个人100万美金。这次比赛吸引了来自世界各地的对之感兴趣的人,极大的推动了对个性化推荐系统的研究,人们开始逐渐地认识到了推荐系统在平台应用上起到的重要作用。
国内推荐系统的研究虽然比国外晚,但是发展及应用的速度很快,像抖音快手等短视频app正是通过提供个性化推荐而获得了巨大的成功。然而,推荐系统在音乐平台的应用方面还很欠缺,主要表现在:
(1) 推荐缺乏个性化:目前,很多推荐都是普遍广泛地向所有用户推荐,没有实现个性化的推荐,结果是大部分推荐结果都不是用户喜欢的内容,导致用户忠诚度低是推荐系统最主要的缺陷。
(2) 自动推荐不完善:大多数推荐功能需要积累一些用户行为,用户需要对自己感兴趣的内容进行标记才能得到结果。此外,系统不能每次都保存用户输入的信息。大多数推荐策略基本停留在搜索层面,不能实现自动推荐。
(3) 推荐方法单一:大多数推荐系统使用分类浏览和基于内容的检索作为推荐方法,多种推荐方法的组合应用相对缺乏,特别是个性化和非个性化推荐方法的混合应用。
2.1 相关研究文献介绍
国内对推荐系统的研究文献有很多,关于推荐系统地研究可以看到:王国霞在《个性化推荐系统综述》[1]中介绍了用户建模、推荐对象的建模和推荐算法等几项关键技术;杨杰在《个性化推荐系统应用及研究》[2]中提出了基于网络稠密度的用户兴趣漂移检测方法,提高了推荐系统的精确程度;许海玲,吴潇在《互联网推荐系统比较研究》[3]中讨论了推荐系统的具体定义并对各种主要的推荐算法进行了对比分析,项亮在《动态推荐系统关键技术研究》[4]中根据大量公开的用户行为数据集对推荐系统动态特性进行了深入的研究,分析了评分预测用户兴趣的模型;任磊在《推荐系统关键技术研究》[5]中分析了影响推荐系统发展的相关因素。
2.2 相关技术的介绍
基于用户的协同过滤算法 [6]是推荐算法中应用最为广泛,它是根据有相似喜好的用户的兴趣爱好去预测目标用户对某项目的喜好。该算法首先利用统计技术找到与推荐目标用户具有相同偏好的相似用户,然后根据相似用户的偏好生成推荐给目标用户。它的基本原理找到相似用户的喜好内容中目标用户没有的喜好内容,并将该内容推荐给目标用户。系统通过其用户行为记录及特定相似度计算函数,计算出与该用户行为(试听,添加到播放列表,下载等)将最近的n个用户作为相似用户集,取出相似用户访问但目标用户未访问的资源,生成推荐集。然后,计算集合中每个资源对用户的推荐度,将前k个资源按照推荐度降序排序后作为用户的推荐集合。
(1)建立用户模型
协同过滤算法处理的数据通常是一个m * n user-item得分矩阵R,代表用户u对物品i的评分。由于用户评分的项目不多,该矩阵通常会是一个稀疏型的,因此本文的评分值包括隐性评分和显性评分。隐性得分是用户浏览次数、试听次数、下载次数等隐性用户行为转换而来的得分,显示得分是用户直接对曲目的评价得分。
图 2-1 评分矩阵
(2)寻找相似用户
在这个过程中,我们主要搜索与目标用户有相似偏好的用户。通过计算目标用户和其他用户之间的相似度来计算与目标用户最相似的用户集合。即:为目标用户i生成一个以相似度sim(i,j)递减排列的用户集合。这个过程分两步完成:首先计算用户之间的相似度,可以使用皮尔森相关系数[7]、余弦相似性[8]和修正的余弦相似性等度量方法。其次,根据以下方法选择相似用户:选择相似度最大的前k个用户;选择相似度大于指定阈值的k个用户。通常有三种方法可以找到相似的用户:
①余弦相似性
每个用户的分数可以当作是n维项目空间中的一个向量,如果用户未对该曲目进行任何操作,则用户对该曲目的评分将设置为0。向量之间的余弦角度可以衡量用户间的相似度。例如,用户i和用户j的分数分别表示为N维项目空间中的向量向量和向量,则用户i和 用户j之间的相似度sim(i,j)为:
(2-1)
式(2-1)中,两个用户向量模的乘积为分母,两个用户评分向量的内积为分子。
②相关相似性
假设用户i和用户j共同打分过的条目集合用表示,,那么用户i和用户j之间的相似读sim(i,j)用Pearson相关系数度量:
(2-2)
其中,表示用户i对项目d的评分,、分别表示用户i和用户j对所打分项目的平均评分。
③修正的余弦相似性
修正后的余弦相似性度量方法是通过减去用户对项目的平均评分的方法来改善原度量方法中没有考虑不同用户的评分尺度的问题。设为用户i和用户j共同评过分的项目集合,,表示用户i评分过的项目集合,和表示用户j评分过的项目集合,则用户i和用户j的相似性sim (i,j)为:
(2-3)
其中, 表示用户i对项目d的评分,表示用户i对项目的平均评分,表示用户j对项目的平均评分。本系统选择相似度为前十的用户作为最近邻居。 本文在原型系统中采用的是余弦相似性计算的用户相似性,选出十个最近邻居。
(3) 产生推荐项目
计算方法如下:
(2-4)
式(2-4)中sim(i,j)表示用户i与用户j之间的相似性,表示用户i的平均评分,表示用户j的平均评分,表示相似用户j对条目d的评分,公式(2 - 4)的本质是,用户在NESi相似用户集中查找到的用户与目标用户的相似度的值作为权重值, 然后对邻居用户给出的项目得分与邻居用户给出的所有其他得分之间的差值进行加权平均。目标用户对没有评价项目的评分可以用上述计算方法预测出来,然后把预测的评分排序,提取评分中最高的前N名,并推荐给目标用户。
图2-2 基于用户的协同过滤推荐过程
基于用户的协同过滤方法充分利用了人们的社会属性和从众心理被大量得研究和应用证明,它能推荐项目,更符合用户的利益,同时,它还可以发现用户的潜在兴趣和扩大推荐项目的覆盖率。
预测误差的精度方法主要针对评分模型,包括均方根误差(RMSE)[9]。设T是评分记录集,代表用户u对项目I的实际得分,代表用户u对项目的预测得分,则RMSE计算公式为:
(2-5)
人们普遍认为,RMSE增加了对不准确预测的惩罚,因此对系统提出了更严格的要求,RMSE越小,模型越准确。
推荐结果的采纳程度可以通过精确度和召回率来衡量。对于音乐推荐系统,准确率是用户能够接受的推荐歌曲的比例,召回率是用户收听系统推荐的音乐的比例。用代表系统为用户u推荐的音乐列表,代表进行推荐过后,用户u收听过的音乐,U代表所有用户,则准确率为:
(2-6)
召回率为:
(2-7)
3.1 系统简介
推荐系统通用模型如图3-1所示
图3-1推荐系统通用模型
本论文涉及的音乐推荐平台的目标是为在线音乐用户提供个性化的推荐服务,收集和分析用户在听音乐时的行为,帮助用户找到可能感兴趣的歌曲,并自动生成音乐播放列表。结合通用模型和本系统实际,系统的主要功能介绍如下。
系统对象包括用户、歌手、歌曲等,相关信息的维护是系统的重要功能,是推荐生成的基础之一,用户填写的用户注册信息,如姓名、注册时间和系统管理员添加的歌手资料、歌曲信息等是信息展示的重要数据来源。
在注册和使用期间,用户可以设置他们喜欢和不喜欢的音乐风格、歌手、乐器和其他信息。在访问音乐服务的过程中,用户可以便捷地查看自己填写的信息并进行修改。根据这些信息,该系统还可以向用户推荐符合他们兴趣的音乐,并避免推出用户不喜欢的歌手的曲目。
这部分的收集、储存、用户的行为数据,当用户在收听期间产生新的行为时,例如试听一首歌、跳过一首歌、收集专辑等,将数据保存到数据库中,并为用户提供访问他们的收听记录的功能,统计用户听过哪些歌手的歌曲,听了多少次,被标记为“喜欢”和“讨厌”的歌曲有哪些等等。
推荐部分是系统的核心,它利用上述信息对用户和歌手进行建模,寻找用户偏好和推荐用户的特征,计算用户从未听过但可能喜欢的歌手,对这些,对这些歌手进行分析加工过滤,最后生成个性化的推荐列表,并推送给用户。该部分还具备以下功能:
①实时或接近实时的推荐。用更新的数据更新用户、歌手和歌曲的模型,以便信息变化可以实时或接近实时地反映在系统中,并相应地更新推荐列表。
②定期更新模型。根据一定的时间间隔,对用户新生成的行为数据进行处理,根据统计评分模型将这些数据转换为歌手和歌曲的得分,并更新对象模型。
③有一定的推荐新歌手和歌曲的能力,并为新用户提出建议,即“冷启动”的处理能力。此功能可用于根据用户定义的信息和行为数据为用户添加标签,以获得流行的推荐和其他解决方案,用户填写的“喜欢”和“讨厌”内容为系统提供了重要的推荐参考。对于大量用户来说,流行内容的推荐在一定程度上可以满足需求。
系统需要保存推荐日志和用户对这些推荐的反馈,以便分析系统推荐的效果和推荐策略的有效性,作为改进系统的基础。
3.2 系统简介
图3-2系统架构图
系统总体架构内容如图3-2所示,图3-2中的虚框部分为前台页面部分,不包含在推荐系统中。
接下来,对每个部分分别进行介绍。因为基本信息和反馈收集层只包含数据输入和维护的工作,所以这里不做赘述。
数据模型层的作用是将原始数据进行类型和格式的转换,使其符合推荐系统的要求。用户的音乐收听和收集数据不能直接用于生成推荐,因此有必要进行数据的转换并建立合适的用户数据模型。
表示用户模型的方法有很多种,如user-item评分矩阵、基于向量空间的模型等。User-item评分矩阵模型用一个矩阵表示,其中m为用户数量,n为物品数量,矩阵中每个数据表示用户对相应物品的评分。
本文采用的是把数据集转化成一个用户评分矩阵MA,MA(i,j)表示用户i收听歌手j的评分,按收听次数降序排序,排名前20%的记5分,40%一60%之间的记为4分,60%一80%之间的记为3分,80%以上的记1分。MA(i,j)也表示用户i收听曲目j的评分,用户对曲目的评分按照事件类型:试听记为0.25分,收藏记为1分,添加到播放列表记为1分,喜欢记为1.25分,下载记为1.5分
推荐引擎在数据模型的基础上进行计算,产生推荐列表。本系统采用的是协同过滤推荐算法,综合考虑各算法优缺点过后,用SVD算法[10]构建推荐引擎。
推荐模块主要是处理用户行为日志,建立用户、物品数据模型,训练预测模型,生成预测模型所需的各种数据文件,为用户推荐可能感兴趣的歌手和音乐。系统首先收集用户行为记录,如收听、收藏、评分等,存入数据库备用,本文只对用户行为进行处理。然后把这些行为转换为对音乐的评分,生成用户-物品评分矩阵,再结合用户配置文件和歌曲属性信息进行推荐,把推荐结果推送给用户。最后用户会对推荐结果作出一定的反馈,这些反馈结果又形成用户行为记录。
用户在收听在线音乐的时候,对音乐的各种行为可以反映出用户对音乐和歌手的偏好,在收集用户反馈的时候,综合用户的所有行为数据,便可分析出对歌手的喜好程度。我们可以给每一类操作赋予一定的分值,用户对每首歌曲、每个歌手产生行为过后加上相应分值,进行推荐时,把这些分值换算为评分。推荐算法设计框图见图3-3。
图3-3音乐推荐算法框图
这部分可以根据用户的行为即时地作出反应,也可以先收集用户数据,留待线下计算处理。由于该模块处理的数据量相当大,而且包含大量的I/O操作,比较耗费计算资源,很多产品都采取的线下计算的方式,设置一个运行时间间隔,每经过一个时间间隔计算一次。但用户收听音乐过程中,要求系统能即时作出反应。假如系统为一个用户推荐了歌手A,而用户恰恰不喜欢这位歌手的歌,多次跳过该歌手的歌,如果系统不即时更新用户偏好信息,还向该用户推荐歌手A的歌,那么这样的系统肯定不会受到用户欢迎。基于此,音乐推荐系统采取线下计算和实时计算相结合的方法,每一定时间间隔计算一次用户、物品信息,当用户有反馈时,对数据作适当更新。
接口层负责系统与前台程序的通信。因为系统运行在后台,计算出的数据需要传递给前台展示,用户对推荐结果的反应情况也通过前台获取传回,接口层的工作就是为前台调用提供所需数据,将前台传来的用户反馈数据交由反馈收集层存储备用,数据以数组的形式进行传递,如使用SVD算法为用户uid推荐的用法为:
svd.GetRecForUser(uid,iidRec,n,fp);
iidRec是返回的数据,n表示数据记录最大长度,fp是返回数据输出的文件,可设置为NULL。
存储层用于存储系统使用和产生的数据,主要包括用户、歌手、歌曲的基本信息,数据模型信息,用户行为信息,推荐日志和用户反馈等。MySQL是一个开源数据库系统,这一特点加上较好的性能,使之成为很多网站的后台数据库,本系统也选择使用MySQL数据库,包括以下几个部分:
(1)系统对象信息采集
系统对象包括用户、歌手、歌曲等。用户信息主要是用户在注册时填写的内容,包括姓名、性别、年龄、学历、注册时间等,具体表设计如下。
表3-1用户信息表user
字段名 | 类型 | 说明 |
id | int | 用户ID |
signup | date | 注册时间 |
gender | char(1) | 性别 |
birthday | date | 生日 |
name | char(60) | 真实姓名 |
country | char(80) | 用户国籍、地域 |
diploma | char(60) | 学历 |
歌手、歌曲表主要保存一些基木信息,如下表所示:
表3-2歌手信息表artist
字段名 | 类型 | 说明 |
id | int | 歌手ID |
gender | char(1) | 性别 |
name | char(255) | 歌手姓名 |
country | char(80) | 歌手国籍、地域 |
plays | int | 歌手所有歌曲播放次数 |
tracks | int | 歌曲数 |
intro | char(255) | 简介 |
表3-3歌曲信息表track
字段名 | 类型 | 说明 |
id | int | 歌曲ID |
aid | int | 歌手ID |
name | char(120) | 歌名 |
album | char(80) | 所属专辑 |
plays | int | 歌曲播放次数 |
intro | char(255) | 简介 |
表3-4歌曲标签信息表tag_track
字段名 | 类型 | 说明 |
id | int | 记录ID |
tid | int | 歌曲ID |
tag | char(30) | 标签 |
cnt | int | 歌曲tid被打该标签的次数 |
synonym | Char((60) | 该标签的同义词 |
(2)用户行为记录
推荐系统中对算法用处最大的也就是用户行为记录,主要包括用户对歌手、歌曲的浏览、收听、收藏、加入播放列表、喜欢和不喜欢,以及用户为歌手、歌曲打上的标签等。
表3-5用户-歌曲关系表user_track
字段名 | 类型 | 说明 |
id | int | 记录ID |
uid | int | 用户ID |
tid | int | 歌曲ID |
type | int | 操作类型 |
time | int | 操作产生时间 |
表3-6 用户-歌手关系表user_artist
字段名 | 类型 | 说明 |
id | int | 记录ID |
uid | int | 用户ID |
aid | int | 歌手ID |
type | int | 操作类型 |
time | int | 操作产生时间 |
表3-7用户-歌曲标签表tag_user_track
字段名 | 类型 | 说明 |
id | int | 记录ID |
uid | int | 用户ID |
tid | int | 歌曲ID |
tag | char(30) | 标签 |
time | int | 操作产生时间 |
表3-8歌曲收听统计表stat_track
字段名 | 类型 | 说明 |
uid | int | 用户ID |
aid | int | 歌手ID |
tid | int | 单曲ID |
plays | int | 单曲重复播放次数 |
time | int | 最后一次收听时间 |
表3-9歌手评分表rate_artist
字段名 | 类型 | 说明 |
uid | int | 用户ID |
aid | int | 歌手ID |
plays | int | 用户收听该歌手的次数 |
rate | int | 评分 |
time | int | 评分时间 |
(3)推荐日志
推荐结果是否有效,最终要通过用户对这些推荐项目的接受与否来反映,包括系统为用户推荐了什么,用户对推荐列表进行了什么操作,是收藏还是根本连点击都没有。
表3-10推荐日志表log_rec
字段名 | 类型 | 说明 |
id | int | 记录ID |
uid | int | 用户ID |
aid | int | 为用户推荐的ID |
time | int | 推荐产生时间 |
表3-11用户对推荐结果的反馈日志表feedback
字段名 | 类型 | 说明 |
id | int | 记录ID |
uid | int | 用户ID |
rid | int | 推荐ID |
action | int | 用户推荐结果采取的行为 |
time | int | 操作产生时间 |
4.1音乐管理功能的实现
该平台的设计主要分为前台功能模块,和后台功能模块。 前台主要是针对广大音乐用户,后台主要是管理员对整个网站平台进行管理。
前台用户主要针对广大音乐需求用户。 网站用户未在该网站进行注册登录的时候,只能在该网站浏览相关信息,不能进行其他操作。如果用户想要在该网站留言、收藏歌曲,必须先进行注册登录。
(1) 登录注册界面设计
用户在进行相关权限执行之前, 必须在网站上进行注册, 注册登录成功之后,网站系统根据用户的登录,进行相关页面的跳转,然后用户可以执行相关权限。
登录注册页面设计效果如下图:
图 4-1 用户注册界面
图 4-2 用户登录界面
(2)前台主界面设计
前台用户主要针对广大音乐爱好者需求用户, 网站用户在网站登录界面进行登录,在前台主界面可以进行歌曲查询,根据导航进行相关页面的跳转。
图 4-3 前台主界面
(3) 留言功能模块设计
用户在网站注册登录之后, 即可根据需要进行相关留言, 进入留言界面填写留言内容提交即可,设计效果如下图:
图 4-4 留言功能界面
网站后台主要是实现整个网站的管理,主要通过管理员执行。管理员通过后台登录界面进入到后台管理界面,进行音乐管理、用户管理、留言管理、音乐类别管理、 留言管理等操作。后台管理界面设计如下:
图 4-5后台管理主界面
(1)用户管理功能
管理员进入到后台之后可以通过用户管理进行管理员和用户信息的管理,可以点击管理员管理进行管理员的密码修改操作,点击管理员管理操作即浏览或删除该管理员信息。
(2) 音乐类别管理功能
类别管理主要是对音乐类别进行增删改操作
(3) 留言管理功能
留言管理主要实现用户提交的留言的回复、查看及删除操作, 设计实现效果
现有的推荐系统多是利用用户对物品的评分数据,来作评分预测,但在线音乐用户很少会对单曲或者歌手进行评分,大多数的都是收听、收藏等隐式反馈数据。因此,在进行推荐计算之前,首先对数据进行预处理。利用这些反馈数据,通常要统计用户的行为记录和歌手的收听次数,并按一定的规则转化为评分。
数据预处理模型的功能代码实现:
bject ALSRecommend {
def main(args: Array[String]): Unit = {
//数据源输入路径
val inputPath = args(0)
//创建 sparksession
val spark = SparkSession
.builder
.appName("ALSBaseUser")
.master("local[*]")
.getOrCreate()
val allLogs: DataFrame = spark.read.json(inputPath)
//创建临时表
allLogs.createTempView("all_user_tid")
//过滤数据源为空的脏数据
val filtered = spark.sql(
"""
|SELECT uid, tid, type FROM all_user_tid WHERE uid IS NOT NULL AND tid IS NOT NULL AND type IS NOT NULL
""".stripMargin)
filtered.createTempView("v_filtered")
//提取type = 1,2,3,4,5
val filteredEventType12345 = spark.sql(
"""
|SELECT uid, tid, type FROM v_filtered WHERE type IN (1,2,3,4,5)
""".stripMargin)
filteredEventType12345.createTempView("filtered_type_12345")
//读取数据库,关联得分
//导入隐式转换
import spark.implicits._
//1:试听:2:收藏,3:添加到播放列表:4:喜欢:5:下载
//试听记为0.25分,收藏记为1分,添加到播放列表记为1分,喜欢记为1.25分,下载记为1.5分
val rulesDataset = spark.createDataset(List((1, 0.25), (2, 1.0), (3, 1.0), (4, 1.25), (5, 1.5)))
val scoreDF = rulesDataset.toDF("e_type", "score")
scoreDF.createTempView("v_score")
//关联得分
val uidTidSocre = spark.sql(
"""
|SELECT uid, tid, score FROM v_score JOIN filtered_type_12345 ON (type = e_type)
""".stripMargin)
uidTidSocre.createTempView("v_uid_tid_score")
//将得分进行累加(用户和商品id分组)
val result = spark.sql(
"""
|SELECT uid, tid, SUM(score) score FROM v_uid_tid_score GROUP BY uid, tid
""".stripMargin)
val res: DataFrame = result.map(row => {
val uid = row.getAs[String]("uid")
val tid = row.getAs[String]("tid")
val score = row.getAs[Double]("score")
(uid.hashCode, tid.hashCode, score)
}).toDF("uid", "tid", "score")
res.write.saveAsTable("uid_tid_score")
spark.stop()
}
}
预测误差的评价方法主要针对评分模型,我们采用均方根误差(RMSE)。通常,较低的RMSE优于较高的RMSE。
预测误差功能实现代码:
object ALSExample {
//封装数据,支持模式匹配、默认实现序列化
case class Rating(uid: Int, tid: Int, rating: Float)
def transformRating(str: String): Rating = {
val uidTidRating = str.split("::")
assert(uidTidRating.size == 4)
Rating(uidTidRating(0).toInt, uidTidRating(1).toInt, uidTidRating(2).toFloat)
}
//程序执行的入口
def main(args: Array[String]) {
val spark = SparkSession
.builder
.appName("ALSBaseUser")
.master("local[*]")
.getOrCreate()
import spark.implicits._
//数据源输入路径
val inputPath = args(0)
//读取数据源转化为Rating类
val ratings = spark.read.textFile(inputPath)
.map(transformRating)
.toDF()
//对读取的数据随机分割,80%为训练样例,20%为测试样例。
val Array(training, test) = ratings.randomSplit(Array(0.8, 0.2))
//Spark提供的ALS,必须传入用户的ID、歌曲ID、评分
val als = new ALS()
.setMaxIter(5) //迭代次数,最大值好像不能>=30,否则会Java Stack Overflow 错误。
.setRegParam(0.01) //正则化参数,使每次迭代平滑一些
.setUserCol("uid") //设置用户的id
.setItemCol("tid") //设置歌曲id
.setRatingCol("rating") //设置评分
//调用算法开始训练,得到一个模型
val model = als.fit(training)
model.setColdStartStrategy("drop")
//用得到的模型对测试数据进行预测
val predictions = model.transform(test)
val evaluator = new RegressionEvaluator()
.setMetricName("rmse")
.setLabelCol("rating")
.setPredictionCol("prediction")
//计算出错误率,rmse越小准确率越高
val rmse = evaluator.evaluate(predictions)
spark.stop()
}
}
本文调用spark的ALS算法,基于RDD之上来构建音乐平台的推荐模块。本文只对音乐曲目进行推荐,对歌手的推荐这里不再赘述。
推荐模块的功能实现代码
object ALSExample {
//封装数据,支持模式匹配、默认实现序列化
case class Rating(uid: Int, tid: Int, rating: Float)
def transformRating(str: String): Rating = {
val uidTidRating = str.split("::")
assert(uidTidRating.size == 3)
Rating(uidTidRating(0).toInt, uidTidRating(1).toInt, uidTidRating(2).toFloat)
}
//程序执行的入口
def main(args: Array[String]) {
val spark = SparkSession
.builder
.appName("ALSBaseUser")
.master("local[*]")
.getOrCreate()
import spark.implicits._
//数据源输入路径
val inputPath = args(0)
//读取数据源转化为Rating类
val ratings = spark.read.textFile(inputPath)
.map(transformRating)
.toDF()
//对读取的数据随机分割,80%为训练样例,20%为测试样例。
val Array(training, test) = ratings.randomSplit(Array(0.8, 0.2))
//Spark提供的ALS,必须传入用户的ID、歌曲ID、评分
val als = new ALS()
.setMaxIter(5) //迭代次数,最大值好像不能>=30,否则会Java Stack Overflow 错误。
.setRegParam(0.01) //正则化参数,使每次迭代平滑一些
.setUserCol("uid") //设置用户的id
.setItemCol("tid") //设置歌曲id
.setRatingCol("rating") //设置评分
//调用算法开始训练,得到一个模型
val model = als.fit(training)
model.setColdStartStrategy("drop")
//给每一个用户推荐他可能最喜欢的10首音乐
val userRecs = model.recommendForAllUsers(10)
userRecs.write.json("C:\\Users\\zla\\Desktop\\user2")
spark.stop()
}
}
5.1总结
当前互联网的迅速发展使音乐平台的竞争日益激烈。为了提高用户的使用满意度,实现较强的用户粘性,各音乐平台均在探讨音乐平台如何对用户进行有效地个性化推荐,帮助用户缩短曲目寻找时间,提高用户体验。基于上述问题本文针对音乐平台的用户体验问题,提出了面向音乐平台的个性化推荐系统,并对该系统进行了全面的剖析和实现,不仅解决了具有行业特色的技术问题并且实现了关键算法功能模块。 本文介绍了音乐平台的个性化推荐系统的主要功能,使用按功能划分的系统设计方法,通过协同过滤算法以及数据挖掘技术实现了音乐平台个性化推荐系统的开发。
本文主要研究内容与成果有:
① 本系统中的代码核心算法是spark中mlib包中自带的ALS算法[11],底层按照MapReduce 的编程方式,将算法的结构抽象为Map 与 Reduce的计算结构,这种结构的特点是具备良好的处理海量数据的能力,能够对大量数据进行同时运算。
② 本系统中还提出了将算法模块化的思想,方便灵活的对算法进行配置,方便算法的新增以及替换,增加了系统的可扩展性以及灵活性。
③ 本系统在不仅在算法上给出了详细的分析和介绍,在系统的设计与实现上着重体现系统在实施过程中的可行性和现实性。
本文的不足之处有:
① 系统算法流程总体运行时间长,不能实现实时处理,只能离线处理数据,产生一天左右的数据延迟。
② 采用的算法和结构都比较传统,没有对算法做出大的创新。
5.2展望
本文实现的面向音乐平台的个性化推荐系统做了较大的改进,达到了一定的效果,但是还不够完善,还需要在个性化推荐领域中不断的研究。随着分布式计算技术的发展,如何更加有效提高算法运算速度是一个发展方向,可以在日后工作中进行钻研。关于有效推荐的实时性,也将是个性化推荐领域的一个发展方向。音乐平台个性化推荐系统也会在运营实施过程中不断改进和完善,逐渐提高推荐的时效性和准确性。随着技术的不断发展以及业务需求的不断增加,对于系统的要求也将越来越高,还需要在今后的工作中不断的创新和完善。我们也相信音乐平台个性化推荐系统会为用户推荐用户喜欢的曲目。
[1] 王国霞 . 个性化推荐系统综述.[J]. 计算机工程与应用,2012,(48): 4-5.
[2] 杨杰. 个性化推荐系统应用及研究 [D]. 中国科学技术大学, 2009.8-10.
[3] 许海玲 , 吴潇. 互联网推荐系统比较研究 [D]. 中国科学院, 2009. 357-359.
[4] 项亮. 动态推荐系统关键技术研究. [J]. 计算机光盘软件与应用, 2012,(21):32-35.
[5] 任磊. 推荐系统关键技术研究 [D]. 华东师范大学, 2012.43-46.
[6] 陶俊,张宁 . 基于用户兴趣分类的协同过滤推荐算法 [D]. 上海理工大学管理学院, 2012. 6-8.
[7] 张小红. 协同过滤中的相似性度量方法的研究.[J]. 上海理工大学, 2012,(10): 50-51.
[8] 陈志方. 基于皮尔森相关系数的分析 [D]. 对外经济贸易大学,
2014.18-20.
[9] 吴芸芸,朱建军,左廷英 . RMSE的平方与平滑度的线性组合.[J]. 中南大学地球科学与信息物理学院,2012,(10): 1-2.
[10] 陈清浩 .基于SVD的协同过滤推荐算法研究. [J]. 西南交通大学,2015,(06): 22-26.
[11] 陈鹏 . 基于Spark的协同过滤推荐系统的设计与实现 [D]. 电子科技大学,2018.11-13.
时光飞逝,岁月如梭,转眼间就已经踏入了毕业的大门,回首往昔,奋斗和辛劳成为丝丝记忆,甜美与欢笑仍然历历在目。
中国石油大学优良的学习风气让我受益终生,值此毕业论文完成之际,我谨向所有爱护、关心、帮助我的老师和同学们表示最诚挚的感谢和最美好的祝愿。
本论文是在我的导师李博老师悉心指导下完成的,他在论文撰写过程中给予我悉心的关怀和耐心的指导,这次论文写作使我受益匪浅,将对我整个学习生涯以及工作生涯产生巨大的影响。 再次,向我的导师李博表达最真挚的感谢。
最后,感谢中国石油大学所有相关的领导及老师们,在课题的开题、初稿期间所提出的宝贵意见,在课题研究期间对我的帮助和指导,感谢中国石油大学对我的培养!