流行度模型
推荐系统中最基本的推荐模型:基于流行度的推荐模型,通俗讲就是什么内容吸引用户就推荐用户什么内容。
这边一个衡量内容的标准是流行度,而影响物品流行度的因素有两个:
-
时间:上下班时间,大家打开头条的可能性会大于其他时间段,自然文章的关注度就高,但是这并不能表明文章的质量就高。
位置:这个“位置”并不是真正的地理位置,而是在一个服务或者网站的什么位置显示你的物品。比如说,在绝大多数的搜索引擎服务中,排名第一的物品所受到的关注度很可能大大高于排名第二和之后的物品。因此,我们在衡量流行度上就不能使用绝对值,而应该使用的是一个“比值”(Ratio),或者是计算某种“可能性”(Probability)。
一个可行的方式就是计算点击率。如果从数学上对点击率建模,其实可以把一个物品在显示之后是否被点击看成是一个“伯努利随机变量”,于是对点击率的估计,就变成了对一个伯努利分布参数估计的过程。
对于伯努利参数估计,我们可以采用最大似然估计,假设点击的概率为p,则总共N次展现,其中有n次点击,则出现的概率为:
P = p^n * (1-p)^(N-n)
对上面的概率两边取log,得到
log(P) = nlog(p) + (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的评分。
有了上面的公式后,我们就来看实际生产中要运用的话,需要注意的几个地方:
1. 用户向量我们通过物品来表示,如果物品个数很多,则用户向量维度很高,计算向量相似度耗时
2. 因为要计算任意两个用户的相似度,所有复杂度为O(n2)
3. 要计算每个用户和物品之间的相互关系,复杂度是O(mn)
针对上面的问题,可以看原作者github上的代码(https://github.com/zhuanxuhit/kaggle/blob/master/tencentAd/2-协同过滤版本.ipynb)是如何解决的。
物品协同
物品协同的关键公式如下
有了前面用户协同的基础后,可以很容易的看懂,此处我们需要记住的关键点是:
-
用户协同由于用户基数远大于物品数,所有计算成本高
-
用户协同中,用户和用户之间有共同的消费行为实际上是比较少的,即使有一般也都是热门物品,对用户相似度计算帮助不大
-
用户的喜好相比于物品的特征变化快
总结来说,物品协同就是根据用户已有记录的物品去找跟这些物品最相似的物品
作者:zhuanxu
来源:
https://www.zybuluo.com/zhuanxu/note/1104086