《推荐系统实战》- 笔记与思考

本文是笔者阅读《推荐系统实战》后的一篇读书笔记,包括了笔者的一部分浅显思考。书质量很是不错,有问题欢迎指正!算法


什么是好的推荐系统

推荐系统通常有两种:一种是预测用户评分,另外是给出TopN,但后者会更频繁更有用。由于预测分数并不能怎么样。“重点是他看了,而不是评价”。下面都以TopN为主。网络

衡量推荐系统有四个基本指标:机器学习

  • 准确率:
  • 召回率:
  • 覆盖率:对长尾物品的挖掘能力,全部用户的推荐总列表,占全部商品的比例,能够看出,K越大,覆盖率必定越高
  • 流行度:

更高级别的:性能

  • 新颖度: 这会让人眼前一亮,但很难经过离线计算得到,一般都用用户问卷。

如今主流推荐算法都有马太效应:强者越强,弱者越弱,会形成基尼系数的进一步提高。学习

距离和基于图的算法

基于距离的算法

用户购买的物品,能够记作矩阵。就有了ItemCF和UserCF,即经常使用的协同过滤。简单说,购买了类似物品的用户越类似,被用户同时购买的商品更类似。网站

对大部分东西的热度曲线,都呈现长尾效应:指数曲线。占20%的物品占据了80%的流量。越是重度用户,越会关心那些冷门的信息。spa

UserCF的推荐更社会化, 反映了用户在小型团体中兴趣的程度;和本身类似的人喜欢的,本身也喜欢。 ItemCF的推荐更个性化,反映了用户本身的兴趣:必定会喜欢购买相似的商品。设计

算法看似简单,但都有共同的问题,好比物品和物品是不一样的,新华字典的信息量确定没有《机器学习》来得大;人和人也是不一样的,一个书商购书行为,也和普通的文艺青年有所区别。所以,须要特别去调整频繁用户/物品的权重,避免污染整个数据集。日志

另外,若是物品特别多或更新频繁,就去更新用户矩阵。而若用户特别多,则可用物品矩阵。简而言之,没有最合适的方法,都须要根据具体业务场景来定义规则。排序

K值越大,须要考虑的用户和商品就越多,显然,对UserCF,能够提高覆盖率,但不必定能提高召回。对ItemCF, K越大会下降覆盖率(为何?)。
选择一个合适的K很重要。ItemCF的好处是其可解释性。

基于隐语义的算法

简单说,若是用户以前喜欢科技类书籍,那么就能够给他打标签,科技,以后便可推荐科技类书籍。

但问题是:

  • 不是全部的书籍都有准确的分类,好比数学or计算机
  • 分类很难提供准确的粗细粒度
  • 甚至不必定有合适的分类标签

这就是隐语义,能够经过相似聚类的方法,将Item作分类,但标签不必定是可解释的,也就是所谓的“隐”,即LFM。

LFM经过以下公式计算用户对某个商品的兴趣:

$Preference= p_u^Tq_i = \sum_(p_(u,k))^(i_(k,u)) $

分为两步, 其中\(P_(u,k)\) 度量了用户u的兴趣和k个隐变量的关系, \(q_(i,k)\) 度量了k个隐变量和商品i的关系。相似传导。很像SVD分解后的S矩阵和D矩阵。

这基本上把它当成了打分的问题(分类),可是负样本从哪里来?一些网站可经过“踩”表达负向,但不少时候只有正向。 负向可经过采样实现,比较好的实践方法:

  • 从热门,但用户却没有反馈的样本中抽取负样本
  • 对每一个用户,保证正负样本的平衡

以后便可经过SGD最小化均方偏差(SGD简直万能)。LFM比ItemCF和UserCF效果都好,但样本稀疏时,可能效果就不如了。另外,提高负样本的比率可有效提高系统的准确率和召回率。

基于图的算法

ItemCF和UserCF都只考虑了一层关系,但朋友的朋友若是也喜欢同样东西是否是我也会喜欢它呢?基于图的算法,比那几种考虑的更多。固然,计算量也更大。

方法是随机游走,将i和u都当作图上的点,有必定的几率转移和停顿,则通过屡次迭代,每一个节点被访问到的几率会逐渐趋于定值。称做PersonalRank算法。

可是,计算量太大,方法就是求逆矩阵。

3. 推荐系统的冷启动问题

当系统刚刚创建,数据并不彻底,所以不少计算没法实施,尤为是ItemCF。

两种解决办法:

用户相关

注册时提交喜爱信息,构建成最适合分类的二叉树,从而快速肯定用户的基本兴趣。

注册时提供基本信息,系统可根据性别/年龄和国籍来进行初步推荐。

商品相关

对商品进行分类,利用商品特征,作出关键词向量,开发线性分类器。向量空间模型的特色是简单容易实现,但却丢失了一些信息。 相比于协同过滤,它的性能低不少。

