互联网的常见推荐算法

没有复杂的公式,没有晦涩的技术词汇,从最简易的案例,了解互联网最常见的推荐算法。

一、《从电影推荐开始,聊协同过滤

  • 什么是协同过滤

  • 协同过滤的3步骤

  • 一张excel表格,秒懂协同过滤


工程架构方向的程序员,看到推荐/搜索/广告等和算法相关的技术,心中或多或少有一丝胆怯。但认真研究之后,发现其实没有这么难。  

什么是协同过滤(Collaborative Filtering)?

:通过找到兴趣相投,或者有共同经验的群体,来向用户推荐感兴趣的信息。

 

举例,如何协同过滤,来对用户A进行电影推荐?

:简要步骤如下

  • 找到用户A(user_id_1)的兴趣爱好

  • 找到与用户A(user_id_1)具有相同电影兴趣爱好的用户群体集合Set<user_id>

  • 找到该群体喜欢的电影集合Set<movie_id>

  • 将这些电影Set<Movie_id>推荐给用户A(user_id_1)

 

具体实施步骤如何?

:简要步骤如下

1)画一个大表格,横坐标是所有的movie_id纵坐标所有的user_id交叉处代表这个用户喜爱这部电影


如上表:

  • 横坐标,假设有10w部电影,所以横坐标有10wmovie_id,数据来源自数据库

  • 纵坐标,假设有100w个用户,所以纵坐标有100wuser_id,数据也来自数据库

  • 交叉处,“1”代表用户喜爱这部电影,数据来自日志

画外音:什么是“喜欢”,需要人为定义,例如浏览过,查找过,点赞过,反正日志里有这些数据

2)找到用户A(user_id_1)的兴趣爱好


 如上表,可以看到,用户A喜欢电影{m1, m2, m3}

3)找到与用户A(user_id_1)具有相同电影兴趣爱好的用户群体集合Set<user_id>


如上表,可以看到,喜欢{m1, m2, m3}的用户,除了u1,还有{u2, u3}

4)找到该群体喜欢的电影集合Set<movie_id>


如上表,具备相同喜好的用户群里{u2, u3},还喜好的电影集合是{m4, m5}

画外音:“协同”就体现在这里。

5未来用户A(use_id_1)来访问网站时,要推荐电影{m4, m5}ta


二、《从职位推荐开始,聊内容推荐

  • 什么是基于内容的推荐

  • 基于内容的推荐的3步骤

  • 明明职位要求6000+,为啥会出3000+的推荐结果

什么是基于内容的推荐(Content-based Recommendation)?

:通过用户历史感兴趣的信息,抽象信息内容共性,根据内容共性推荐其他信息。

比如,如何通过基于内容的推荐,来对求职者A进行职位推荐?

:简要步骤如下

  • 找到用户A历史感兴趣的职位集合

  • 找到职位集合的具化内容

  • 抽象具化内容的共性内容

  • 由这些共性内容查找其他职位,并实施推荐

具体实施步骤如何?

:简要步骤如下

1得到求职者A访问过三个职位,假设分别是{zw1, zw2, zw3},这些数据可以从历史日志得到。

2)由职位集合得到职位具化内容

zw1 -> {程序员北京月薪8000, 3年经验本科}

zw2 -> {程序员北京月薪6000, NULL, 研究生}

zw3 -> {程序员北京月薪6000, 5年经验, NULL}

这些数据可以从职位数据库里得到。

3)由职位具化内容抽象出职位共性信息

例如,由上述职位1,职位2,职位3抽象出的共性职位信息为:

{程序员北京月薪6000+, NULL, NULL}

4)由这些共性内容查找其他职位并实施推荐

{程序员北京月薪6000+, NULL, NULL}为查询条件,查询职位数据库,并按照一些规则进行排序(例如,最新发布的职位先推荐,点击过的职位不推荐等),完成推荐。

如果查询的结果集过小,可以缩小条件召回,例如可以将查询条件缩小为{程序员北京月薪3000+, NULL, NULL}

基于内容的推荐,原理如上,希望这1分钟,大家能有收获。


