热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【每周一篇】常用推荐算法总结

本文主要来源:阿里云天池技术圈常用推荐算法(50页干货)部分进行总结和详细解释(原文属于比较精炼没有侧重点的提纲࿰

本文主要来源:阿里云天池技术圈常用推荐算法(50页干货)
部分进行总结和详细解释(原文属于比较精炼没有侧重点的提纲)
适合和我一样的推荐算法小白和入门者


主要内容


一.推荐系统简介


  • 信息过载
    从海量信息中过滤出用户需要的信息。
  • 信息过滤三种方法:
    1.类目导航(如:搜狗,用户按类目逐层查找)
    2.搜索(如:谷歌,用户提供意图明确的query)
    3.推荐(如:头条,系统主动给提供用户选择)
  • 推荐系统的发展史(略)
  • 推荐系统的应用和价值(略)
  • 推荐系统的评价标注(重要):
    1.用户满意度:调研、用户反馈,点击率、转化率等
    2.准确性:prediction/recall/F-score三个参数的具体解释
    3.覆盖率:照顾到尾部物品和用户
    4.多样性:两两之间不相似
    5.新颖性:没听过,没见过的物品
    6.惊喜性:。。?
    7.用户信任度/可解释性:推荐理由
    8.鲁棒性/健壮性:哈利波特现象1,抗攻击、反作弊
    9.实时性:新加入的物品;新的用户行为(实时意图)
    10.商业目标:一个用户带来的盈利

  • 推荐系统的核心问题:
    如何评价一个用户(user)对一个物品(item)的评分(喜欢程度)
    在这里插入图片描述
  • 影响推荐效果的因素
    1.用户交互界面(用户对推荐系统第一感知)
    2.数据
    数据收集:有效性(真实、准确)、全面性(是否有偏)
    数据处理:清洗、挖掘
    3.领域知识(产品定位、具体推荐需求的理解)
    4.算法迭代(锦上添花)
  • 推荐算法的两个阶段
    在这里插入图片描述

二.传统的推荐算法


  • 非个性化推荐:热度排行
  • 协同过滤:
    • Memory-based(aka neighborhood-based)方法:Item-based/user-based CF
    • Model-based方法:频繁项挖掘/聚类/分类/回归/矩阵分解/RBM/图模型
  • 基于内容/知识的推荐(Content-based/Knowledge-based)
  • 混合方法(Hybird Approaches)

热度排行


  • 不同的排行榜算法:
    • 单一维度的投票(旧版的Delicious)
    • 多个维度综合打分
    • 加入时间因素:引入衰减权重(半衰期、冷却定律) (Hacker News)
    • 考虑反馈信息:如Reddit算法
    • 考虑置信度:如威尔逊区间
    • 防止马太效应:如MAB算法等
      (我在这里还专门百度了一下马太效应hhh)
  • 评价
    • 容易实现
    • 更新慢,难以推新
    • 排行榜更多是业务问题而不是算法问题

协同过滤(Collaborative Filtering)


  • 思想来源(略)
    示例图
  • 基本组成元素:
    • N个用户,M个物品
    • 评分矩阵:用户对物品的评分(显式)或用户对物品的行为(隐式)
    • 相似性度量:物品与物品(人与人) 之间的相似性

Memory-based

将用户的所有数据读入内存中进行运算,所以被称为Memory-based


User-based CF

算法步骤


  • Step1 协同(在线)
    计算目标用户的(前k个)相似用户(neighborhood)
    • 相似性度量:Pearson相关系数、Jaccard距离、cosine相似性
  • Step2 找出相似用户喜欢的物品,并预测目标用户对这些物品的评分
    • 预测模型:KNN,regression
  • Step3 过滤(离线)
    过滤掉目标用户已经消费过的物品
    • 消费:购买商品,浏览新闻等
  • Step4 将剩余物品按照预测评分排序,并返回前N个物品

Item-based CF

  • 2001年,Sarwar等人提出了item-based的CF
  • 2003年,Amazon介绍了其Item-to-item算法
  • 基本思想:计算item之间两两的相似性,目标用户对某个item的评分可以根据其对相似的items的评分来预测,选取用户预测评分最高的前N个商品进行推荐
  • 电商推荐中成为主流的原因:
    • 降低实时计算复杂性
    • 解决用户的冷启动问题

User-based VS Item-based

  • Item-based:准确性好,表现稳定可控,便于离线计算;但是推荐结果多样性会差一些,一般不会有惊喜感
  • User-based:帮助用户发现新的商品,但是需要复杂的在线计算,需要处理新用户的问题。
  • Item之间的相似性比较单纯,是静态的;而User之间的相似性比较复杂,而且是动态的,用时需要注意

协同过滤的优缺点

  • 优点
    • 需要很少的领域知识,模型通用性强
    • 工程上实现简单,效果很好
  • 缺点
    • 冷启动问题(new users/items)
    • 数据稀疏性问题
    • 假定"过去的行为决定现在",没有考虑具体情况的差异
    • 热门倾向性(Popularity Bias):很难推荐出小众偏好

最近邻算法

最近邻算法


  • 领域大小的选择:

    • 太小不具有代表性
    • 太大噪音数据
  • 最近邻的查找:Locality-senseitive-Hashing

    • Locality-sensitive:相似的item哈希后仍保持较大概率相似,这样在计算相似性时可以只关注少量的候选集,从而大大加快相似项的查找速度。
    • 利用适当的hash将原来(高维)空间的数据哈希到一个新的(低纬)空间,得到签名矩阵(Signature Matrix),然后利用签名矩阵计算原空间的相似性。
    • hash函数的选择跟相似性度量选取有关,例如相似性度量是Jaccard距离,hash函数通常选用MinHash/SimHash(可证,MinHash的hash值相等的概率等于其原空间的Jaccard相似度)

MinHash例子

MinHash


SimHash例子

(感觉这个有点难,后面会重点看)
SimHash
整个过程可以分为以下几步:
1.选择Simhash的位数(比如32位),并将各位初始化为0
2.提取原始文本中的特征及其权重
3.计算各个word的hashcode
4.对各word的hashcode的每一位,如果该位为1,则在Simhash的相应位加它的权重;否则在Simhash的相应位减去它的权重。
5.对最后得到的32位的SimHash,如果该位大于1,则设为1,否则设为0

(这一部分我还没太搞懂,后面应该会专门找一个代码实践一下= =)


Mode-based CF


  • 关联规则,如Apriori,FP-Growth
  • 聚类
  • 分类/回归模型
  • 隐语义模型,如LSA/pLSA/LDA
  • SVD,SVD++
  • RBM
  • 图模型,如SimRank,MDP

关联规则(Associate Rule)

  • 基本思想:基于物品之间的共现性挖掘频繁项
  • 一般应用场景:看了又看,买了又买,商品搭配
  • 算法:A-priori、FP-Growth
    • 支持度(support)
      在这里插入图片描述
    • 置信度(confidence)
      在这里插入图片描述
  • 评价
    • 实现简单,通用性较强,适合“推荐跟已经购买的商品搭配的商品”等场景
    • 相似商品的推荐效果往往不如协同过滤好
    • 解释变量之间的关联时要特别小心,很可能受一些隐含因素的影响,得出完全相反的结论(辛普森悖论)

辛普森悖论(Simpson’s Paradox)

如图所示的一个例子:
辛普森悖论


  • 英国统计学家辛普森在1951年提出来的,两组数据分别讨论时都会满足某种性质,可是一旦合并考虑,却可能导致相反的结论。
  • 产生辛普森悖论的主要原因是数据的不同分组之间基数差异很大(一个组相对于其他组来说数量占绝对优势)
  • 数学解释
    数学解释
  • 结论:分析数据时合理的将数据分组(分层)很重要

基于统计的相似性

  • OddsRatio
    表格
    OddsRatio(item1,item2)
    = Odds(item2|item1)/Odds(item2|!item1)
    = (N11N22)/(N12N21)
    解释:OddsRatio 值表示“看了item1的用户中看了item2的用户数与没看item2的用户数的比例N11/N12”与“没看item1的用户中看了item2的用户数与item2的用户数的比例N21/N22”的比值。该比值大于1表明看了item1的用户更倾向于看item2,并且OddsRatio值越大,说明item1到item2的关系越紧密。
    (这段话引号部分我读了三遍才绕过来= =真是绝了)
    平滑:LogOddsRatio(item1,item2)=logN11+logN22-logN12-logN21

聚类(Clustering)

聚类算法


  • 用户分群:同好人群
    • 有时可以带给用户惊喜感,但个性化稍差(人群vs个体)
  • 商品聚类:相似商品
    • 精确性较高,但推荐的商品对用户大多无新鲜感
  • 常用算法
    • K-means,层次聚类(HC)
    • Louvain(2008),基于密度的聚类方法(2014)
  • 评价
    • 聚类可以一定程度解决数据稀疏性问题,捕捉到一些隐(扩展)
      相似性
    • 聚类的精准度往往不如协同过滤好

分类/回归

  • 基本思想:把评分预测看做一个多分类(回归)问题
  • 常用分类器:LR,Naive Bayes
  • 输入:通常是item的特征向量
  • 评价:
    • 比较通用,可以跟其他方法组合,提高预测的准确性
    • 需要大量训练数据,防止过拟合现象

矩阵分-SVD分解

  • 数学上的SVD
    SVD
    SVD2
  • 传统SVD应用到推荐中的挑战
    • SVD要求矩阵必须是稠密矩阵,而评分矩阵非常稀疏
    • SVD计算复杂度很高,在稠密大规模矩阵上运行速度很慢

↓↓↓ 下面部分公式因为太难打了都是使用的截图。。。。。


FunkSVD

  • 2006nian ,Simon Funk公布了算法(FunkSVD)
  • 思想:评分矩阵R分解为两个低秩矩阵的乘积在这里插入图片描述
    ,则用户u对物品i的评分为在这里插入图片描述
    ,利用RMSE为目标去学习P、Q,并且学习过程中不关心缺失值
    在这里插入图片描述

BiasSVD

  • 思想(基本假设)
    • 评分系统有一些跟用户和物品无关的固有属性
    • 用户有一些跟物品无关的固有属性
    • 商品有一些跟用户无关的固有属性

引入偏置项


SVD++

  • 思想:考虑用户的隐式反馈(提供额外的用户偏好信息)
    SVD++

Item的向量化

  • 为什么进行向量化
    • 知识、概念的表示
    • 为智能推荐系统的设计提供了强有力的工具
  • 向量化的常用方法
    • pLSA(Thomas Hofmann,1999)
    • LDA(David M. Blei,2003)
    • Word2Vec(Mikolov,2013)
  • 实际应用的问题
    • 向量化时大多基于行为数据,行为少的item向量化效果不好

限制玻尔兹曼机(RBM)

  • Boltzmann机
    在这里插入图片描述

    • 两层神经网络(无输出层)
    • 对称、全连接
    • 随机:每个神经元只有两种状态(激活/未激活),通常用0/1表示,但是某一时刻处于哪种状态是随机的,由一定的概率确定
  • 受限Boltzmann机

    • 受限:层内无连接(大大简化计算)
      在这里插入图片描述

RBM中隐藏层的作用

  • 图像去噪和重构的例子
    在这里插入图片描述

在这里插入图片描述


  • 问题:N个用户,M个电泳,评分等级1-k,如何建模?(RBM的结构)
  • 如何处理缺失值?
    一个用户一个RBM
    共享隐层,共享权重w,共享偏置b
    在这里插入图片描述

RBM进行评分预测

算法步骤(预测用户u对电影i的评分):
在这里插入图片描述
选择预测评分最高的电影进行推荐
在Netflix Prize中,RBM是单个算法中表现最好的


基于图的相似性

  • 多用于社交网络人与人的关系挖掘
    在这里插入图片描述
    在这里插入图片描述

图模型

  • SIMRank(Jeh&Widom,2002)
    基本思想:被相似的对象引用的两个对象也具有某种相似性
    在这里插入图片描述
  • SimRank++(Ioannis Antonellis,2007)
    • 改进1:引入evidence系数(两个节点的共同节点越多越相似)
    • 改进2:考虑的边的权重
  • Markov模型(n-gram)
    在这里插入图片描述
  • Markov Decision Process
  • 图模型的评价
    • 借助图的结构的传到辛,可以发现CF发现不了的弱相似性,给推荐带来一定的惊喜性;但是图模型也面临着数据稀疏性问题和冷启动问题。

基于内容/知识的推荐


  • 什么是内容
    • 文本描述:NLP技术挖掘关键词
    • Item的属性,如电影的主题、衣服的材质等
    • Item的特征,例如语音信号表示、图像向量表示等
  • 基本组成
    • item特征向量,如文本的TF-IDF向量
    • 用户profile向量:通常通过用户偏好的item来提取
    • 匹配分:直接计算cosine,分类/回归模型
  • 基于内容推荐的评价:
    • 优点
      • 能够推荐出用户独有的小众偏好
      • 可以一定程度解决数据稀疏问题和item的冷启动问题
      • 通常具有较好的可解释性
    • 不足
      • 对于很多推荐问题,提取有意义的特征不容易
      • 很难将不同的item特征组合在一起(邻域思想)
      • 很难带给用户惊喜性
      • 如果用户的profile挖掘不准,推荐效果往往很差

混合方法(Hybird Approaches)


  • 模型融合方法
    • 加权(weighted)组合
    • 切换(switching)组合:确定一个合理的切换跳进
    • 混合(Mixed)
    • 特征组合(feature combination):不同模型特征组合到一起
    • 特征扩展(feature augmentation):一个模型的输出作为另一个的特征
    • 级联(Cascade):粗排->精排
  • 评价
    • 通常比单个算法表现好
    • 需要在不同算法之间、理论效果和实际可行性之间仔细权衡

三.推荐算法的最新研究


Leaning to Rank


  • 大多数推荐结果是一个列表,因此推荐结果的排序也很重要。
  • L2R:将排序看做一个ML问题
  • 推荐的评价准则:
    • Normalized Discounted Cumulative Gain(NDCG)
    • Mean Reciprocal Rank(MRR)
  • 问题:难以直接利用这些指标指导学习过程
  • 常用算法
    • Pointwise:LR,GBDT,SVM
    • Pairwise:RankSVM,RankBoost,RankNet,LambdaRank…
    • Listwise:AdaRankmLambdaRank/LambdaMart,ListMLE

页面整体优化


  • 用户注意力建模
    在这里插入图片描述
    参见:
    在这里插入图片描述

情景(Context-aware)推荐


  • 什么是情景:
    • 看电影:工作日,周末
    • 订餐:餐厅距离
    • 网购:用户心情
    • 母婴:孩子年龄
  • 三种实现方式
    在这里插入图片描述

情景推荐算法


  • 张量分解(Tensor Factorization)
    • 参见A Kararzoglou,2010
      在这里插入图片描述
  • 分解机(Factorization Machine)
    • 矩阵(张量)分解跟线性(逻辑)回归融合的一种推广
      在这里插入图片描述
    • 参见Rendle,2010
  • Factorization Machine效果更好

深度学习算法


  • 卷积神经网络(CNN)
    在这里插入图片描述
  • 循环神经网络(RNN)
    在这里插入图片描述

深度学习在推荐上的应用


  • Spotity将CNN用于音乐推荐
    • 利用CNN从歌曲音频提取隐特征向量解决冷启动问题
  • 考拉将RNN用于电商推荐
    • 传统i2i:基于最后一个行为
    • RNN:基于用户整个session行为(序列数据)
  • 评价
    • 利用DL有希望开发出更加智能的推荐系统
    • RNN可用于捕捉用户实时意图,但是仅仅利用行为数据的RNN可能效果有限
    • (可能的改进点:1.将图像、文本、行为数据综合起来
      2.压缩状态空间
      3.巧妙构造训练数据)

四.总结

推荐算法需要深入理解推荐需求、业务目标、对数据的理解和处理、对用户的理解。
多个模型融合可以提高预测准确新,但是需要权衡成本
多个指标综合评价一个推荐系统




  1. 哈利波特现象:即热门商品往往与其他商品的相似性都很高,而热门商品之间的相似性更高。回顾在UCF中,热门商品也往往将两个无关的人划分为具有相同兴趣的人。如何消除热门商品所带来的影响?基本思路是降低热门商品的权重,在离线测试中,会降低准确率、召回率,但会提高覆盖率。
    [2]: http://www.360doc.com/content/17/0527/14/21659794_657712245.shtml
    [3]:
    [4]: ↩︎



推荐阅读
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 读手语图像识别论文笔记2
    文章目录一、前言二、笔记1.名词解释2.流程分析上一篇快速门:读手语图像识别论文笔记1(手语识别背景和方法)一、前言一句:“做完了&#x ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
author-avatar
林立霞61556
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有