千人千面精准推荐机制之大白话细解协同算法

669 阅读10分钟

前言

相信很多小伙伴都听说过大数据、AI推荐、千人千面等高大上的话语;也经常看到很多App应用中,会经常推荐一些商品给我们,什么猜你喜欢,重点推荐等业务。

很多小伙伴应该也去网上进行了了解,发现真的是一头雾水,尤其看到了一些算法时,那些数学公式看了就头疼。今天就尝试着介绍一下精准推荐的整体架构,以及核心算法的实现原理,尽量能让小伙伴们能够看懂。

注意:看此篇文章的小伙伴需要有一定的java基础,以及elasticsearch知识哦

推荐架构

以下是常规的推荐系统架构图

上面架构图的流程从2个维度方面

从用户请求路径

1)用户终端发起请求,传入核心标记UserId

因为有些平台中会有很多地方有推荐业务,如:购物车下面【精品推荐】,商品详情里面的【猜你喜欢】,商品列表中的【热门推荐】等;所以终端会经常带上场景这个参数,不同的场景会对应不同模型数据

2)后台接口再发起调用推荐服务

3)任何的精准推荐都会三个阶段:召回、排序、业务重排;

这三个是什么意思呢?弄个图简要说明就明白了

通过已经步骤,我们就可以达到推荐的功效,千人千面;整个过程中的最核心的就是召回算法、排序算法;我们再从后台方面去看,数据分析维度的路径。

从数据分析路径

任何的分析都需要有素材,素材是什么?其实就是这几年小伙伴们听的最多的大数据;何为大数据?简单理解就是数据量多,数据维度多。我们可以通过这么多的数据去进行分析。

上面的推荐架构图中:

  • 我们通过在终端进行埋点收集用户行为日志;存储到大数据平台。

  • 集合业务数据,收集用户偏好行为数据,如:收藏、点赞、评论等;存储到大数据平台。

  • 基于大数据平台的数据,通过一些算法对数据进行分析,得到一个训练模型

  • 通过训练出来的模型,就可以获得相关的推荐数据。

  • 把获得的推荐数据保存到mysql/redis等持久化工具中。

为了达到用户请求性能,会把推荐的数据提前存储到数据库中;保证用户体验。

算法模型

什么是算法?什么是模型? 给大家举个小学一年级的题目

Plain Text

题目:找出规律,填写下面的值

1、3、5、7、9、11、13、?、?

大家一看就知道答案了是吧,我们这里不是讨论的最终答案是什么,我们来分析一下答案是怎么来的?

看到上面的题目,我们来分解一下;我们已经知道一组数据

Plain Text

1、3、5、7、9、11、13

这些数据其实相当于我们采集过来的已知数据。

上面的题目现在我们需要根据已知的数据,推测出下2个数字是多少?

即相当于我们知道了用户的行为数据,然后预测推荐商品给用户。

算法

根据上面的题目我们一看就知道是第二个数比第一个数大2,即 x2 = x1 + 2;在数学上面专业名词,就是等差数列。这个就是简单的算法,也可以理解为算法公式。

训练模型

在我们推荐系统中会有个模型这个概念,那什么是模型呢? 我们继续沿用上面的题目。我们深入思考一下,为什么我们知道算法公式是 x2 = x1 + 2?

是不是因为我们发现 1和3之间相差2,然后在发现3和5之间相差2,5和7相差2,一直到11和13之间相差2;所以我们决策,我们发现了这列数据的规律,就是x2 = x1 + 2。

那在我们推荐系统中,训练模型的思路也是这样的,我们先从采集的数据中拿出部分数据如:1、3、5、7。我们先从这个部分数据中寻找规律,我们得到了类似x2 = x1 + 2的公式

然后我们在利用这个公式推导出剩余的已知数据,如:我们可以根据这个公式推导出后面的9、11、13。然后发现和我们数据是一致的,我们就可以认为这个算法可行

上面的第一次拿出来的部分测试专业术语就是训练数据,剩余的数据就叫测试数据

1、3、5、7为训练数据;9、11、13为测试数据

在推荐系统中这个整个过程就可以理解为模型的训练,因为真实的场景中数据维度很多,不可能像我们这个简单的例子;真实场景中我们需要用到的如协同过滤LFM、ALS算法、LR逻辑回归等算法

总结一下

算法

Plain Text

就是一种解决问题的思路算法公式。

模型:理解为一段程序

Plain Text

是通过算法+数据进行分析过程的一段程序。

需要数据作为入参,程序体作为算法;执行后返回具体的推荐数据。

所以数据量、维度的多少会直接影响模型的准确率

下面我们来介绍一下在推荐系统中常用到的算法

传统推荐算法

我们还是来举个案例,有个图书平台,需要开发个推荐系统,现在拥有的已知数据如下

