第03课:基于内容的推荐(原理)

在上两篇中,我们对推荐系统所涉及到的一系列基础知识进行了了解,包括推荐冷启动的机制、马太效应的概念、对于推荐的评估方式等。

但我个人觉得最大信息含量在于整个推荐体系的构成,以及推荐系统不等于推荐算法的认知,并且我们也对常见的推荐算法有了个概念性的认知。

在这一篇中,包括后续的章节,我们将直接在推荐系统最核心的部分上进行深入的了解,从原理解析上,从实际生产的注意事项上,甚至从代码工程上进行学习。

什么是最最最简单的推荐算法

结合之前大致陈述的一些推荐机制,最最最简单的推荐机制,无疑是基于主体属性相似或者相关推荐了,连个性化都说不上,铁定最最最简单了。说到这,说不定有些读者不愿意继续了解下去了,既然如此简陋的推荐机制,不看也罢。但是,真的不要小看基于内容相似的推荐,存在即合理。

我们在进行信息获取时,其实本身就是具有一定识别能力的,这意味着我们最终选择查看的信息都是经过我们大脑大致思考的结论,这意味着这些信息是有参考价值的。

并且,在很多时候,我们是需要同类信息进行获取到的信息进行补全的,完善我们对目标信息的获取程度。基于这个考量,基于内容属性的推荐其实是说的过去的。

直接看实例,还是以导读中看到过的图例为例:

1-1

这是我在腾讯视频播放《蜘蛛侠3》时所截获的推荐页面,从其推荐的候选电影列表中,不难推测出,其推荐的列表与当前播放的电影相关性还是很大的。

并且,为了进一步做校验,我曾尝试了很多类似的场景,实际上确实如猜测表现的那般。虽然我对于腾讯视频的推荐算法具体情况不得而知,但是可以确认的是当前播放的电影与推荐的候选集间的相关性一定少不了。

这里再补充一些其他信息:

我个人的腾讯视频是 VIP,经常用来看一些科幻大片;
我儿子经常也用这个账号来看动画片,诸如《小猪佩奇》,频度很高;
除此之外,我偶尔看的还有灾难片、动作片等。

综上,我们会发现,实际上从目测的角度看,这个推荐除了相关性,与用户的高频操作似乎相关不大。

回到基于内容推荐的话题,这种简单的推荐机制,在整个推荐系统中真的是不可缺少的部分,很多时候简单并不代表无效,类似上面这个场景,我们可以举出太多有据可循的实际案例出来。

简单中的复杂问题

从直接的推荐机制来看,整个实现流程看着真的很简单,但是在实际的操作过程中,还是有一些东西值得探讨以及注意的。

首先,相似计算的过程

之前文章有大致提到过,相似或者相关计算还是有很多可以选择的,他们每一种都有各自的特点以及适应性。以相似计算中使用最多的欧式距离与余弦相似为例,专业点的说法就是余弦夹角可以有效规避个体相同认知中不同程度的差异表现,更注重维度之间的差异,而不注重数值上的差异,而欧式距离则是对个体异常数值会比较敏感。

这意味着,在我们需要区分异常样本时,使用距离计算会更恰当,举个例子,比如电商领域中高价值与低价值用户的区分,其实我们核心是想把他们的差异性拉大的,得以体现出对比,这个时候使用余弦就是不合理的。

在回归到距离上说,市面上除了欧式距离,还有好几种距离度量,诸如马氏、曼哈顿距离等,其实其度量侧重都是不一样的,我们需要结合实际的场景去使用,还有更偏向于相关度量的皮尔森相关系数等。

需要解决相似计算中,计算矩阵过大的问题

按照标准流程,假设有 1 万个物品,则对于每个物品来说,需要与其他物品计算与其的相似度或者相关度,然后再排个序,取 TopN 形成自身的待推荐列表。那么,简单的数学题来了 10000*10000=10000 万次计算,这显然是不合理的。

所以,优化这个过程是必然的,关键是如何优化。核心思想其实就是初筛嘛!把那些完全没啥多大鸟关系的直接干掉,省掉计算相似的过程、节省资源。如何筛选?一个比较常见的做法是,寻找核心关键影响因素,保证关键因素的相关性。

比如,在实际的生产操作过程中,很多时候会通过关键属性是否基本匹配作为判断依据,或者直接通过搜索构建进行检索初筛,把大致相关的先过滤一遍,通过这种简单而粗暴的方式,其实已经能把大部分相关度很低的候选集给过滤掉,对于整体计算量级来说,计算复杂度直接下降。

