基于sSVD模型的歌曲作品推荐
发布时间:2019-05-31 浏览次数:99
作者:徐安、徐靖宇
1 引言
1.1 背景
互联网的出现和普及给用户带来了大量的信息,满足了用户在信息时代对信息的需求,但随着网络的迅速发展而带来的网上信息量的大幅增长,使得用户在面对大量信息时无法从中获得对自己真正有用的那部分信息,对信息的使用效率反而降低了。推荐系统便应运而生,它是根据用户的信息需求、兴趣等,将用户感兴趣的信息、产品等推荐给用户的个性化信息推荐系统。
我们最熟悉的推荐系统的案例应该是亚马逊的推荐系统,亚马逊前首席科学家Andreas Weigend曾坦言,亚马逊有20%-30%的销售都是来源于推荐系统;而另一个使用推荐系统比较早的公司是Netflix,一家线上电影租赁公司,他们宣称有60%左右的会员会根电影的推荐名单来制定租赁顺序。对于用户而言,当购物,旅游甚至是浏览网页时经常会遇到什么猜你喜欢,向你推荐,买了还买等等,这都是推荐系统的一些不同的名称。以亚马逊APP为例,我在在上面搜索了某一领域的的书籍书籍,发现它会向我们推荐两中类型的书单,第一种是与我们搜索的东西完全不相书籍,这些书应该是一些畅销书(有很大一部分用户会购买),因此它会向我推荐;另一种是与搜索书籍属于同一领域的书,因此这是根据用户的浏览购物习惯而进行的推荐,从而满足用户的需求实现一个非常个性化的推荐。因此,我们可以看到,一个好的推荐系统,一方面对于公司来说可以提高公司利润,降低边际成本,增强用户粘度,另一方面对于用户来讲可以提高用户体验。
1.2 LFM模型
最常用的推荐模型是隐语义模型(LFM)。其基本思想是这样,现在有一个用户对电影的评分矩阵(表1.1),称它为R,这个矩阵的行表示用户,列表示电影,矩阵中的每一个值都是用户对电影的评分值。不失一般性,评分值取为-1,0,1,分别表示喜欢,中立和不喜欢,例如表中第一个的值为1,表示用户1喜欢风之谷这部电影。LFM要做的事情是讲这个评分矩阵进行分解,分解成两个矩阵,其中一个矩阵(表1.3)表示的每部电影对隐因子的隶属程度,称之为矩阵Q,这里的隐因子可以理解为电影所属的流派。我们把这些四部电影分为了两个大的类别,一个类别是冒险类,另一类别是爱情类。矩阵中1表示属于,0表示不属于。另一个矩阵(表1.2)我们称为P表示的是用户对不同隐因子的偏好程度,1表示喜欢。从而,评分矩阵中的每一个值都可以写成是两个矩阵的对应位置的乘积,即。
表1.1评分矩阵 表1.2用户隐因子矩阵
|
| 风之谷 | 幽灵公主 | 起风了 | 哈尔城堡 |
|
| 冒险 | 爱情 |
| 1 | 1 | 1 | 0 | 0 |
| 1 | 1 | 0 |
| 2 | 1 | 1 | 0 | 0 |
| 2 | 1 | 0 |
| 3 | 1 | 1 | 1 | 1 |
| 3 | 1 | 1 |
| 4 | -1 | -1 | 1 | 1 |
| 4 | -1 | 1 |
| 5 | -1 | 1 | 1 | 1 |
| 5 | -1 | 1 |
表1.3商品隐因子矩阵
|
| 风之谷 | 幽灵公主 | 起风了 | 哈尔的移动城堡 |
| 冒险 | 1 | 1 | 0 | 0 |
| 爱情 | 0 | 1 | 1 | 1 |
但是,在现实生活中我们会遇到两个主要问题,首先,隐因子我们并不知道是什么,因此P和Q是未知的,需要我们当作参数来进行估计。另一是评分矩阵并不是一个实矩阵而是一个非常稀疏的矩阵,即只有少数位置有评分值,大部分值是未知的。因此在估计P,Q时我们遵循的规则是P,Q的乘积与已有观测值尽可能的相近。即最小化下列目标函数:
其中表示已有观测个数,
、
表示惩罚项,
、
表示惩罚系数。
1.3 问题
LFM模型虽然可以完成个性化推荐,但是却存在两个明显的问题。第一,LFM模型只用到了评分矩阵中的信息,但是大部分时候用户的属性信息或者商品的属性信息我们是比较容易得到的,。LFM并没有将这些有用信息纳入到模型中;第二,LFM不能解决冷启动问题,例如当一个新的用户进入到系统中,由于用户没有给任何商品评分,因此LFM模型不能向此类用户进行推荐,对于新的商品也是这样的。
2 sSVD模型
由于LFM模型上述两个缺陷,沈晓彤教授等人提出了一种新的推荐系统模型用来解决以上问题,即Smooth neighborhood recommender systems(sSVD)。
2.1 目标函数
sSVD具体做法将上述目标函数改为如下形式
通过最小化上述函数求得用户隐因子矩阵P和商品隐因子矩阵Q。其中:
表示用户及商品的连续属性,
表示用户
及
之间基于离散属性计算的相似度,
表示商品
与
之间基于离散变量计算的相似度,
表示核函数。
2.2基本思想
sSVD基本思想是这样,由于新用户没有观测值,LFM不能向他进行推荐,则通过填充缺失的数据,然后再进行分解,从而解决这个问题。而填充值则用已有观测的加权平均值,而权重的大小由评分间的相似度来确定,如果已有观测值与缺失值之间越相似,那么它的权重就应该越大。由于观每一个评分都是与两个实体有关的,就是它对应的用户和商品(如图2.1),与评分值
相关的就是用户1和商品1。那么就可以通过用户用户,商品商品之间的相似性来度量评分间的相似性。例如在这个例子中我们要计算与
间的相似性,然后计算用户1与用户2间的相似性以及商品1与商品2间的相似性。在计算用户或者商品相似性时我们用到的是他们的属性信息,例如用户年龄、商品标签等等。而属性信息,又有取值为连续和离散的,这两种不同的属性在计算相似度时使用的方法又不相同,因此需要分开来算。用户的离散属性一般取得是他的社交网络,如果两个用户存在直接网络关系那么可以把他们的相似度设置为1,否则设置为0;而商品的离散属性,例如商品的标签,我们可以基于标签来计算商品间的余弦相似度等;而对于连续属性,首先求它的欧式距离,因此如果两个用户越相似那么他们的欧式距离应该是更短。但是,事实上我们需要的是,越相似它们之间的值应该是越大的,因此需要进一步的变换。进一步我们将一个核函数作用于这个距离,获得一个0-1之间的数。这里我们用的是径向基函数。经过核函数作用后距离越短,值越接近1,当距离为0的时候值就为1。综合这四个相似度就可以得到这两个评分的相似度。相似地,我们计算其他观测与
的相似度,然后对相似度进行归一化,从而得到所有观测值在这个缺失值上的权重,从而可以通过加权平均值来填充这个缺失值。同样地,对评分矩阵中的每一个评分都按照上面的方法计算的值去填充。然后再基于这样的一个矩阵去进行SVD分解。
图2.1
因此我们可以看出,sSVD模型充分地利用了用户及商品属性等外部信息,可以预见sSVD的效果应该要优于只用利用了评分信息的LFM模型。再者,由于在分解前我们对评分矩阵进行过一次填充,因此就不存在缺失值的问题,所以sSVD可以有效地解决冷启动问题
3 实做流程
3.1流程图
我们具体的操作流程如下图
图3.1操作流程图
3.2数据预处理
首先,我们所使用的数据集合是Last.fm所提供的音乐数据集合。Last.fm是全球最大的社会音乐平台。其音乐库里有超过1亿首歌曲曲目(其中300多万首可以收听)和超过1000万的歌手。其提供的数据集包含了部分用户的听歌信息。在经过了简单的整理后,这些信息可以被整理成如下三种表格:
表3.1用户听歌次数表表3.2用户社交网络 表3.3歌手标签表
| userID | artistID | weight |
| artistID | tagID |
| artistID | tagID |
| 0 | 2 | 1000 |
| 0 | 1 |
| 0 | 1 |
| 0 | 4 | 1500 |
| 0 | 5 |
| 0 | 5 |
其一是这部分用户中,每一个用户(user)都听了哪些歌手(artists)的歌,并给出了这些用户对于每一个歌手的歌总共听的次数。其二是这部分用户的社交网络信息。即反映了每个用户的好友信息。其三是这些有听歌记录的歌手被标记的tag数据,数据记录了每首歌具有哪些tag。
根据这些表格,我们可以进行间的描述性统计。首先。我们先统计了数据的规模如下表。从表中可以看出,我们的数据中歌手的数据是比较多的。同时标签的数量也是非常多的。这样的数据量会给后续的数据处理造成很多的困难。另外,从数据中可以看出,这个评分矩阵是非常稀疏的,对于每一个用户而言,都只会听少部分的歌手的歌。
表3.4描述统计表
| 类型 | 数量 |
| 用户数量 | 1892 |
| 音乐数量 | 17632 |
| 标签数量 | 186479 |
| 已观测值数量 | 92834 (<0.28%) |
| 存在朋友关系 | 12717 (avg 13) |
在统计了数据的规模后,我们首先绘制了用户听歌次数的直方图。从数据中可以看出,用户的听歌次数是严重右偏的。这说明可能每一个用户都会有自己的特别偏爱的歌手。从而会反复的听一个歌手的歌。而由于我们的模型在进行建模时要求数据不能呈现偏态的特性。所以我们考虑对于数据进行对数变换,可以看出,对数变换后的分布接近对称分布,适合于进行接下来的建模。
图3.2听歌次数频数图 图3.3对数听歌次数频数图
在进行了数据的对数变换后,我们绘制了用户听歌记录的二维矩阵的密度图。图的横坐标表示所有的用户,纵坐标表示所有的歌手。图中有颜色的地方表示用户对于相对应的歌手有听歌记录。从下图中可以看出,数据呈现“长尾”的特性。即除了某些热门歌手会被大部分的用户关注外,大部分的歌手都有特定的听众群体。相对的,每个用户除了对于当下热门的歌手感兴趣外,都会有自己感兴趣的“小众一些”的歌手的信息。
图3.4观测矩阵二维密度图
在对于数据有了大体的了解后,为了确保用户的社交网络信息可能对于建模有帮助,我们单独的找出了第0用户听过次数最多的歌手的标签中的前六个,分别是,电音,流行,舞曲,另类,现场,休闲。可以看出这个人的兴趣范围非常广。并判断那些和他有朋友关系的人对于这些tag的喜好程度。我们找到了他的三个朋友,分别是用户257、709和838,并找出了这三个用户听这六个标签的次数的比率,可以发现在某些标签上他们表现出的偏好是非常相似的。
图3.5第0号用户兴趣分布图
3.3用户/商品的相似度的计算
在完成了数据探索后,我们可以开始进行数据的建模了。首先,我们需要准备模型所需要的数据。即准备用户之间、商品之间的关系矩阵和距离矩阵。接下来以歌手的数据准备过程为例子,简单的介绍这两类矩阵的准备过程。
3.2.1歌手之间余弦相似度的计算
首先,在对于原始数据进行处理后,可以得到如下表中的稀疏矩阵,其中,每行表示一个歌手,每列对应一种tag,矩阵对应位置取值为1表示用户拥有这个tag。根据这个稀疏矩阵,可以获得表示每一个歌手的一个向量,从而可以根据这个向量计算歌曲之间的余弦相似度。
表3.5歌手标签表
|
| tag1 | tag2 | tag3 |
| artist1 | 1 | 1 | 0 |
| artist2 | 1 | 0 | 1 |
| artist3 | 0 | 1 | 1 |
显然,如果使用for循环求解这一个问题,至少要循环 次,当n的数量很大时,循环求解会耗费很多时间。对此,我们考虑使用矩阵的运算来优化我们求解的过程。我们注意到,余弦相似度的计算公式为:
可以看出,求解余弦相似度的过程可以分为矩阵内积的运算和矩阵求模长运算结果的组合,所以可以使用矩阵运算来,一次性求解所有的商品之间的余弦相似度。具体方法如下:
若假设歌手-tag的稀疏矩阵为X,则:
3.3.2歌手之间距离矩阵的计算
接下来,我们需要准备用户之间、商品之间的距离矩阵的数据。以歌手为例子,假设我们有三个歌手,每个歌手具有自己的一些连续变量,而我们需要做的就是求出这些歌手之间的欧式距离:
在这个过程中我们一共尝试了几种解决方法。第一种方法是使用GPU进行处理。因为最初的时候我们没有发现使用矩阵运算处理该问题的方法。所以考虑的解决方法是使用并行的思路进行解决。但是当数据规模很大的时候,GPU出现了显存溢出的问题。之后,我们尝试了使用python自带的sklearn包中计算欧氏距离的函数解决该问题。但是很快就出现了新的问题。
这个问题就是内存不足的问题。从上面这个矩阵的形式上可以看出,每两个商品之间都会有一个欧氏距离,所以上述矩阵是一个实矩阵。当歌手的数量很多时,这个矩阵的规模会非常的大,以致于造成内存溢出的问题。对此。我们参考了sklearn包的源代码自己写了一个算法解决该问题。具体的计算见附件。
大致的解决思路有三个:其一,使用矩阵运算代替for循环。本质上,求欧式距离的过程也可以化成内积运算和模长计算:;其二,使用分块矩阵运算,并在每次运算结束后将运算的结果存储到外存中;其三,将上一步所求的余弦相似度矩阵中的稀疏性运用到距离矩阵中,即考虑到很多歌手之间其实是没有共同特征的,则存储他们的欧式距离信息没有意义,所以可以省出这部分存储空间。
3.4平滑评分矩阵的计算及模型参数求解
在进行了上述数据的准备过程后,我们可以得到每个人对每首歌的预估的评分注意到经过了平滑处理,对于那些原先没有被任何人听过的歌,我们也可以获得每个人对于这首歌大致的一个评价。
在获得了平滑后的数据后,优化问题变为以下问题。注意到数据的规模就从原先的变成了
。但是模型的形式和一般的LMF模型的形式一致。所以可以使用一般的ALS方法并行的对于这个问题进行求解。
4推荐结果分析及应用
4.1 推荐结果评价
我们随机抽取80%数据作为训练集,20%数据作为测试。通过交叉验证选取和
的最优值,最终选取
,
,RMSE表现结果如下表格。从结果中可以看出,在测试集合上的RMSE为1.14,即实际值和预测值之间大约有1.14的偏差。即比如说预测一个人听一首歌的次数的对数为6,则真实值大致会在
之内。
表4.1 RMSE结果表
| 数据集 | RMSE |
| 训练集 | 1.09 |
| 测试集 | 1.14 |
4.2 关于冷启动问题的解决
在对数据划分测试集合和测试集合后,我们进行的了简单的数据处理,发现有2000+位歌手在训练集上没有值而只在测试集中有值。按照传统的算法是无法预测用户对这些歌曲的评分的。但根据我们现在所使用的这种算法可以给出用户对于这部分歌手的歌曲的听歌次数的预测情况。
下面给出了一个这样的例子。例子中的1992号歌手之前从未出现在训练集合中。即之前从未有获得其他用户听1992号歌手的歌的记录。而在测试集合中出现了67号用户听1992号歌手的歌曲的信息。听歌次数取对数后一共是5.347次。而利用我们的算法给出的预测结果为5.299次。可以看出,模型能够有效率的解决冷启动问题。
表4.2预测结果与实际结果表
| userID | artistID | Log(weight) | predict |
| 67 | 1992 | 5.347 | 5.299 |
4.3 推荐结果应用
在构建了完整的推荐系统模型后,我们接下来可以开始对于用户进行歌曲的推荐。
对用户的推荐
首先,我们选取第0号用户为其推荐歌曲。根据上文的分析,第0号用户最喜欢的前四个歌曲的tag为electronic,pop,chillout,alternative。而下表为我们为这位用户推荐的20首歌曲中出现的最多的tag。可以看出,推荐的歌曲的曲风包含了用户所喜欢的类型,同时也推荐了一下用户平时少关注的新的类型。可以认为推荐结果是理想的。
表4.3第0号用户推荐结果表
| 序号 | tagID | tagValue |
| 1 | 17 | electronic |
| 2 | 12 | chillout |
| 3 | 13 | ambient |
| 4 | 190 | instrumental |
| 5 | 186 | electronica |
| 6 | 129 | female vocalists |
| 7 | 23 | pop |
| 8 | 78 | alternative |
对于商品的推荐
在完成了对用户的推荐后,我们来考虑另外一种推荐场景:对于每首歌曲需要找出和它相似的歌曲。这样在用户听完一首歌后可以给他推荐和这首歌相似的歌曲。我们以一个例子来看一下我们的推荐算法在这种情景下的表现。首先我们取出了第0号歌手并查看这个歌手的歌曲都具有哪些特性:
表4.4第0号歌手标签表
| tagID | tagValue |
| 138 | j-rock |
| 140 | visual kei |
| 178 | gothic |
| 534 | japanese |
| 545 | weeabo |
| 1205 | jrock |
| 2800 | better than lady gaga |
可以看出,这个歌手来自日本,歌曲以日文为主,同时属于摇滚类型。然后,我们依据我们的模型寻找了和这首歌最相似的5个歌手,查看这些歌手的tag如下表。从下标中可以看出,加粗体的表示推荐的歌手所具有的这个tag和第0号歌手的tag一致。根据表中的结果来看,推荐的歌手都有和第0号歌手有相同的tag。也可以认为模型是合理的。
表4.5第0号歌手相似歌手标签表
| artistID | tagID |
| 388 | [138, 139, 140, 230, 357, 534, 1205, 2800, 3769] |
| 394 | [138, 357,534, 1205, 7254, 11375, 11549] |
| 2940 | [22, 26, 178, 298, 301, 11696, 11935, 11936] |
| 5582 | [2, 13, 26, 178, 568, 1464] |
| 17039 | [138, 140, 178, 534, 568] |
5结语
sSVD是一种能够有效解决冷启动问题的算法。本文基于sSVD方法,对于lastFM音乐数据集进行了建模分析。并在建模后结合两种推荐场景给出了推荐。在建模过程中,我们为了解决内存溢出的问题,使用了大量的矩阵运算代替普通的for循环,并通过将中间数据存储到外存中来解决了内存溢出的问题。另外,我们也利用了并行的编程思想,提升了算法的效率。而从结果中看,我们的推荐系统的RMSE相对传统方法较小,同时可以很好解决冷启动问题,对于那些用户之前没有听过的歌曲也可能预估用户对其的评分情况。而在两种实际推荐场景中,推荐的效果也是比较合理的。对用户推荐的歌曲非常符合用户的听歌习惯。而对于歌曲也能推荐出相似的歌曲。可以看出,在音乐推荐方面,sSVD的推荐结果是非常良好的。
参考文献
[1] Dai, B., Wang, J., Shen, X., and Qu, A.(2017). Smooth neighborhood recommender systems.
[2] Zhu, Y., Shen, X., and Ye, C. (2016). Personalized prediction andsparsity pursuit in latent factor modls. Journal of the American StatisticalAssociation, 111(513):241-253.