三、《我不是潘金莲,聊相似性推荐

  • 没有用户行为数据,能不能做电影推荐

  • 相似度推荐的简易原理与实现

  • 如何计算《我不是潘金莲》与《芳华》的距离

“协同过滤Collaborative Filtering”和“基于内容的推荐Content-based Recommendation”,都必须分析用户的历史行为数据(例如电影点击数据,职位查看数据等),针对不同的用户进行个性化推荐。如果系统没有用户的历史行为数据积累,如何实施推荐呢?

 

什么是“相似性推荐”?

:对于新用户A,没有ta的历史行为数据,在ta点击了item-X的场景下,可以将与item-X最相似的item集合推荐给新用户A

问题转化为,如何用一种通用的方法,表达item之间的相似性。


仍以电影推荐为例,新用户A进入了《我不是潘金莲》电影详情页,如何对A进行电影推荐呢?

先看二维空间的点N,如何推荐与其最近的点?

:可以用二维空间中,点与点之间的距离,表示点之间的远近。


对于全集中的任何一个点M(xi, yi),它与点N(x1, y1)的距离:

distance = (x1-xi)^2 + (y1-yi)^2

所以,只要计算全集中所有点与N的距离,就能计算出与它最近的3个点。


再看三维空间的点N,如何推荐与其最近的点?

:可以用三维空间中,点与点之间的距离,表示点之间的远近。


对于全集中的任何一个点M(xi, yi, zi),它与点N(x1, y1, z1)的距离:

distance = (x1-xi)^2 + (y1-yi)^2 + (z1-zi)^2

所以,只要计算全集中所有点与N的距离,就能计算出与它最近的3个点。

循序渐进,对于一部电影《我不是潘金莲》,假设它有10个属性,则可以把它看做一个十维空间中的点

N《我不是潘金莲》

{

导演:冯小刚

女主:范冰冰

男主:郭涛

女配:张嘉译

男配:大鹏

类型:剧情

地区:中国大陆

语言:普通话

日期:2016

片长:140

} 

对于电影全集中的任何一部电影,都可以计算与点N《我不是潘金莲》之间的距离。二维三维中的点,可以用直线距离计算远近,10维空间{导演女主男主女配男配类型地区语言日期片长}中的两个点的距离,需要重新定义一个距离函数,例如:

distance = f1(导演) + f2(女主) + … +f10(片长)

这个距离,通俗的解释,就是每个维度贡献分值的总和。


分值可以这么定义:

f1(导演){

         如果两部电影导演相同,得1;

         如果导演不同,得0;

}

 

例如,现在10维空间中,有另一个点M《芳华》

{

导演:冯小刚

女主:苗苗

男主:黄轩

女配:NULL

男配:NULL

类型:剧情

地区:中国大陆

语言:普通话

日期:2017

片长:140

}

 

要计算点M《芳华》与点N《我不是潘金莲》的距离,代入distance距离计算公式:

distance = f1(导演) + f2(女主) + … +f10(片长)

         =1 + 0 + … + 1

         =5

即:导演、类型、地区、语言、片长相同各得1分,其他维度不同得0分。

 

遍历电影全集中的10w部电影,就能找到与点N《我不是潘金莲》最相近的3部电影,当用户点击《我不是潘金莲》的详情页时,直接推荐这3部最相近的电影即可。

 

相似性推荐,原理大致如上,要说明的是:

  • 由于没有用户历史行为积累,不是个性化推荐,所以所有用户的推荐结果都是相同的

  • 一般来说,距离公式确实是线性的

  • 一般来说,每个维度的权重不一样

  • 这个线性公式,以及维度的权重,都可以通过机器学习训练出来


四、《从啤酒与尿布,聊关联规则推荐

  • 什么是关联规则推荐

  • 没有公式,也能秒懂支持度、置信度、提升度

  • 一张excel表格,秒懂关联规则推荐

一、概念

什么是关联规则(Association Rules)?

:关联规则是数据挖掘中的概念,通过分析数据,找到数据之间的关联。电商中经常用来分析购买物品之间的相关性,例如,“购买尿布的用户,有大概率购买啤酒”,这就是一个关联规则。

