推荐算法(一)--基本介绍_详细论述基于流行度的推荐算法的设计步骤法与应用特点-程序员宅基地

技术标签: 搜索推荐  

1. 什么是推荐算法

推荐算法最早在1992年就提出来了,但是火起来实际上是最近这些年的事情,因为互联网的爆发,有了更大的数据量可以供我们使用,推荐算法才有了很大的用武之地。

最开始,所以我们在网上找资料,都是进yahoo,然后分门别类的点进去,找到你想要的东西,这是一个人工过程,到后来,我们用google,直接搜索自己需要的内容,这些都可以比较精准的找到你想要的东西,但是,如果我自己都不知道自己要找什么肿么办?最典型的例子就是,如果我打开豆瓣找电影,或者我去买说,我实际上不知道我想要买什么或者看什么,这时候推荐系统就可以派上用场了。

2. 推荐算法的条件

现在的各种各样的推荐算法,但是不管怎么样,都绕不开几个条件,这是推荐的基本条件

1.根据和你共同喜好的人来给你推荐 
2.根据你喜欢的物品找出和它相似的来给你推荐 
3.根据你给出的关键字来给你推荐,这实际上就退化成搜索算法了 
4.根据上面的几种条件组合起来给你推荐

3. 推荐算法分类

3.1 基于流行度的推荐算法

基于流行度的推荐算法比较简单粗暴,主要是对热点商品或者信息的推荐。它主要是根据PV、UV、日均PV或分享率等数据来按某种热度排序来推荐给用户。

这种算法既有优点也有缺点。优点是简单,适用于刚注册的新用户,能够解决对新用户进行推荐的冷启动问题。缺点也很明显,它无法针对用户提供个性化的推荐。基于这种算法也可做一些优化,比如加入用户分群的流行度排序,例如把热榜上的体育内容优先推荐给体育迷,把政要热文推给热爱谈论政治的用户。

3.2 基于内容的推荐算法

基于内容的推荐是在推荐引擎出现之初应用最为广泛的推荐机制,它的核心思想是根据推荐物品或内容的元数据,发现物品或者内容的相关性,然后基于用户以往的喜好记录,推荐给用户相似的物品。比如你看了哈利波特I,基于内容的推荐算法发现哈利波特II-VI,与你以前观看的在内容上面(共有很多关键词)有很大关联性,就把后者推荐给你。

这种推荐系统多用于一些资讯类的应用上,针对文章(电影音乐)本身抽取一些tag作为该其关键词,继而可以通过这些tag来评价两篇文章的相似度。

这种推荐系统的优点在于: 1、易于实现,不需要用户数据因此不存在稀疏性和冷启动问题。 2、基于物品本身特征推荐,因此不存在过度推荐热门的问题。 然而,缺点在于:1、抽取的特征既要保证准确性又要具有一定的实际意义,否则很难保证推荐结果的相关性。豆瓣网采用人工维护tag的策略,依靠用户去维护内容的tag的准确性。2、推荐的Item可能会重复,典型的就是新闻推荐,如果你看了一则关于MH370的新闻,很可能推荐的新闻和你浏览过的,内容一致。

3.3 基于关联规则的推荐算法

基于关联规则的推荐更常见于电子商务系统中,并且也被证明行之有效。其实际的意义为购买了一些物品的用户更倾向于购买另一些物品。基于关联规则的推荐系统的首要目标是挖掘出关联规则,也就是那些同时被很多用户购买的物品集合,这些集合内的物品可以相互进行推荐。目前关联规则挖掘算法主要从Apriori和FP-Growth两个算法发展演变而来。 基于关联规则的推荐系统一般转化率较高,因为当用户已经购买了频繁集合中的若干项目后,购买该频繁集合中其他项目的可能性更高。

该机制的缺点如下: 1.计算量较大,但是可以离线计算,因此影响不大。 2.由于采用用户数据,不可避免的存在冷启动和稀疏性问题。 3.存在热门项目容易被过度推荐的问题。

3.4 基于协同过滤的推荐算法