我们发现上图中列为书名,行为用户;里面的值1代表已读。值为空的代表没有读过。那么现在基于这些数据如何进行推荐呢?我们来看看传统的推荐思路

基于用户的协同过滤算法(UserCF)

本质从用户角度出发

首先需要找到和他们看了同样书的其他用户,然后给他们推荐那些用户喜欢的其他书,也就是从用户共性出发。这种思路专业术语就是UserCF

如上面的例子,张三和李四都看了《java编程思想》,那么系统就认为二者有共性。

所以就推荐给张三,李四曾经看过的书《孙子兵法》。

那推荐给李四的书,即是张三曾经看过的《人人都是产品经理》

基于物品的协同过滤算法(ItemCF)

本质从商品角度出发

需要给他们推荐和他们已经看的书相似的书

就是从书的共性出发,张三看了《JAVA编程思想》,属于IT方面的书籍,那么系统可以推荐给张三《大前端自我修养》或《游戏开发》。这种思路专业术语就是ItemCF

UserCF与ItemCF

从两个算法的原理可以看到,UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,而ItemCF的推荐结果着重于维系用户的历史兴趣。换句话说,UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而 ItemCF的推荐更加个性化,反映了用户自己的兴趣传承。

UserCF适用场景

Plain Text

1)在新闻网站中,用户的兴趣不是特别细化,绝大多数用户都喜欢看热门的新闻。即使是个性化,也是比较粗粒度的,比如有些用户喜欢体育新闻,有些喜欢社会新闻,UserCF可以给用户推荐和他有相似爱好的一群其他用户今天都在看的新闻,这样在抓住热点和时效性的同时,保证了一定程度的个性化。

2)UserCF 适合用于新闻推荐的另一个原因是从技术角度考量的。因为作为一种物品,新闻的更新非常快,每时每刻都有新内容出现,而ItemCF需要维护一张物品相关度的表,如果物品更新很快,那么这张表也需要很快更新,这在技术上很难实现。绝大多数物品相关度表都只能做到一天一次更新,这在新闻领域是不可以接受的。而 UserCF 只需要用户相似性表,虽然UserCF对于新用户也需要更新相似度表,但在新闻网站中,物品的更新速度远远快于新用户的加入速度,而且对于新用户,完全可以给他推荐最热门的新闻,因此 UserCF 显然是利大于弊。

ItemCF适用场景

Plain Text

1)在图书、电子商务和电影网站,比如亚马逊、豆瓣、Netflix中,ItemCF 则能极大地发挥优势。首先,在这些网站中,用户的兴趣是比较固定和持久的。这些系统中的用户大都不太需要流行度来辅助他们判断一个物品的好坏,而是可以通过自己熟悉领域的知识自己判断物品的质量。因此,这些网站中个性化推荐的任务是帮助用户发现和他研究领域相关的物品。此外,这些网站的物品更新速度不会特别快,一天一次更新物品相似度矩阵对它们来说不会造成太大的损失,是可以接受的。

总结

上面介绍了UserCF和ItemCF协同算法,也是在之前常用的推荐算法;不过这几年又出来了一个协同算法LFM(隐语义模型),隐语义模型的核心思想是通过隐含特征 ( latent factor ) 联系用户兴趣和物品

举个例子,用户A的兴趣涉及侦探小说、科普图书以及一些计算机技术书,而用户B的兴趣比较集中在数学和机器学习方面。

要给 A 和 B 推荐图书:

对于UserCF,首先需要找到和他们看了同样书的其他用户(兴趣相似的用户),然后给他们推荐那些用户喜欢的其他书;

对于ItemCF,需要给他们推荐和他们已经看的书相似的书,比如作者B看了很多关于数据挖掘的书,可以给他推荐机器学习或者模式识别方面的书。

其实上面的推荐缺少了用户兴趣和物品之间的关系,也就是用户A和用户B之间有一定的相似度,但不是完全一样

如:用户A兴趣侦探小说,计算机技术;用户B兴趣侦探小说,经济学;那很有可能会把经济学类的书推荐给用户A。

那如何解决呢?我们只要加上用户兴趣和物品之间的关系就可以了。可以先对书和物品的兴趣进行分类。对于某个用户,首先得到他的兴趣分类,然后从分类中挑选他可能喜欢的物品

这个基于兴趣分类的方法大概需要解决三个问题

(1) 如何给物品进行分类?

(2) 如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度?

(3) 对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重?

这个就是LFM所要解决的问题,我们会在下一篇文章中给大家进行分享,谢谢!!!

看完三件事❤️

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  1. 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  2. 关注公众号 『 阿风的架构笔记 』,不定期分享原创知识。
  3. 同时可以期待后续文章ing🚀
  4. 关注后回复【666】扫码即可获取架构进阶学习资料包