阅读更多

1顶
0踩

企业架构

原创新闻 推荐算法概览(二)

2016-07-29 11:19 by 副主编 mengyidan1988 评论(0) 有5594人浏览
推荐算法概览(四)
本文是系列文中的第四篇。第一篇文章通过列表形式介绍了推荐算法的主要分类,第二篇文章介绍了不同类型的协同过滤算法,强调了其间的一些细微差别,在第三篇中我们详细介绍了基于内容的过滤算法。本文将会讨论基于之前提过算法而形成的混合型推荐系统,也会简单讨论如何利用流行度来解决一些协同过滤算法与基于内容过滤算法的限制。

混合算法结合了用户及物品的内容特性以及使用数据,以利用这两类数据的优点。结合了A算法与B算法的某个混合型推荐系统会尝试利用A算法的优点以解决B算法的缺点。例如,协同过滤算法存在新物品的问题,也就是说这种算法无法推荐用户未评价或使用过的物品。因为是基于内容(特性)预测的,这一点并不会对基于内容的算法产生限制。而结合了协同过滤与基于内容过滤算法的混合型推荐系统能够解决单个算法中的一些限制,比如冷启动的问题与流行度偏好的问题。表一列出了一些不同的方法,包括如何结合两种甚至更多基础推荐系统技术,以创建新的混合型系统。



表一:结合两种甚至更多的基础推荐算法,以创建新混合算法的不同方式。
假设我们有一些用户已经表达了他们对某些书籍的偏好,他们越喜欢某本书,对这本书的评分也越高(评分级别分别为1-5)。我们可以在一个矩阵中重现他们的这种偏好,用行代表用户,用列代表书籍。



图二:为某个用户生成的推荐结果——分别使用基于用户的协同过滤算法,基于物品的协同过滤算法,以及基于内容的过滤算法。
下一步,我们使用加权混合推荐算法为指定用户生成推荐结果,加权值分别为:基于用户的协同过滤算法40%,基于物品的协同过滤算法30%,基于内容过滤的算法30%(图三)。在这个案例中,系统会向用户推荐他们从未看过的所有三本书,而使用单个算法只会推荐其中两本。



图三:使用加权混合推荐系统为某个用户生成推荐结果,具体权值参见上文。
尽管混合型算法解决了CF与CB算法的一些重大挑战与限制(见图三),但在系统中平衡不同的算法也需要很多工作量。另一种结合单个推荐算法的方式是使用集成方法,关于如何结合不同算法得出的结果,我们研究得出了一个函数。值得注意的是:通常集成算法不仅结合了不同的算法,还结合了根据同一种算法得出的不同变体与模型。例如:获得Netflix Prize奖项的解决方案包含了从10多种算法(流行度、邻域算法、矩阵分解算法、受限波尔兹曼机、回归等等)得出的100多种不同的模型,并通过迭代决策树(GBDT)将这些算法与模型结合在一起。

另外,基于流行度的算法对于新用户的冷启动问题来说也是一个优秀的解决方案。这些算法通过某些流行度的测量标准,比如下载最多的或者购买最多的,来对物品进行排名,并将这些流行度最高的物品推荐给新用户。当拥有合适的流行度衡量指标时,这个办法虽然基础却很有效,通常可以为其他算法提供很好的基线标准。流行度算法也可以单独作为算法使用,以引导推荐系统在换到其他更切合用户兴趣点的算法(比如协同过滤算法以及基于内容过滤的算法)前获得足够的活跃度与使用量。流行度模型也可以引入混合算法中,从而解决新用户的冷启动问题。
引用

推荐算法概览(五)
本文是推荐算法系列文中的第五篇。第一篇文章通过列表形式介绍了推荐算法的主要分类,第二篇文章介绍了不同类型的协同过滤算法,强调了其间的一些细微差别,在第三篇中我们详细介绍了基于内容的过滤算法,在第四篇中我们讲解了混合型推荐系统以及基于流行度的算法。在本篇中,我们会对简单了解一下如何对一些高级的推荐算法做以选择,再回顾一下基础算法得出的推荐结果差异有多大,以便本系列完美收官。

除了我们截至目前提到的一些更为传统的推荐系统算法之外(比如流行度算法协同过滤算法基于内容过滤的算法混合型算法),还有许多其他算法也可用于加强推荐系统的功能,包括有:
  • 深度学习算法
  • 社会化推荐
  • 基于机器学习的排序方法
  • Multi-armed bandits推荐算法(探索/利用)
  • 情景感知推荐(张量分解&分解机)

这些更为高级的非传统算法对于将现有推荐系统的质量推向更高层次很有好处,但理解起来也更困难,推荐工具的支持上也不够。在实践中,我们总要权衡实现高级算法的代价与对基础算法的增益相比较是否值得。根据经验来看,基础算法还能使用很久,为一些很优秀的产品提供服务。

在本系列文中,我们希望介绍一些常见的推荐模块算法,包括基于用户的协同过滤算法,基于物品的协同过滤算法,基于内容的过滤算法,以及混合型算法。我们使用了一个案例,说明了这四种不同算法在输入数据相同时,应用于同一个案例时,为同一个用户生成的不同推荐结果(图一)。当应用于真实世界的大型数据时,这样的效应依然存在,因此决定使用哪种算法时,需要考虑相关的优缺点以及执行效果。