协同过滤是一种在推荐系统中广泛采用的推荐方法。这种算法基于一个“物以类聚,人以群分”的假设,喜欢相同物品的用户更有可能具有相同的兴趣。基于协同过滤的推荐系统一般应用于有用户评分的系统之中,通过分数去刻画用户对于物品的喜好。协同过滤被视为利用集体智慧的典范,不需要对项目进行特殊处理,而是通过用户建立物品与物品之间的联系。 目前,协同过滤推荐系统被分化为两种类型:基于用户(User-based)的推荐和基于物品(Item-based)的推荐。

3.4.1 基于用户(User-based)的推荐

基于用户的协同过滤推荐的基本原理是,根据所有用户对物品或者信息偏好(评分),发现与当前用户口味和偏好相似的“邻居”用户群,在一般应用中是采用计算K近邻的算法;基于这 K个邻居的历史偏好信息,为当前用户进行推荐。 这种推荐系统的优点在于推荐物品之间在内容上可能完全不相关,因此可以发现用户的潜在兴趣,并且针对每个用户生成其个性化的推荐结果。缺点在于一般的Web系统中,用户的增长速度都远远大于物品的增长速度,因此其计算量的增长巨大,系统性能容易成为瓶颈。因此在业界中单纯的使用基于用户的协同过滤系统较少。

3.4.2 基于物品(Item-based)的推荐

基于物品的协同过滤和基于用户的协同过滤相似,它使用所有用户对物品或者信息的偏好(评分),发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户。基于物品的协同过滤可以看作是关联规则推荐的一种退化,但由于协同过滤更多考虑了用户的实际评分,并且只是计算相似度而非寻找频繁集,因此可以认为基于物品的协同过滤准确率较高并且覆盖率更高。 同基于用户的推荐相比,基于物品的推荐应用更为广泛,扩展性和算法性能更好。由于项目的增长速度一般较为平缓,因此性能变化不大。缺点就是无法提供个性化的推荐结果。

3.4.3 协同过滤算法总结

两种协同过滤:基于用户和基于物品两个策略中应该如何选择呢?其实基于物品的协同过滤推荐机制是Amazon 在基于用户的机制上改良的一种策略,因为在大部分的Web 站点中,物品的个数是远远小于用户的数量的,而且物品的个数和相似度相对比较稳定;同时基于物品的机制比基于用户的实时性更好。但也不是所有的场景都是这样的情况,在一些新闻推荐系统中,也许物品,也就是新闻的个数可能大于用户的个数,而且新闻的更新程度也有很快,所以它的相似度依然不稳定。所以,推荐策略的选择其实也和具体的应用场景有很大的关系。

基于协同过滤的推荐机制是现今应用最为广泛的推荐机制,它有以下几个显著的优点:

  1. 它不需要对物品或者用户进行严格的建模,而且不要求物品的描述是机器可以理解的,所以这种方法也是领域无关的。
  2. 这种方法计算出来的推荐是开放的,可以共用他人的经验,很好的支持用户发现潜在的兴趣偏好。

然后而它也存在以下几个缺点:

  1. 方法的核心是基于历史数据,所以对新物品和新用户都有“冷启动”的问题。
  2. 推荐的效果依赖于用户历史偏好数据的多少和准确性。
  3. 在大部分的实现中,用户历史偏好是用稀疏矩阵进行存储的,而稀疏矩阵上的计算有些明显的问题,包括可能少部分人的错误偏好会对推荐的准确度有很大的影响等等。
  4. 对于一些特殊品味的用户不能给予很好的推荐。
  5. 由于以历史数据为基础,抓取和建模用户的偏好后,很难利用获取的用户偏好演变,从而导致这个方法不够灵活。

3.5 基于模型的推荐算法

