协同推荐算法没有这么复杂,真的

3 评论 6444 浏览 104 收藏 19 分钟

个性化推荐基本上是由两个策略算法来进行演变的,一个是基于数据挖掘的关联分析推荐,一个是基于协同过滤的方法。笔者将重点介绍什么是协同过滤算法以及细分下的算法类型。

John之前写了一篇关于电商中的搜索和关联推荐策略的文以及一篇《产品经理,如何理解并应用策略?》。有些读者找到我说:太虚啦。没有算法叫啥子推荐咧?反思了下,嗯,一点都不虚。行呗,咱今天就好好聊聊推荐算法。

我们在使用产品时,经常看到场景会给我们推荐内容,比如社交产品会给我们推荐一些关注的人;电商产品会给我们推荐同类型的商品或者套装的其他商品;资讯产品会给我们推荐感兴趣的内容(即我们浏览最多的)。

以上都是基于我在看到一个结果,系统个性化给我的反馈。那为什么个性化推荐在业界这么火?

  • 信息过载,用户碎片化的时间,获取信息的成本变高,用户迫切需要个性化形式的产品。
  • 个性化提升了产品的体验、提升了用户的停留时长、粘性以及留存率。
  • 移动端的迅速发展,变小的载体促使了行业需要更快和更精准的信息呈现。
  • 用户越来越懒,而传统技术无法满足用户多样性的需求,迫使技术创新和发展。

其中从产品策略上来说,基本上由两个策略算法来进行演变的:一个是基于数据挖掘的关联分析推荐;再一个是基于协同过滤的方法。

一、基于数据挖掘的关联分析推荐算法

举个例子:在电商产品中,总体消费者人数为10000人,A产品购买人数为1000人,B产品购买人数为2000人,C产品购买人数为3000人;同时购买AB产品人数为800人,同时购买AC产品人数为100人,从这个案例中当然可以AB建立捆绑销售策略,但是当商品SKU成千上万,怎么去归纳呢?

这里基础的算法就是关联分析(电商中依托于销量可以做关联分析)。这儿设置到两个公式:支持度和置信度。

依照这个公式算法:

S(AB)=0.08;S(AC)=0.01;C(AB)=0.8;C(AC)=0.1

所以AB关联推荐效率值更高。

比较常用的应用场景就是电商品类捆绑销售(基于同一类型的不同商品,比如购买了篮球鞋,会关联推荐篮球服和篮球)。

这种方法现在用得比较少了,就稍微介绍下。接下来协同过滤推荐算法,就是现在最普遍的算法了。

二、基于协同过滤的推荐算法

首先要说明的是,我们所有的推荐算法,最终目的都是为了给用户推荐他可能感兴趣的商品,从而提高销售和转化率,忘记这个目的的所有算法设计都是自嗨。

目前常见的商品推荐算法是协同过滤,公认比较常用的方法俗称“邻居方法”。邻居方法中有两种视角:第一种是基于用户;第二种是基于商品。

基于用户的协同过滤,称为User-based CF(User-based Collaborative Filtering)。系统通过分析一个用户和哪些用户(参考用户)的特征比较相似,然后看看这些参考用户喜欢买哪类的商品,再从这些商品里挑出一些推荐给该用户。

基于商品的协同过滤,称为Item-based CF(Item-based Collaborative Filtering)。系统通过数据分析和挖掘用户的购买行为,来判断用户喜欢的商品类型,然后从那些用户喜欢的商品类型里挑出一些推荐给用户。

1. User-based CF 基于用户的协同过滤

算法核心思路:当用户进入一个电商平台时,作为电商平台系统找到那些和该用户兴趣/喜好类似的人,然后看看他们喜欢什么,就给该用户推荐什么。简而言之,A和B两个用户相似,然后给A推荐B喜欢的东西。

举个例子:在电商产品中,有用户ID为10001至10006这六位用户,他们对几种商品进行了浏览、收藏、购买、添加到购物车、评论、分享等操作。为了得到用户对某类别产品的兴趣度,我们可以设计这样一个简单的模型,给不同的用户行为赋予不同的分值,比如浏览行为赋予0.1分。整体的行为分值如表:

根据用户的行为,商品分值累加计算,满分10分,加到10后则不再累加。比如A买手机这个商品得到10分(可能是购买2部,则购买分为4分,两次5星评价,则评论分为6分;也有可能是购买分为4分,一次4星评价,一次5星评价,一次分享……)

然后,我们得到1001-1006六位用户对各种商品的偏好程度得分表:

(其中表格的数字是用户对该商品“兴趣程度”的一个量化值,0为没兴趣,10为非常有兴趣。空白代表这个商品在系统内,还没有任何依据来判断兴趣如何。)

如果以用户10005作为标本,现在要找到和他兴趣最接近的人,需要对商品的多维向量进行近似求法。一般用余弦相似度来进行度量。

余弦函数相信大家都不陌生,就是中学时候学的cosine函数cos(θ)。余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角的余弦值来评估他们的相似度。具体公式如下:

这里的xi和yi表示a和b的分向量。

给出的相似性范围从-1到1:结果为-1时意味着两个向量指向的方向正好截然相反,1表示它们的指向是完全相同的,0通常表示它们之间是独立的,而在这之间的值则表示中间的相似性或相异性。用简单的话来说,最相似的是1,最不相似的是-1。

在刚才的例子中,把用户在一些不相干的商品类别的爱好当做一个空间向量,把每个商品类别作为一个维度,我们例子中就有手机、平板、电脑、化妆品、零食、水果和玩具共7个维度。我们试着求一下10005这个用户和10006这个用户已知部分的爱好相似程度:

由于“用户10005”没有零食的记录,“用户10006”没有水果和玩具的记录,所以不需要用“用户10005”的零食维度的分数和“用户10006”的水果和玩具两个维度分数来计算相似度。

因为“最相似的是1,最不相似的是-1”。所以10005和10006两个用户的相似度还是很高的。同理也能够求出10005用户和其他任何一个用户的兴趣相似程度。

之后设置一个相似的阈值,如0.8、0.85……或者其他任何一个值,看看相似度超过这个阈值的用户都有什么购物喜好,把他们喜好购买的东西推荐给10005用户作为推荐方案即可(例如例子中,10005和10006的喜好高度相似,就可以将10006的喜欢的水果和玩具推荐给10005)。这就是一种思路最为朴素的基于用户的协同过滤算法思路。

除了上述通过分析用户的行为来设计这个用户相似度外,还可以考虑通过用户的画像思维来补充和完善这个用户协调过滤算法。用户属性表如表所示:

2. Item-based CF 基于商品的协同过滤

这种算法给用户推荐那些和他们之前喜欢的商品相似的商品。(天猫经常这么搞)

一般,推荐算法核心思想是,给用户推荐那些和他们之前喜欢的物品相似的物品。

比如,内容推荐算法的“基于内容的协同过滤”,用户A之前阅读过NBA的相关信息,该算法会根据此行为给你推荐所有NBA相关的内容(去看头条的,就是这个套路),但是基于物品的协同过滤有点不同,Item-based CF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。

Item-based CF算法认为,“有很多人喜欢商品A,同时他们也喜欢商品B,所以A和B应该是比较类似的商品。”计算起来可以分成以下两个步骤:

  1. 计算商品之间的相似度。
  2. 根据物品的相似度和用户的偏好来给用户生成推荐列表。

(一)计算物品之间的相似度

这里同样用到了余弦相似性来求物品的相似度,但是公式略有不同:

其中,|N(i)|是喜欢物品i的用户数,|N(j)|是喜欢物品j的用户数,|N(i)UN(j)|是同时喜欢物品i和物品j的用户数。

从上面的定义看出,在协同过滤中两个物品产生相似度是因为它们共同被很多用户喜欢,两个物品相似度越高,说明这两个物品共同被很多人喜欢。

这里面蕴含着一个假设:就是假设每个用户的兴趣都局限在某几个方面,因此如果两个物品属于一个用户的兴趣列表,那么这两个物品可能就属于有限的几个领域;而如果两个物品属于很多用户的兴趣列表,那么它们就可能属于同一个领域,因而有很大的相似度。

举例说明,首先我们假定有5个用户,分别为A、B、C、D、E,他们的商品购买记录分别如下:

这是一个水果店商店的销售记录,记录了每一个用户购买的产品内容。首先要分别得到每个用户购买物品的邻接矩阵,如用户A购物邻接矩阵如表所示:

这个矩阵就是根据刚刚看到的用户A的购买记录得到的,由于红酒、啤酒和显示器同时出现在他的购物列表里,所以“梨和苹果”、“苹果和荔枝”、“荔枝和西瓜”、“西瓜和梨”两两“邻接”,也就是说这些标注1的小格子代表这两种一起在一个人的购物记录里出现过一次——注意买过就算,不是必须出现在同一次购物篮里。

同理能够得到其他B、C、D、E几人的购物邻接矩阵(所有的邻接矩阵都是沿对角线对称的)。然后将A、B、C、D、E五人的邻接矩阵,通过矩阵“叠加”的方式,即将每一个矩阵的每个对应的方格数字相加,最后得到中间矩阵C,过程如下:

最终的叠加结果——ABCDE购买记录汇总:

从这个ABCDE购买记录汇总里,可以看到同时喜欢西瓜和梨的有2个人,同时喜欢柚子和板栗的有2个人,同时喜欢苹果和梨的有1个人……由于矩阵是对称的,我为大家都划出了对角线,大家看表格对角线的一边就行。

这时便可以计算任意两个商品的相似度做评估了,如计算西瓜和梨的相似程度,套用刚才的公式:

说明相似度极高,买西瓜的人必买梨,买梨的人必买西瓜。再试算一下板栗和柚子的相似度:

说明相似度极高,买板栗的人必买柚子,买柚子的人必买板栗。再试算一下西瓜和荔枝的相似度:

以此类推,便可计算出所有商品之间的相似度。

(二)根据物品的相似度和用户的历史行为给用户生成推荐列表

得到相似度后,便可以计算基于相似度的商品推荐列表了。计算完汇总列表之后,当要对一个用户做推荐时,先把这个用户的历史购买记录都列出来,假设有n个购买记录。然后对这个列表里每一个产品都用查表的方法查一次相似度,这样会得到n个列表,每个列表里都是一个产品和其对应的相似度的关系。把这n个列表做一个排序,相似度高的在前,相似度低的在后。如果要推荐3个商品就取前3个,如果要推荐5个商品就取前5个。

大概的推荐算法思路说到这大概就说完了,因为我们不是技术,产品经理了解到这个层面就差不多了。深挖一层还可以根据相似度和历史行为计算出用户对物品的感兴趣度,然后再给用户生成推荐列表。就是在相似度的维度上,在增加一个感兴趣的维度,作为推荐商品的衡量指标,思路相似,这里不再展开。

优缺点说明

优点是推荐都是基于用户的行为数据去不断学习和完善,在过程中发现用户的潜在商品兴趣,能给用户“制造惊喜”的同时,也在为自己制造惊喜。这是一个持续成长的过程,而推荐不过是其中的一个短程跑道,设计者的目光应该长远些,将最终的目放在构建行业的大数据库和用户画像的产业生态上。

缺点则是启动的门槛高,用户量不够时,商品量太少时几乎无法开展;并且学习量不够时推荐结果较差,就会导致文初说的“愚蠢”现象出现,这也是很多时候人工智能被大家吐槽为“人工智障”的原因之一。

关于个性化推荐的算法,在网上有很多资料,也有很多其他的实现方法。这里只是尝试以作为产品经理的角度,用较简单的语言来将自己学到的推荐算法原理剖析给大家听。

关于产品经理要不要懂技术的问题,也是老生常谈了,高论很多,不敢多赞一词。只说一句,产品经理在算法产品的设计中,绝不能一句“做个性化推荐”就完事的,你须深入算法内部,了解算法,然后结合产品特点来优化和设计。

 

作者:John,产品狗一枚,微信公众号:产品狗聚集地。欢迎一起沟通交流。

本文由@John 原创发布于人人都是产品经理,未经许可,禁止转载。

题图来自Unsplash, 基于CC0协议。

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 请问下如果1W个用户,采用基于用户的协同过滤算法,是不是每个用户都要去跟其他剩余用户去计算相似度得出推荐产品?

    来自福建 回复
  2. 写的真好,剖析了很多原理,干货满满,感谢分享

    来自辽宁 回复
  3. 荔枝和西瓜的相似度感觉是:1/根号(4*1)

    来自广东 回复