
文章插图
图8:标的物的topK相似列表利用Map数据结构来存储
有了标的物之间的相似度Map, 为用户计算推荐的过程可以基于用户行为RDD, 在每个Partition中, 针对每个用户u计算u与每个标的物之间的偏好度(利用第二节2基于标的物的协同过滤中的公式), 再取topN就得到该用户的推荐结果了 。 由于用户行为采用了RDD来表示, 所以整个计算过程可以分布式进行, 每个Partition分布在一台服务器上进行计算 。 具体的计算逻辑可以用下面的代码片段来实现 。

文章插图
图9:为每个用户计算topN推荐
讲到这里, 基于Spark平台离线实现协同过滤算法的工程方案就讲完了 。 该实现方案强依赖于Spark的数据结构及分布式计算函数, 可能在不同的计算平台上(比如Flink、Tensorflow等)具体的实现方式会不一样, 但是基本思路和原理是一样的, 有兴趣并且平时使用这些平台的读者可以在这些计算平台上独自实现一下, 算是对自己的一个挑战 。
四、近实时协同过滤算法的工程实现上面第三节中的协同过滤工程实现方案适合做离线批量计算, 比较适合标的物增长较缓慢的场景及产品(比如电商、视频、音乐等), 对于新闻、短视频这类增量非常大并且时效性强的产品(如今日头条、快手等)是不太合适的 。 那么我们是否可以设计出一套适合这类标的物快速增长的产品及场景下的协同过滤算法呢?实际上是可以的, 下面我们来简单说一下怎么近实时实现简单的协同过滤算法 。
我们的近实时协同过滤算法基于Kafka、HBase和Spark Streaming等分布式技术来实现, 核心思想跟第三节中的类似, 只不过我们这里是实时更新的, 具体的算法流程及涉及到的数据结构见下面图10 。 下面我们对实现原理做简单介绍, 整个推荐过程一共分为4步 。

文章插图
图10:近实时基于标的物的协同过滤算法流程及相关数据结构
- 获取用户在一个时间窗口内的行为
顺便说一下, 因为是实时计算, 所以用户行为数据会实时传输到Kafka中, 供后续的Spark Streaming程序读取 。
- 基于用户在时间窗口W内的行为及用户行为记录表更新标的物关联表CR

文章插图
, 我们对标的物两两组合(自身和自身做笛卡尔积)并将得分相乘更新到CR中, 比如

文章插图
组合, 它们的得分

文章插图
相乘

文章插图
更新到CR表中rowkey为

文章插图
的行中 。

文章插图
的得分score更新为score+

文章插图
) 。 其次, 对于用户U在时间窗口W中的行为还要与用户行为表UAction中的行为两两组合(做笛卡尔积)采用前面介绍的一样的策略更新到CR表中, 这里为了防止组合过多, 我们可以只选择时间在一定范围内(比如2天内)的标的物对组合, 从而减少计算量 。
这里说一下, 如果用户操作的某个标的物已经在行为表UAction中(这种情况一般是用户对同一个标的物做了多次操作, 昨天看了这短视频, 今天刷到了又看了一遍), 我们需要将这两次相同的行为合并起来, 具体上我们可以将这两次行为中得分高的赋值给行为表中该标的物的得分, 同时将操作时间更新为最新操作该标的物的时间 。 同时将时间窗口W中该操作行为剔除掉, 不参上面提到的时间窗口W中的操作行为跟UAction表中同样的操作行为的笛卡尔积计算 。
推荐阅读
- 分享一下我在工作中常用的一些工具 运营工具有哪些?
- 重点管控地区及关注地图分享 什么是重点管控地区
- 充满阳光正能量激励人心的句子分享 充满阳光正能量的句子
- 分享企业做品牌网络营销的3大好处 企业做品牌网络营销的好处有哪些?
- 分享企业品牌的5大作用 企业品牌的作用有哪些?
- 分享做企业营销策划的8个技巧 企业营销策划该怎么做?
- 分享制定企业营销策划方案的2大法则 企业营销策划方案如何制定?
- 分享企业招商营销策划的4大策略 企业招商营销策划的策略有哪些?
- 原神手游单手剑攻略-单手剑优缺点及玩法分享你知道吗
- 分享左岸咖啡的文案 简短咖啡文案有哪些?