基于模型的方法有很多,主要是使用常用的机器学习算法对目标用户建立推荐算法模型,然后对用户的爱好进行预测推荐以及对推荐的结果打分排序等。 常用的模型包括Aspect Model,pLSA,LDA,聚类,SVD,Matrix Factorization,LR,GBDT等,这种方法训练过程比较长,但是训练完成后,推荐过程比较快且准确。因此它比较适用于实时性比较高的业务如新闻、广告等。当然,而若是需要这种算法达到更好的效果,则需要人工干预反复的进行属性的组合和筛选,也就是我们常说的 特征工程。而由于新闻的时效性,系统也需要反复更新线上的数学模型,以适应变化。

简单的以LR为例,来讲一下推荐系统的运作原理。我们通过分析系统中用户的行为和购买记录等数据,得到如下表:

表中的行是一种物品,x1~xn是影响用户行为的各种特征属性,如用户年龄段、性别、地域、物品的价格、类别等等,y则是用户对于该物品的喜好程度,可以是购买记录、浏览、收藏等等。通过大量这类的数据,我们可以回归拟合出一个函数,计算出x1~xn对应的系数,这即是各特征属性对应的权重,权重值越大则表明该属性对于用户选择商品越重要。   在拟合函数的时候我们会想到,单一的某种属性和另一种属性可能并不存在强关联。比如,年龄与购买护肤品这个行为并不呈强关联,性别与购买护肤品也不强关联,但当我们把年龄与性别综合在一起考虑时,它们便和购买行为产生了强关联。比如(我只是比如),20~30岁的女性用户更倾向于购买护肤品,这就叫交叉属性。通过反复测试和经验,我们可以调整特征属性的组合,拟合出最准确的回归函数。最后得出的属性权重如下:

基于模型的算法由于快速、准确,适用于实时性比较高的业务如新闻、广告等,而若是需要这种算法达到更好的效果,则需要人工干预反复的进行属性的组合和筛选,也就是常说的Feature Engineering。而由于新闻的时效性,系统也需要反复更新线上的数学模型,以适应变化。

3.6 混合推荐算法

真正的现实应用中,其实基本上很少会使用单一的推荐算法去实现推荐任务。因此,大型成熟网站的推荐系统都是基于各种推荐算法的优缺点以及适合场景分析的情况下的组合使用的“混合算法”。当然,混合策略也会是十分丰富的,例如不同策略的算法加权、不同场景和阶段使用不同的算法等等。具体的怎么混合需要结合实际的应用场景进行分析与应用。

由此可见推荐算法的类型还是相当之多的,尤其当应用场景发生变化时,推荐算法往往也需要作出较大的变动。接下来将会对以上的诸多算法作出适当的详解与实战。

参考文章:

[机器学习]推荐系统之协同过滤算法

协同过滤推荐算法的原理及实现

系列学习——推荐算法综述

5类系统推荐算法,非常好使,非常全

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/App_12062011/article/details/85414969

智能推荐

Calendar时间类的使用_calendar.get-程序员宅基地

文章浏览阅读3.7k次,点赞2次,收藏16次。一 Calendar类的简单使用二add与roll的区别roll以日为单位增加,不会超出当前月,以月为单位不会超过当前年,以年为单位增加,会一直累加三 指定某一时间点四 样式格式化将calendar类转化为date再进行格式化五 时间的比较..._calendar.get

时间复杂度_举例说明_时间复杂度有哪些举例-程序员宅基地

