阅读更多

1顶
0踩

企业架构

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

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

混合算法结合了用户及物品的内容特性以及使用数据,以利用这两类数据的优点。结合了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#,java)

    google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//<script type="text/javascript"

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

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

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

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

  • 基类和派生类的构造函数和析构函数调用顺序

    一个派生类可以继承多个基类 } 构造函数:先基类,再派生类 。 析构函数:先派生类,再基类。 多个基类的调用跟基类继承的顺序有关

  • c++中类实例化时候对基类的调用顺序

    #include using namespace std; class A { public: A() { cout<<"this is the construct of A"<<endl; } ~A() { cout<<"this is the destruct of A"<<endl; } }; class B:public A { public: B() {

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

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

  • c#中类的执行顺序

    不考虑继承的话,类的执行顺序如下: 1静态字段 2静态构造函数(类被实例化的时候或者调用静态成员的时候调用静态构造,且只调用一次,注意:只是在第一次进入类的时候才会调用,并且所有的静态都是在第一次进入的时候调用,第二次不会 ) 3实例字段 4实例构造 考虑继承的话,类的执行顺序如下: 1子类静态成员 2子类静态构造 3子类实例成员 4父类静态成员 5父类静态构造 6父类实例成员 7父类实例构造 8子类实例构造 有如下代码 /// &lt;summary&gt; /// 类的执行顺序(不考虑继

  • C#中类成员的执行顺序

    先进行细分:类的成员分为:字段、属性、方法、构造方法成员的修饰符:静态成员、实例成员层次结构:父类、子类 先不考虑继承关系,执行顺序为:静态字段静态构造方法实例字段实例构造方法属性和方法是在调用的时候才执行,这里就不考虑了。如何理解上面的执行过程?假如让我来设计执行过程,我该如何考虑,依据是什么?首先,静态的东西是大家共享的,也就是相同的。应该先关心共享的东西,再关系个人的东西。“先公后私”,呵呵...

  • 定义排序扩展类(SortArray排序子类)

    如果要进行排序的处理操作,那马尔可达在取得了全部数据的时候,里面的内容是排序好的,同时在该类操作的过程之中,应该继续具备:数据追加、数组扩充、取得全部数据(父类中的getData()方法作为一个获取数据的标准。这个方法应该继续保留)class Array{//定义一个转门进行数组的操作类 private int data[];//定义一个整形数组,大小由外部决定 private int foot ...

  • 关于C#基类和子类函数调用问题

    c#基类子类的函数调用关系,代码说明new关键字后面的类中的函数为对象调用的函数,当然必须要有virtual和override,继承就相当于包含了基类的函数,子类对象调用时基类的函数相当于就在子类当中一样。(必须要有virtual和override此代码才成立)

  • C#List混装存储子类和父类对象并进行排序操作

    不同的子类在List中是能够正常存储的,但是在存储时都需要以父类型存储进去,即List的类型为父类,而Add()中的类型可以声明为实际使用的类型: ` Prop newProp = new ChildProp(); newProp = prop; //prop为需要add的参数,并且已知prop为子类型ChildProp转换而来 ...

  • C++继承中构造函数、析构函数调用顺序及虚函数的动态绑定

    昨天面试被问到这些,惭愧的很,居然搞混了,悔恨了一把。决定要彻底搞清楚。也算是有所收获。 首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,只有这样子类才能在构造函数里使用基类的成员,所以是创建子类时先调用基类的构造函数然后再调...

  • C#中父类与子类的继承关系

      C#中的父类与子类的继承关系与C和C++中的类似,这里先阐述最重要的一点:假如子类继承了父类,那么子类可以强制转换为父类,并且保证编译和运行都不出错;但是父类强制转换成子类的时候,编译可以通过运行通不过。请看如下代码: using System; using System.Collections.Generic; using System.Linq; using System.Te...

  • 【C++】基类和派生类构造函数的调用顺序

    首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,只有这样子类才能在构造函数里使用基类的成员,所以是创建子类时先调用基类的构造函数然后再调用自己的构造函数。通俗点说,你要用某些物品,但这些物品你没办法自己生产,自然就要等别人生产出来,你才能拿来用。

  • Java__继承中父类与子类之间调用的先后顺序

    继承可以简化代码,提高代码的利用率,但是通常用于同一类事物,且有多个共同的属性或功能时才考虑继承。本文主要说明Java中父类在被子类调用后内部模块与子类出现的先后顺序来判定继承中父类与子类的优先级问题。 首先在子类中分别定义静态代码块、非静态代码块、无参构造器、静态方法与非静态方法。 class A extends B{ /** * 子类静态代码块 */ static { System.out.println("----staticA--1--------"); } /** * 子类

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

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

  • 类的加载顺序,父类和子类初始化的顺序和重写所遇到的上塑造型

    类的加载顺序 什么时候类加载 第一次需要使用类信息时加载。 类加载的原则:延迟加载,能不加载就不加载。 触发类加载的几种情况: (1)、调用静态成员时,会加载静态成员真正所在的类及其父类。 通过子类调用父类的静态成员时,只会加载父类而不会加载子类。 (2)、第一次 new 对象的时候 加载(第二次再 new 同一个类时,不需再加载)。 (3)、加载子类会先加载父类。

  • C#知识点9:C#中类的继承 子类:基类

    C#继承

  • 构造函数调用顺序

    构造函数调用顺序: 1》首先调用基类的构造函数(如果有基类);如果有多个基类,则按基类被列出的顺序调用; 2》调用这个类的成员对象的构造函数(如果有的话);弱国有多个成员对象,则按成员对象定义的顺序被调用(与参数列表中咧出的顺序无关); 3》最后调用这个类自身的构造函数; 注意:弱国有虚基类,则先调用虚基类的构造函数。在调用基类的构造函数,如果有多个虚基类,则按列出的顺序调用; 析构函数与此相反

Global site tag (gtag.js) - Google Analytics