吴珂彤,贾双英,李恒博
(西京学院计算机学院,西安 710000)
当今社会,电影已成为不可或缺的娱乐方式,已经发展出多种多样的形式供人们体验电影所带来的乐趣[1]。为了满足观众的需求,视频网站开始推出个性化的视频推荐功能,它可以根据当前的热门视频和用户的个性化数据,为用户提供更加精准的推荐,从而提高用户的忠诚度[2]。
这款个性化视频推荐系统会收集用户在不同得分区间内的评分,按照电影类型统计每一种类型的电影数目以及平均得分,通过统计与分析,用户可根据自身偏好进行调整,使推荐更准确。
通过使用本系统,用户可以根据自己的评分来预测其他电影的评分,并且通过电影的相似性和用户的相似性来建立联系,从而实现推荐功能。这样,用户只需要给出一部分电影的评分,系统就能够自动为用户提供更多的推荐信息,从而有效地解决了初始用户数据稀疏的情况下的推荐偏差问题。
聚类是一个将某些方面相似的数据成员进行集中、分类、组织的过程,可以有效地将数据集中的相似特征进行归纳和组织,因此属于无监督学习。
k均值聚类(K-means)是一种非常有效的划分聚类算法,它以其简单的操作流程和高效的结果,被广泛应用于各种聚类算法之中。它的原理是:将一组数据按照一定的距离函数划分到k个不同的聚类中,每个聚类都有一个特定的参数,以此来实现对数据的有效分类[3]。
假设输入样本集为X={x1,x2,…,xm},聚类的簇数量为K,最大迭代次数为N,输出簇为C={C1,C2,…,Ck}。K-means 算法的基本流程如下所述。
(1)从数据集X中随机抽取K个样本作为初始质心,其集合为{μ1,μ2,…,μk},划分并初始化输出簇C,初始化结果为
(2)在每个簇C中,计算每个样本xi与该簇质心向量之间的距离d,根据d的大小,将该样本xi分配到相对应的簇中,更新输出簇C;
(3)重新计算各个簇内所有样本距离的平均值作为新质心,若K个质心向量未发生变化,则进行步骤(4);否则,继续执行步骤(1)~(3),直至最大迭代次数或聚类完成;
(4)重新划分输出簇C。
个性化视频推荐系统在Jupyter notebook 下运行,使用Python3。
通过个性化视频推荐系统,我们可以收集和分析不同类型电影的数量和平均得分,从而更准确地了解用户的偏好,并且可以根据用户过往的评分预测他们对这些电影的评分,同时还可以通过电影之间的相似性和用户之间的关系,为用户提供更加精准的电影推荐。
该数据集来自Movies-lens 用户评分数据集,包含了9125部电影中的100004个评分和1296个标签[4]。Movie-lens 根据用户对一部分电影的评分,预测该用户对其他电影的评分。系统对用户的评分情况进行分析,并将结果反馈给用户,以便用户更了解自己的评分情况。
Ratings.csv 评分数据文件,包含了一系列用户对各个电影的评分,评分为0.5~5 星,半星递增。
Tags.csv 标签数据文件,是用户生成的关于电影的标签,一个单词或短语。
Movies.csv 电影数据文件,每一行代表一部电影,电影ID、标题、电影流派(列表中选择:喜剧、冒险、动画片、纪录片、科幻片、爱情片,等等)。
2.4.1 计算每位用户对各类电影的平均评分
通过导入电影数据集和评分数据集,计算每位用户对各类电影的平均评分,并通过一些偏倚处理,使得聚类可以更准确地定义出用户的偏好。为简化编程和程序的整洁,我们将大部分数据预处理过程都存储在辅助函数helper文件中,可以直接调用。
2.4.2 处理稀疏数据集
想进一步分析用户对每个电影的评分情况,观察数据集我们发现,大多数用户并未接触过大多数电影,因此他们也没有给出相应的评分,而这一数据集的值被定义为NaN。这种数据集被称为“稀疏数据集”。
为了解决这一问题,我们按照获得评分次数最多的电影和对电影评分次数最多的用户排序。这样可以形成更“密集”的区域,使我们能够查看数据集的顶部数据。便于后续选择获得评分次数最多的电影和对电影评分次数最多的用户。
以爱情片和科幻片为例,对用户评分进行聚类分析,将用户对爱情片和科幻片的平均评分数据集进行数据可视化,并取不同的k值进行聚类分析,k= 2,k= 3时的聚类结果分别如图1、图2所示。
图1 k=2时聚类结果
图2 k=3时聚类结果
k= 2 时,观察图1 可以发现,这一聚类结果主要取决于每个用户对爱情片的评分。如果用户对爱情片的平均评分超过3 星,则属于蓝色圆点组;如果用户对爱情片的评分没有超过3星,则属于绿色斜十字组。
k=3 时,观察图2 可以发现,科幻片平均评分开始起作用了,综合爱情片和科幻片的平均评分,把用户分为:喜欢爱情片但是不喜欢科幻片的用户(蓝色三角组);喜欢科幻片但是不喜欢爱情片的用户(红色圆点组);既喜欢科幻片又喜欢爱情片的用户(绿色方形组)。
但k值并不是越大越好,为了聚类效果更好,本系统用“肘部法”选择最佳k值。
通过肘部法,可以比较k的上升值和使用该k值计算的总误差分布,从而更好地评估聚类的性能。这种方法的基本思路与网络搜索相似,即通过遍历参数k来选择最小误差,选取轮廓系数(越接近1性能越好)来衡量聚类效果。在计算轮廓系数时,我们将k步长调整为5,以减少数据量,同时也能够更快地完成计算。计算出k的上升值和轮廓系数折线图如图3所示。
图3 k值与对应轮廓系数折线图
结合肘部法和便于可视化考虑,选择k= 7进行聚类。
3.2.1 最佳k值聚类并热力图可视化
用户对单个影片的评分数据集,经过数据预处理,稀疏数据集已经相对密集,数据集维度很庞大,为了更直观地识别这些评分以及后续更方便聚类,我们这里使用颜色代替评分数字,用热力图进行可视化[5]。每列表示一部电影。每行表示一位用户。单元格的颜色根据图表右侧的刻度表示用户对该电影的评分情况。
通过肘部法选择最佳k值为12,并对聚类结果进行热力图可视化,这样就形成了具有相似评分的用户聚类,因此通常具有相似的电影品位。基于这一点,当某个用户对某部电影没有评分时(单元格没有值或热力图可视化为白色),我们对该聚类中所有其他用户的评分取平均值,从而得出该群体对该电影的喜爱程度。聚类结果热力图如图4所示。
3.2.2 个性化评分预测的代码及结果
从中选择一个空白单元格。因为用户没有对该电影评分,所以是空白状态。预测代码:
预测结果:
预测该用户对此电影的评分:4.5
计算该聚类中每部电影的平均分数,就可以判断该“品位聚类”对数据集中每部电影的喜欢程度,更好地了解用户的偏好。可以将它作为推荐引擎,使用户能够发现他们可能喜欢的电影。
当用户访问本应用时,我们将会提供与他们兴趣爱好相匹配的电影,并且根据用户的评分,从聚类中选择该用户尚未评分的最高评分的电影。
选择用户id,获取此用户的所有评分,从中找到该用户没有评分的电影,并计算这些电影的平均评分,进行排序推荐,推荐结果如图5所示。
图5 个性化推荐结果
K-means算法因易于操作和对大样本数据的高效处理能力而得到广泛的应用。本系统可以精细地统计出不同种类的电影,并对其进行评估,帮助用户进行个性化的选择,从而提高推荐的精度。当用户查看某部电影时,本系统可以通过观察用户以往的评分预测他们对这部电影的评分,还可以根据电影相似性以及用户相似性建立联系来进行影片推荐。
尽管基于用户评分的推荐可以提供一定的参考价值,但这种方法也存在一些缺陷,例如:两个用户虽然对同一部影片评分相同,但有可能是因为他们对电影的评分标准不一样;此外,用户的可靠性也是一个重要的考量因素,现在网络上存在大量的虚假评分和评论,这些都会影响到用户的信任度。当前系统存在一些无法解决的挑战,因此,我们将继续努力探索更有效的解决方案,以提升系统的性能和可靠性。