文章浏览阅读186次。/** * @author Zsx * 时间复杂度 * O(1) < O(log2n) < O(n) < O(nlog2n) < O(n^2) < O(n^3) < O(n^k) < O(2^n) < O(n!) * @Time 2021/6/16 21:50 */public class TimeComplexity { /** * 举例说明 * * @param args */ pub._时间复杂度有哪些举例

一起来玩玩WebGL--第一弹-程序员宅基地

文章浏览阅读1.6w次。文末福利:开发者藏经阁NO.1序上一篇文章说到我从客户端转前端的历程,短短一年的时间就打开了前端世界的大门,简直就是有无穷多的东西可玩,以前酷爱Java的我终于见识到什么都可以写的Jav..._一起来玩玩webgl–第一弹

Android AbsListView坐标体系解析-程序员宅基地

文章浏览阅读5.2k次,点赞2次,收藏5次。Android AbsListView坐标体系解析Android的AbsListView与Android ListView不同,AbsListView代表了一个抽象的列表View。在实际的开发中直接使用Android ListView几乎可以完全完成所有与List这类View相关的开发任务,但在极个别情况下, 需要深入到Android的AbsListView中进行仔细的坐标定位。为_abslistview

Hadoop作业提交分析_提交的hadoopjar如何知道数据在哪-程序员宅基地

文章浏览阅读1k次。Hadoop作业提交分析(一)bin/hadoop jar xxx.jar mainclass args……这样的命令,各位玩Hadoop的估计已经调用过NN次了,每次写好一个 Project或对Project做修改后,都必须打个Jar包,然后再用上面的命令提交到Hadoop Cluster上去运行,在开发阶段那是极其繁琐的。程序员是“最懒”的,既然麻烦肯定是要想些法子减少无谓_提交的hadoopjar如何知道数据在哪

【Echarts】Echarts给title添加背景图片_echarts title设置背景-程序员宅基地

文章浏览阅读2.4k次,点赞3次,收藏7次。Echatrs给标题添加背景图片_echarts title设置背景

随便推点

严重: Compilation error org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException-程序员宅基地

文章浏览阅读1w次。Maven新手的错误 今天初学maven工程,见识过他的强大,心所向恋,却又很次揪心。看着某马的视频学的maven,其环境是jdk1.7+tomcat7.0我机子装的是jdk1.8+tomcat7&amp;tomcat8。错误1:jvm环境过低,用的是其默认的jre1.5,错误详情:[INFO] Scanning for projects...[INFO] ..._严重: compilation error

【Linux】中安装pip(详细教程)_linux pip-程序员宅基地

文章浏览阅读1.6w次,点赞72次,收藏105次。由于系统自带的pyhon中没有pip,而我们这时候恰好需要用到pip,怎么办呢?今天我就来教大家如何在linux中安装pip;_linux pip

6-1单链表逆转(C语言)_给定存储若干整数的单链表,实现单链表逆转c-程序员宅基地

文章浏览阅读571次。6-1单链表逆转(C语言)本题要求实现一个函数,将给定的单链表逆转。函数接口定义List Reverse( List L );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表类型 */L是给定单链表,函数R_给定存储若干整数的单链表,实现单链表逆转c

关于GEE导出数据时 含空值的栅格图像_selfmask-程序员宅基地

文章浏览阅读3.9k次,点赞8次,收藏25次。GEE提供的卫星数据大多数是有丢失的,若不加操作直接导出为tif,matlab读出来的矩阵该是空值的都是nan,然而arcgis并不能识别空值为nodata,导致制图非常难受。加上unmask函数可以让空值变为某个数字,这里设为-9999,方便后续处理。selfMask()则可以将图像的负值都判定为空。Export.image.toDrive({ image: xinjiang_CH4_anomaly.unmask(-9999), description: 'xinjiang_ch4_anom_selfmask

jmeter聚个报告怎么看qps_jmeter 聚合报告参数详解及TPS 解析-程序员宅基地

文章浏览阅读2.1k次。1、获得TPS插件https://www.cnblogs.com/beginner-boy/p/7806220.html 参见,已保存百度云盘2、添加后,记得使用调度器——每秒50个并发,持续60秒,观察TPS3、TPS,执行一次事务(包括请求、请求服务器、等待服务器返回等等,比如一个TPS事务,可能触发3个QPS请求)PS:一秒钟处理的事务数。TPS值越大,一秒钟处理的事务数就越多,说明处理速..._jmeter查看qps

浙大 PAT 甲级 1077 Kuchiguse_pat甲级可以用翻译吗-程序员宅基地

文章浏览阅读135次。读题目真是要笑死我了…太不正经了。很简单的20分~将题意翻译成代码即可。#include<iostream>#include<string>using namespace std;int main(){ int N; scanf("%d", &N); getchar(); string base; getlin..._pat甲级可以用翻译吗

推荐文章

热门文章

相关标签