画外音:如果把买尿布记作A,买啤酒记作B

“买尿布的用户有较大概率买啤酒”这个关联规则记作A -> B

 

什么是关联规则推荐(Association Rule Based Recommendaion)?

:顾名思义,利用关联规则,来实施推荐。关联规则推荐的目标,是希望达到

 “将尿布放入购物车之后,再推荐啤酒”

“直接推荐啤酒”

获取有更好的售卖效果

画外音:这个目标非常非常重要,有些场景,或许直接推荐更有效。

 

关联规则推荐的典型应用

  • 线下,可以将尿布和啤酒放在一起

  • 线上,可以在用户将尿布放入购物车后,立刻推荐啤酒

 

二、如何实施

假设某电商会售卖ABCD四种商品,历史上共5笔订单,分别卖出{A,B,C}, {B,C,D}, {A,B,C,D}, {A,C}, {C} 如何来实施“关联规则”推荐呢?

 

第一步:数据准备


如上图,纵坐标所有历史订单横坐标每笔订单售出的商品

 

第二步:计算关联规则(组合商品)的支持度

 

什么是支持度(support)?

:共5笔订单,3笔包含商品AA的支持度是3/5


很容易计算出,各个商品的支持度。从支持度可以看出,Best Seller是商品C100%的订单中都包含商品CC的支持度是1。

 

除了单个商品,组合商品也有支持度。


5笔订单,2笔同时包含AB,即A->B的支持度是2/5

画外音:全局总共4种商品,假设关联规则只关联2种商品,则一共需要计算C(4,2)6种组合商品的支持度{AB,AC,AD,BC,BD,CD}

 

支持度评估商品包含在订单中的“概率”,一个订单,有多大概率包含这个商品。

画外音:一般会先对支持度高的商品实施推荐,如果先实优化支持度低的商品,即使推荐效果翻倍,总体订单提升效果也会很有限。

 

第三步:计算关联规则的置信度

 

什么是置信度(confidence)?

:已知购买了A,有多大概率购买了B(即同时购买了AB),称A -> B的置信度。


可以看到,商品A3次购买,这3次中有2次购买了BA->B的置信度是2/3

 

画外音:额,本来不想贴公式的

confidence(A->B) = support(A->B)/support(A)= (2/5)/(3/5) = 2/3

这也相对比较好理解,

  • 分子:support(A->B)是同时购买AB的比例

  • 分母:support(A)是只购买A的比例

二者相除,得到“购买了A,有多大概率购买B”,置信度的本质是条件概率

 

这里需要注意的是,X->YY->X的置信度不一定相等。


如上图:

B->C的置信度是1,买商品B时,100%会买C

C->B的置信度是3/5,买商品C时,只有3/5买了B

画外音:

support(B->C)=3/5

support(C->B)=3/5

confidence(B->C)=support(B->C)/support(B)=1

confidence(C->B)=support(C->B)/support(C)=3/5

公式是给程序看的,excel表格是给人看的,结果都一样。

 

第四步:计算关联规则的提升度

 

上一个例子里,confidence(B->C)=1,即:如果用户购买商品B100%会买C,那是不是意味着,如果用户将商品B放入购物车,就可以向用户推荐商品C呢?

:不是。

 

我们来回顾一下,关联规则推荐的目标,是希望达到

 “将尿布放入购物车之后,再推荐啤酒”

“直接推荐啤酒”

获取有更好的售卖效果


虽然购买商品B100%会买C

画外音:confidence(B->C)=1

但直接推荐C,用户也100%会买C

画外音:support(C)=1

 

会发现,购买B与购买C是独立事件,用户买不买C和用户买不买B没有直接关系。这里的关联规则推荐,并没有比直接推荐获取更好的效果

 

用什么指标来评估关联规则推荐的效果呢?

:提升度。

 

什么是提升度(lift)?

A->B关联规则推荐,与直接推荐B,的比值,可以用来评估推荐效果:

  • 大于1,说明有效,在购买A时推荐B,比直接推荐B,效果更好

  • 等于1,说明无关,购买A与购买B,是独立事件

  • 小于1,说明负相关,购买A时推荐B,效果还不如直接推荐B