可是这也不必定,好比GitHub,可能会fork同一个做者的多个项目,所以将做者做为特征,能够很是强地模拟协同过滤。

LDA也能够对话题作出分类,这种方法比向量空间模型更为高级,可是其内部的数学原理,还需挖掘(待学习)。

另外是专家系统,经过专家对不一样维度进行打标,解决冷启动,这也有不少成功的案例。若是item较少,这种方式是很可行的。

冷启动表明了一系列问题,处理它须要必定的经验。

4. 用户标签

先理清UGC的概念,是User Generated Content的简称。标签是一种经常使用的方法,便于解释,用户可以方便地为商品打标,提高用户互动。

通常来讲,标签能够由系统自动产生(NLP),也能够由用户手工添加,包括如下类型:做者,主题,时间,评价,是否喜好等。

基线算法

统计用户最经常使用的标签,对每一个标签,统计被打过这些标签的最多的商品,而后把这些商品推荐给用户。

标签会随着系统发展,变得愈来愈多。所以类似的标签须要合并,不合理的标签要去掉,太过广泛的标签会被降权。

若是用户给的标签太少,则能够在已有的标签上,给出更多新的标签。

标签至关因而个纽带。一样标签也能被推荐,方法也很简单。

5. 利用上下文信息

时间上下文

用户在不一样场景下,心情是不一样的。所以行为和音乐确定也有所区别。实时性很是重要,此时,推荐系统变成了时变系统。

当用户对某个物品发生了点击时,就会触发一次推荐的更新,这种实时回流很是重要。是如何实现的呢?

  • 如何判断一个系统的时变速度

显然维基百科和youtube的物品时变速率大大不一样。新闻比电影的时变性更强。判断系统时变性有两种方法,T天以内,天天和前一天该物品的特征向量求类似度数值,能够扫出一条曲线。

  • 如何提升时变性

最简单的,在推荐列表中,一部分是推荐的,一部分是随机的。

当用户看过某件商品,就会对其作降权。不少推荐系统没法获得更多的回流数据,致使重复推荐。

每次都使用不一样的推荐算法来推荐。

  • 对时间增长权重

最近的行为,对此次的类似度贡献要比更早的行为更多。

固然,推荐系统要首先保证精度,再考虑推荐的实时性。

地点上下文

一些场景对地点很敏感,例如餐馆商场等。本地新闻也会提高用户的粘性。这个问题比较复杂,有一些方法能解决这个问题:

设计多层分类器,例如江苏南京用户,先对总体用户作推荐,再对中国用户推荐,再对江苏,最后是南京,几种模型进行叠加,最终生成结果。但问题是到分类树的枝杈时,数据已经很是稀疏了。

6. 推荐系统实例

基础结构

包括三个部分:UI,日志系统和推荐系统。

三个级别: 用户,特征,商品。先从用户生成特征,再经过特征找到商品。

三个步骤: 推荐,过滤,排序。

多个推荐系统能够进行投票,最终能够作推荐系统的推荐系统,按照不一样用户的需求生成推荐

7. 对于新闻推荐算法的思考

新闻有其独特的特色: 不断有新文章进来,以后又不断过时。实时性很高。ItemCF彷佛不可行。

用户会喜欢多个类目,但一旦热门新闻过来,门类反而不重要了。甚至一些观点认为,天天最热门的物品已经吸引了绝大多数用户的眼球,长尾物品不多获得用户关注。

而新闻自己的质量很是重要。一般好文章的阅读数远大于其余文章(长尾效应,二八原则)

若是没有社交信息,UserCF就也变得不可靠了。

须要对文章的做者提供适当的保护,不然马太效应明显。

拥有众多埋点行为可供参考,例如该页面停留时间,用户滑动行为,点击/点赞/踩。

8. 其余

从整本书,咱们可以分析一些通用的思路。

经过向量能够计算类似度,用共现可计算关系。可是,须要对热门u或i作惩罚,TF/IDF是个很好的思路。它不只能用于词汇,还能用于各类离散化的,对顺序无要求的系统中。

计算一个网络中多个节点的关系,能够用PersonalRank来实现,即随机游走。随机游走须要定义启动几率,通常是相同的。这种算法的好处,是可以评估横跨多个节点的弱关系。虽然图距离较远,但由于路径权重较大,颇有可能距离比直接节点还要近。

推荐系统是与人打交道的系统,如何提高交互的质量很是重要,例如可解释性。系统设计人员须要对业务有深刻的了解,例如电商推荐,商品的降价信息可能会极大地影响推荐的效果。但这个特征彷佛被忽视了。

太过复杂的算法,效果可能不必定好,由于可能没法知足实时性要求。或是在工程上成本过高,反而抵消了复杂算法实现的效果。

为何推荐系统会发布那么多论文,由于这里可变的参数实在太多了,而使用的环境又变幻无穷,上下文也会改变,很是适合大量的水论文。