图一:四种推荐系统算法全部使用同一组数据,却得出了不同的结果。左侧我们给出了一个矩阵,标明了用户对大量物品的不同偏好,并列出了可以推荐的物品名称。在中间,我们展示了这四种不同算法如何为第一名用户生成推荐结果(也就是用户偏好矩阵中第一行的用户)。就像相似矩阵中展示的那样,这些算法对相似度有不同的定义。右侧则是每种推荐算法生成的一些物品,从上到下分别按照四种算法的介绍顺序来排序。
在实践中,一般如果在推荐模型中使用协同过滤算法,就不会犯太大错误。协同过滤算法似乎比其他算法更优秀,但在冷启动用户及物品方面会有问题,因此通常会使用基于内容的算法作为辅助。如果有时间的话,使用混合型算法就可以结合协同过滤及基于内容过滤算法优势了。将这些基础算法放在一起当然是个好办法,甚至比高级算法还要更好。

最后这一点值得牢记:推荐模型只是五个推荐系统组件中的一个。与所有组件类似,正确设置并努力建立模型非常重要,不过选择数据集、处理、后处理、在线模块及用户界面也同样重要。正如我们再三强调的那样,算法只是推荐系统的一部分,整个产品应当将你的决策纳入考量。

第五部分原文:Overview of Recommender Algorithms – Part 5
  • 大小: 116.6 KB
  • 大小: 33.8 KB
  • 大小: 52.4 KB
  • 大小: 115.4 KB
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • c# 基类如何调用子类的数据

    基类如何调用子类的方法或者字段,使用dynamic关键字达到目的,当然也可以用反射,但是这个效率更高点。 定义一个基类person类 public class Person { public string Name { get; set; } } 定义一个子类 public class Student:Person { public string ClassName { get; set; } } class Program .

  • 继承关系中基类和子类构造函数的调用顺序

    首先回顾并讨论先有鸡还是先有蛋的问题在C++中将会是什么情况。如果编写: class Egg; class Hen { public: int n; Egg egg; Hen() { n=5; cout<<"Hen's con "<<n<<endl; } }; class...

  • C++ 继承中子类与父类虚函数入栈顺序 及父类私有虚函数的调用方式

    如果子类中有虚函数则先将子类的虚函数入栈,然后是父类的虚函数,如果子类重写了父类的虚函数,则入栈的是子类重写的函数,即重写的子类的函数替换对应的父类的虚函数。 如://A.h #ifndef __A_H #define __A_H #include using namespace std; class A{ //private: virtual void f() { cout

  • 父类和子类中各种方法的执行顺序

    执行顺序为:父类的静态代码块子类的静态代码块执行父类的构造代码块执行父类的构造方法执行子类的构造代码块执行子类的构造方法执行子类的A方法...

  • C#类的继承:子类--父类

    为了避免冗余,将几个类中重复的成员单独拿出来封装成一个类,作为这几个类的父类。 父类---子类       基类----派生类 子类没有继承到父类的私有(private)字段,可以继承属性(public)和方法。 1、一个子类只能有一个父类(单根性) 2、可以传递性继承(传递性) 查看类之间的关系可以通过  查看类图选项,  选中解决方案,右键,查看类图。 子类没有继承父类的构

  • c# 关于基类和子类的方法调用问题--总结

    不准确的地方请朋友加以指正出来,避免误导他人 首先代码类似如下

  • C++虚函数与函数的执行顺序

    虚函数与纯虚函数的区别,虚函数与一般函数的执行顺序的先后,根据几道例题来分析理解

  • C# 子类和父类的初始化顺序

    子类全局静态变量 -> 父类全局静态变量 -> 父类构造函数 ->子类构造函数

  • C#中父类与子类构造函数调用顺序说明

      我们先来建立一个父类,一个子类,一个子类的子类 class BaseClass { private string name = "BaseClass"; public BaseClass() { Console.WriteLine(name); } } clas...

  • 父类和子类调用顺序

    class one { public one(){ System.out.println("父类无参构造方法"); } static{ System.out.println("父类静态代码块"); } { System.out.println("父类非静态代码块"); } public voi...

  • Java 基类与子类构造器调用顺序

    1、基类构造器总是被调用的 2、基类构造器在子类调用前被调用 3、调用基类构造器是子类构造器必须做的第一步。 package com.test.d7.x2; public class Cartoon extends Drawing { Cartoon() { System.out.println("Cartoon constructor"); } p...

  • 关于派生类构造函数与基类构造函数的调用顺序问题

    关于派生类构造函数与基类构造函数的调用顺序问题,我们先看一下书上的说法:     《面向对象程序设计基础(第二版》李师贤等,第254页:C++语言的基本规则是:创建一个派生类的对象时,如果基类带有构造函数,则先调用基类的构造函数,然后才调用派生类的构造函数。     《Thinking in C++》,刘宗田等译,第261页:可以看出,构造在类层次的最根处开始,而在每一层,首先调用基类构造函数,然

  • 父类与子类之间的调用顺序

    a) 父类静态代码块 b) 子类静态代码块 c) 父类构造方法 d) 子类构造方法 e) 子类普通方法 f) 重写父类的方法,则打印重写后的方法 转载于:https://www.cnblogs.com/xwb583312435/p/10075530.html...

  • asp.net 页面父类与子类方法执行的顺序

    页面基类BasePage,单个页面Default,及页面上有一个控件Label 第一次测试 子类的CreateControlCollection方法 子类的CreateChildControls方法 父类的CreateChildControls方法 父类的CreateControlCollection方法 子类的OnPreInit方法 父类的OnPreInit方法 子类的OnIni

  • 【C#】C#中子类调用父类的实现方法

    本文实例讲述了C#中实现子类调用父类的方法,分享给大家供大家参考之用。具体方法如下:public class Person { public Person() { Console.WriteLine("我是人"); } } public class Student : Person { public Student() { Conso...

Global site tag (gtag.js) - Google Analytics