画外音:又有公式了

lift(A->B) =confidence(A->B)/support(B)

这也相对比较好理解,

  • 分子:confidence(A->B),购买A时,有多大概率同时购买B

  • 分母:support(B),有多大概率直接购买B

二者相除,得到效果是否更好。

 

还是通过两个直观的例子来看。


来看看关联规则A->B,与直接推荐B,效果有没有提升:

  • 3个订单购买A,这3个订单中有2个订单购买了B,所以A->B的置信度是2/3,即买了A2/3的概率会买B

  • 直接推荐B的话,5个订单中有3个购买了B,所以B的支持度是3/5即有3/5的概率会直接买B

会发现,关联规则推荐的效果更好

 

画外音:根据公式

confidence(A->B) =support(A->B)/support(A) = 2/3

support(B) = 3/5

lift(A->B) =confidence(A->B)/support(B) = 10/9

lift(A->B) > 1,故关联规则推荐是正相关的。

 

来看看关联规则A->D,与直接推荐D,效果有没有提升:

  • 3个订单购买A,这3个订单中有1个订单购买了D,所以A->D的置信度是1/3,即买了A1/3的概率会买D

  • 直接推荐D的话,5个订单中有2个购买了B,所以D的支持度是2/5,即2/5的概率会直接买D

会发现,关联规则推荐的效果很差,还不如直接推荐。

 

画外音:根据公式

confidence(A->D) =support(A->D)/support(A) = 1/3

support(D) = 2/5

lift(A->D) = confidence(A->D)/support(D)= 5/6

lift(A->B) < 1,故关联规则推荐是负相关的。

 

三、总结

  • 关联规则A->B推荐,目标是,在“用户将A放入购物车时,推荐B”比“单独推荐B”获取更好的效果

  • A->B的支持度,是用户同时购买AB概率

  • A->B的置信度,是用户购买A的同时,有多大概率购买B

  • A->B的提升度,是“用户购买A的同时,有多大概率购买B”与“直接购买B的概率”的比值

1)这个值大于1时,说明A->B有正向效果

2)这个值等于1时,说明AB是独立事件

3)这个值小于1时,说明A->B有负向效果


五、《“相同距离,不同价格”里的个性化推荐

  • 为什么相同起点,相同终点,价格却不同

  • 用户分级,个性化推荐秒懂

  • 杀熟与杀豪是个性化的两大利器


方式一:“用户分级”

对用户进行分级,不同类型的用户会有不同的补贴,定价,营销策略。


以网约车用户为例,不同用户的营销策略不同。

待拉新用户

  • 竞品用户:短信发大额优惠券营销

  • 竞品重合用户:短信发优惠券营销

  • 沉默用户:定额微信红包唤醒

 

首单用户:大额折扣券或者直减券

 

非首单用户

  • 2单用户:降低优惠券金额试探

  • 3单用户:降低优惠券金额试探

  • 疑似粘性用户:随机优惠券试探

  • 强粘性用户:意思意思优惠券

 

所以,对于“相同起点,相同终点的两个手机打车”,可能出现:

  • 新手便宜

  • 熟客贵

 

方式二:“个性化推荐”

对用户的历史行为进行分析,抽象用户的标签,针对不同标签的用户进行不同的补贴,定价,营销策略。

 

例如

平台可以从日志中分析出用户A的历史特征是:

  • 有优惠券也不使用

  • 等待30秒没人接单就加价

  • 等待60秒没人接单就打专车

可以分析出:用户A是土豪,对接单时间敏感,对价格不敏感

 

从日志中分析出用户B的历史行为特征是:

  • 没有优惠券就不下蛋

  • 宁愿等待10分钟也不加价

  • 从不打专车,也绝不在高峰期(价格会加倍)打车

可以分析出:用户B是屌丝,对价格敏感,以省钱为优先

 

于是,用户A和用户B同时打车,可能出现:

  • 时间敏感的用户A

  • 价格敏感的用户B便宜

 

从历史数据,一定能还原出真实的你,“杀熟,杀豪”是个性化价格的两大利器,土豪们,你被个性化定价了吗?



相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页