多个因子如何权衡影响权重

基于属性计算相似,从整体上来看,其实一般主体都不止一个属性,那么计算相关的时候到底看那个属性呢?或者说哪些属性应该占有更高的权重,哪些因素是次要因素。

还是以上面的腾讯视频的推荐为例,从结果上来反推相似推荐的部分(当然,实际情况不详哈,只是推断而已),显然当前视频的类别占了很大的权重(记录片),除此之外包括导演啊,一些其他特征属性应该也会参考在内的。

回到常规问题,如何确定影响权重是个操作难题。最简单并且实际上还挺有效的一种方式就是专家评判法,即通过权威经验来划定影响因子的权重,还有就是通过标注的样本进行反向拟合每种因素的占比权重。除此之外还有一些其他学术上的方法,包括什么主成分分析法、层次分析法,还有什么熵权法,其实都是找因子影响能力的主次关系。

最终确定好了影响因素,在实际上线回收到数据之后,依然是需要逐步的进行权重影响调整的,我们可以通过结果的样本数据,进行 LR 的回归拟合,寻找最合适的权重配比。

工程示例

我们通过简单的工程示例来进一步了解这个算法,我们以市面上很容易获取到的电影推荐样本数据为例,鉴于目前很多场景都需要处理大批量的数,所以我们的示例将以 Spark 代码的方式进行核心关键代码的呈现。

实验数据简介

2-1

其实看到这三部分数据的简介,一些老手估计已经知道是什么数据了,是的,就是那份有名的电影数据集(MovieLens 开放数据),并且取的是完全版的那份,简直成了推荐系统的标配实验数据了。

三个文件,其中电影数据集共 1 万多个电影基础数据,评分数据集最大共 100 万条评分数据,以及 10 万条的用户对电影的打标签数据,总大小约为几百兆,不大,但是用来做实验玩玩那是相当足够了。

推荐机制逻辑

我们的核心计算逻辑还是内容属性上的相似嘛,所以核心是看看围绕电影,有哪些属性是可以抽取出来的,并且参与计算的。

  • 第一,电影的类别,基于上面腾讯视频的考虑,其实这个显然很重要,而电影的类别信息存储于电影数据集中,并且是一对多的关系,即一个电影可以对应多个类目,我们需要进行切割,由于计算这个维度相似的时候,是多对多的关系,天然的计算相似或者相关的特征。

  • 第二,电影的播放年份,电影的年份其实有种潜在的关联关系,举个例子可以说明,比如说零几年的电影与现状的电影风格是不同的,当时间跨度有一定差距时,这个还是蛮明显的。关于电影的年份数据,从数据样本可以知道,它隐藏在电影的名字中,写个正则过滤出来即可。至于说如何计算这个维度的相关,我们可以用两者差距来算相关,比如年份绝对值越远,这个值越小,越近甚至是重叠就越大。

  • 第三,电影的标签,电影本身是没有标签属性的,但它有用户对他打的标签信息,所以我们需要进一步处理,把它变成电影的属性,需要清洗、规整及处理。标签本身也是多对多的关系,同样可以计算相似度,如欧式或者余弦。

  • 第四,电影的名称,名称上进行寻找关联性,听上去很扯,但其实有一定的逻辑在里头,比如我在视频网站搜索“三国”,显然我期望从名称上寻找三国相关题材的视频,他们就是在名称上建立起关联关系的,所以,名称从某种程度上来说,可以体现相关性。在计算相似或者相关方式上,我们可以进行分词,去除停词,然后再以词维度进行余弦计算。

  • 第五,候选集电影的评分,对于做推荐来说,首先需要保证的推荐的候选集一定是优质的,从这个维度上说,抛开其他因素,那么就是整体评分高的电影是相对优质的电影。在处理的过程中,由于一个电影对应多个评分,所以,我们需要进行进行归一计算,最简单的做法就是计算整体评分的平均值,作为电影的评分数据,评分过低的数据直接从候选集中干掉,又大大的降低了计算次数。

如上,我们基本对整个基于内容推荐的原理,以及示例的处理逻辑阐述清楚了,鉴于章节篇幅,我们下篇将直接上 Spark 的工程案例,并进行逐步解析,帮助大家从基于内容推荐的算法入手,学习推荐系统中最核心的推荐算法。

(全文完)

(转载本站文章请注明作者和出处 第03课:基于内容的推荐(原理)