深入浅出推荐系统之简单推荐模型
先来回答一个最关键的问题:到底什么是推荐系统?
下面从3个角度来回答:
它能做什么
它需要什么
它怎么做
先来第一个问题推荐系统能做啥?
推荐系统可以把那些最终会在用户(User)和物品(Item)之间产生的连接提前找出来。
此处关键就在于提前二字,推荐系统要从一个巨大的网络中,去提前发现人和物品之间的连接,并帮助这条连接尽可能早的建立起来。
第二个问题它需要什么?
发现人和物品之间连接的前提是,已经有足够多的连接存在了,推荐系统才可能去预测未来的连接。
第三个问题,怎么做?
有很多方式,本系列主要讲通过机器学习的方式。
我们现在知道了什么是推荐系统后,再来看下一个问题:我们什么时候需要推荐系统?
前面从3个方面介绍了什么是推荐系统,我们如果需要去预测连接,并且已经有足够多的连接了,那这个时候推荐系统就是必须的了。
上面有一个不好量化的点是:怎么去定义连接是否足够多?首先我们得知道影响人和物品连接的因素有哪些?
- 第一自然是物品数本身,如果产品中物品很少,少到用人工就可以应付过来,那么用户产生的连接肯定不多,因为连接数量的瓶颈在于物品的数量,这时候不适合搭建推荐系统。
- 第二是用户和物品数量在某些手段下也变得很多,但是用户和物品之间的连接很少,表现就是用户的留存回访很低,这时候也不是很需要一个推荐系统,此时应该想办法找到用户流失的原因,直到他们能贡献第一批连接才行。
我们有一个简单的公式来判断是否需要推荐系统:
分子是增加的连接数,分母是增加的活跃用户数和增加的有效物品数。
如果增加的连接数主要靠增加的活跃用户数和增加的物品数贡献,则该值会较小,不适合加入推荐系统;
如果增加的连接数和新增活跃用户和物品关系不大,那说明连接数已经有自发生长的趋势了,适合加入推荐系统加速这一过程。
下面我们开始介绍最简单的推荐系统:基于流行度的推荐模型。
流行度模型
推荐系统中最基本的推荐模型:基于流行度的推荐模型,通俗讲就是什么内容吸引用户就推荐用户什么内容。
这边一个衡量内容的标准是流行度,而影响物品流行度的因素有两个:
时间:上下班时间,大家打开头条的可能性会大于其他时间段,自然文章的关注度就高,但是这并不能表明文章的质量就高。
位置:这个“位置”并不是真正的地理位置,而是在一个服务或者网站的什么位置显示你的物品。比如说,在绝大多数的搜索引擎服务中,排名第一的物品所受到的关注度很可能大大高于排名第二和之后的物品。
因此,我们在衡量流行度上就不能使用绝对值,而应该使用的是一个“比值”(Ratio),或者是计算某种“可能性”(Probability)。
一个可行的方式就是计算点击率。如果从数学上对点击率建模,其实可以把一个物品在显示之后是否被点击看成是一个“伯努利随机变量”,于是对点击率的估计,就变成了对一个伯努利分布参数估计的过程。
对于伯努利参数估计,我们可以采用最大似然估计,假设点击的概率为p,则总共N次展现,其中有n次点击,则出现的概率为:
P = p^n * (1-p)^(N-n)
对上面的概率两边取log,得到
log§ = nlog§ + (N-n)log(1-p)
求导,得到p=n/N的时候得到极值。
但是当物品的N或者n为0的时候,此时通过最大似然得到的p其实都不是很准确。
于是现在我们遇到的问题是:N或者n为0 的时候,此时最大似然估计并不能很好地反应这些物品的真实属性。
一种解决方法是采用先验分布,这就引出了共轭先验分布的概念。
伯努利分布的共轭分布是beta分布,其用到了贝叶斯公式,其核心公式是:
后验分布 = 似然函数* 先验分布/ P(X)
关于共轭先验这部分可以查看之前的文章主题模型:LDA 数学基础(https://www.zybuluo.com/zhuanxu/note/1016850),此处我们知道Beta分布给出了p的先验分布即可。
另外一种解决方案是基于不同的时间段来预估点击率,我们可以使用上一时间段的点击率作为先验知识来更加准确地估计现在这个时段的点击率。
相似度模型
介绍完基于流行度的推荐模型后,我们接着看基于相似信息的推荐模型,这类模型又叫做协同过滤,其总结起来就是:
相似的用户可能会有相似的喜好,相似的物品可能会被相似的人所偏好。
于是我们就要去寻找相似的用户或者相似的物品。
协同过滤的核心思想是借用数据,具体理解就是在用户 A 数据不足的情况下,我们挖掘到可以借鉴的用户 B,从而利用用户B的数据来完善A。
其原理是我们把用户 A 和用户 B“聚类”到了一起,认为他们代表了一个类型的用户。我们把对单个用户的建模抽象到了某个类型的用户,从而能够获得更多的数据。
协同主要有两类:
基于记忆的协同
用户协同
物品协同
基于模型的协同
基于记忆的协同,其重点在于记忆,记住每个人消费过的物品,然后给他推荐,此时又可细分为
用户协同:跟你相似的人都消费过什么
物品协同:跟你消费过物品相似的物品有哪些
因此基于记忆的协同,重点就在于去找相似的用户或者相似的物品,我们先来看相似的用户。
用户协同
用户协同背后的思想是:根据用户的历史行为,对用户进行聚类,然后基于同一类用户的共同喜好,给用户推荐物品。
用户协同的核心公式:
我们来解读下上面的公式:
公式左边的表示用户u对物品i的预测,公式右边是一个关于用户u和用户j的一个相似度加权,表示用户u和用户j的相似度,表示用户j对物品i的评分。
有了上面的公式后,我们就来看实际生产中要运用的话,需要注意的几个地方:
- 用户向量我们通过物品来表示,如果物品个数很多,则用户向量维度很高,计算向量相似度耗时
- 因为要计算任意两个用户的相似度,所有复杂度为
- 要计算每个用户和物品之间的相互关系,复杂度是
针对上面的问题,可以看我github上的代码(https://github.com/zhuanxuhit/kaggle/blob/master/tencentAd/2-协同过滤版本.ipynb)是如何解决的,欢迎大家star。
物品协同
物品协同的关键公式如下:
有了前面用户协同的基础后,可以很容易的看懂。此处我们需要记住的关键点是:
用户协同由于用户基数远大于物品数,所有计算成本高
用户协同中,用户和用户之间有共同的消费行为实际上是比较少的,即使有一般也都是热门物品,对用户相似度计算帮助不大
用户的喜好相比于物品的特征变化快
总结来说:物品协同就是根据用户已有记录的物品,去找跟这些物品最相似的物品。
slope one 算法
slope one 算法是面对物品协同中模型无法在线更新的问题而提出的。
其主要创新点在于引入了:
- 通过引入两个物品的共同用户数量来代表两个物品差距的置信程度
- 模型可以在线实时更新
总结
本文介绍了两种推荐模型:
基于流行度的推荐模型
基于相似信息的推荐模型和基于内容特征的推荐模型
其中基于流行度的模型简单有效,可以通过一些先验知识,解决部分冷启动问题,而基于相似信息的推荐模型则是充分利用群里智慧,通过聚类的方式来解决用户、物品稀疏的问题。