基于矩阵分解协同过滤算法的评分预测
2016-10-21刘佳
刘佳
摘 要:文章以GroupLens项目组提供的MovieLens数据集作为测试数据集,通过实验实现了协同过滤算法中传统的非负矩阵分解(NMF)算法及奇异值分解(SVD)模型算法,结合两个算法的优点,提出了基于非负矩阵分解与奇异值分解的混合推荐算法。最后采用均方根误差RMSE验证了算法的有效性,证明了文章所提的算法是解决矩阵的稀疏性问题的有效手段,在评分预测问题上较前两种算法有明显的提高。
关键词:协同过滤;非负矩阵分解;奇异值分解
近些年,随着计算机技术和互联网技术的大规模发展,人们逐渐从信息匮乏的时代走进了信息爆炸的时代。网站运营商如何采用更有效的手段使得有价值的信息展现在用户面前,已经成为计算机行业的一个重要课题,同时也是个性化推荐系统开发的重要目标之一。推荐算法是推荐系统的核心,它的好坏决定了推荐系统效率的高低,协同过滤算法已经成为当今最流行和最成熟的推荐算法。
1 协同过滤推荐
协同过滤这一概念于1992年由Goldberg、Nicols、Oki及Terry首次提出[1]。推荐系统发展至今,协同过滤已经成为最流行和最成熟的技术。它的基本思想是:利用已有用户群过去的行为或意见预测当前用户最可能喜欢哪些东西或对哪些东西感兴趣[2]。
2 实验数据集和评测标准
文章所采用的是MovieLens网站所提供的1M数据集,简称为ML 1M。MovieLens是一个历史悠久的推荐系统,由美国Minnesota大学计算机科学与工程学院的GroupLens项目组创办,是一个非商业性质的、以研究为目的的实验性站点。MovieLens主要使用Collaborative Filtering和Association Rules相結合的技术,向用户推荐他们感兴趣的电影。文章采用评测方法中的均方根误差(RMSE)作为评测标准,用于评价算法的预测性能。
3 基于NMF协同过滤推荐算法分析
文章通过实验实现了基于非负矩阵分解的协同过滤推荐算法,在该算法中需要将原始用户评分矩阵分解为用户集合的矩阵和电影集合的矩阵,通过计算它们特征向量的点积预测评分。分解原始用户评分矩阵采用的是梯度下降法通过迭代逐渐减小预测评分和真实矩阵的误差直至收敛而得到。在本实验中梯度下降常数设为0.0002。采用均方根误差RMSE计算误差,即循环地计算每一条目的误差,最后将其结果相加。
为了选取合适的非负矩阵分解算法的参数n的值,需要通过实验观察不同的迭代次数对RMSE的影响。最后通过实验得出n>=100时,RMSE的值趋于平缓,达到最小为1.131,也就是n的值对于RMSE值的变化不再敏感,所以选择n=100。通过实验可以看出虽然NMF使矩阵的维度得到了有效的降低,但是在算法执行过程中收敛速度很慢,需要200次的迭代才能得出比较满意的结果,时间代价太大,在MovieLens 1M数据集上需要2730.2S才能实现最后评分预测。
4 基于SVD协同过滤推荐算法分析
文章所采用的是2006年Simon Funk提出了一个新的SVD分解算法,称为Funk-SVD,在该算法中有几个非常重要的参数,如学习速率、特征矩阵维度k及user特征矩阵和item特征矩阵的初值。本实验中选取k为100。User特征矩阵和item特征矩阵是通过原矩阵分解得到的,而此分解是一个NP问题,也就是得不到全局最优解,只能从两个矩阵的初值开始,沿着梯度方向向下走,得到局部最优解,所以user特征矩阵和item特征矩阵初值的确定关系到局部最优解的效果,在本实验中定义其初值为0.1?rand(0,1)/sqrt(k)。随着迭代次数的增加,RMSE的值也在不断变化,当迭代次数为100时,RMSE达到最小值0.871069。虽然定义迭代次数为100,实际上只进行了48次。
基于奇异值分解的协同过滤推荐算法,在每次迭代后RMSE的值都减小了,说明模型的性能也得到了很大提高,在第一次迭代后,RMSE的值从0.947080下降到0.935648,性能提高了1%;经过十次迭代后,RMSE的值下降到0.914292,性能提高了3%;经过四十八次迭代后,RMSE的值下降到0.871069,性能提高了7%。但是在实验过程中,RMSE值的下降速度越来越缓慢,需要很多的迭代次数和执行时间。
5 基于非负矩阵分解与奇异值分解混合推荐算法分析
通过对两种算法原理的论述,两种算法各有其优点,为了更好地提高预测的准确度,解决矩阵的稀疏性问题,文章提出了基于非负矩阵分解与奇异值分解混合推荐算法。非负矩阵分解算法通过迭代可以得到用户矩阵和物品矩阵,通过它们特征向量的乘积可以得到初步的用户与测评分矩阵,使得原始的稀疏矩阵变得更加稠密,但是其预测准确度并不高。所以将非负矩阵分解得到的用户特征矩阵作为K-均值聚类算法的输入,将用户集分成不同的簇,每个簇内的用户都具有较高的相似性,由于SVD算法具有较高的预测准确度,所以对每个簇内的用户数据进行SVD分解,最后得到新的用户评分矩阵。本算法实际上是对上述两种算法的结合,所以在实验过程中需要考虑非负矩阵分解算法中的迭代次数n,设定迭代次数n为100,梯度下降常数为0.002。奇异值分解时学习速率=学习速率*0.9、特征矩阵维度k=100及user特征矩阵和item特征矩阵的初值为0.1?rand(0,1)/sqrt(k)。在算法中需要通过K-均值聚类算法对用户集进行分类,通过实验得出聚类的个数等于60时RMSE的值最小,也就是可以达到最好的准确度,所以在此改进算法中设定K值为60。
如图1所示,从以上三个算法的对比试验可以得出,基于SVD协同过滤算法在时间性能上较基于NMF协同过滤算法具有较大的优势,但是准确性一般;基于NMF协同过滤算法预测准确度最差,而且时间消耗很大。而基于非负矩阵分解与奇异值分解混合过滤算法相对上述两种方法有了很大的提升,在时间上优于NMF算法与SVD算法,准确性要高于前两种算法。
参考文献
[1]David Goldberg, David Nichols, Brian M. Oki and Douglas Terry. Using collaborative filtering to weave an information tapestry. Communications of the ACM[J].1992,35(12):61-70.
[2]Dietmar Jannach, Markus Zanker,Alexander Felfernig, Gerhard Friedrich. 推荐系统[M].人民邮电出版社,2013,11:2-83.