Redis之key的淘汰策略

淘汰策略概述

redis作为缓存使用时,在添加新数据的同时自动清理旧的数据。这种行为在开发者社区众所周知,也是流行的memcached系统的默认行为。

redis中使用的LRU淘汰算法是一种近似LRU的算法。

淘汰策略

针对淘汰策略,redis有一下几种配置方案:

1、noeviction:当触发内存阈值时,redis只读不写;

2、allkeys-lru:针对所有的key,执行LRU(最近最少使用)策略;

3、allkeys-lfu:针对所有的key,执行LFU(最低频使用)策略;

4、volatile-lru:针对设置了过期时间的key,执行LRU(最近最少使用)策略;

5、volatile-lfu:针对设置了过期时间的key,执行LFU(最低频使用)策略;

6、allkeys-random:针对所有key,进行随机淘汰;

7、volatile-random:针对设置了过期时间的key,进行随机淘汰;

8、volatile-ttl:针对设置了过期时间的key,淘汰剩余过期时间最短的;

根据应用场景选择合适的淘汰策略是非常重要的,我们可以在程序运行时实时重置淘汰策略,并使用Redis INFO输出来监控缓存未命中和命中的数量,以优化设置。

根据以往使用惯例:

  • 当你希望某些元素的子集被访问的频率高于其他元素,或者当你不知道怎么选择淘汰策略时,allkeys-lru策略是一个很好的选择;
  • 当你在循环访问redis,且所有的key是被连续扫描时,或者你希望key过期时间均匀分布时,allkeys-random策略是一个很好的选择;
  • 如果你希望基于key不同的TTL时间筛选出哪些key可被淘汰,volatile-ttl策略是一个很好的选择;

还有一点是为key设置过期时间会占用内存,因此使用allkeys-lru这样的策略会更节省内存,因为在内存压力下不需要对key进行过期设置。

淘汰策略如何工作

淘汰过程如下:

  • 客户端执行一条指令,需要添加一批数据;
  • redis检测缓存阈值限制,如果超过阈值则执行淘汰策略;
  • 执行指令等等;

因此在redis的使用过程中,我们可能不断的超过内存阈值限制,然后执行淘汰策略再将内存恢复到阈值之下。

近似LRU算法

redis lru算法是一个近似lru算法,这意味着针对整个key集合,redis在执行lru策略时可能不会很精准的淘汰掉最应该被淘汰的key,相反的是,redis会通过抽样一小部分key,并淘汰采样key中最该被淘汰的。 自redis3.0以来,该算法得到了改善,能够抽样大批量的key进行淘汰,使其能够更接近真实LRU算法的行为。 redis lru算法的重要之处在于可以通过更改样本数量来调整算法的精度,此参数由以下配置指令控制:
maxmemory-samples 5

redis不使用真正的LRU实现的原因是它需要更多的内存。然而,对于使用Redis的应用程序,近似lru算法实际上是与精确lru算法差不多的。此图将redis使用的LRU近似值与真实LRU进行了比较。

用给定数量的key填充了Redis服务器(达到内存阈值)进行测试并生成了上面的图。从第一个到最后一个访问key。第一个key是使用LRU算法淘汰的最佳候选key。之后再添加50%以上的key,以强制淘汰一半的旧key。

你可以在图中看到三种点,形成了三个不同的区域:

  • 浅灰色区域是被淘汰的对象
  • 灰色区域是未被淘汰的对象
  • 绿色区域是新加的对象

在理论LRU实现中(theoretical LRU),我们预计旧key集合中的前一半将会被淘汰,与之相反,redis lru算法实现中,旧key集合中也只是会离散性的淘汰其中某些key。

正如您所看到的那样,与Redis 2.8相比,Redis 3.0在同样抽样数为5个时做得更好,但是大多数最新增加的key仍然被Redis 2.8保留。在Redis 3.0中使用10的样本大小,近似值非常接近Redis 3.0的理论性能。

在模拟中,我们发现使用幂律访问模式(类似20%的key承担了80%的访问),真实LRU和Redis近似LRU之间的差异极小或根本不存在。

使用CONFIG SET maxmemory samples<count>命令在生产中使用不同的样本大小值进行实验非常简单。

新的LFU模式

从redis4.0开始,可以在某些特定场景下使用低频淘汰策略。在选用LFU策略后,redis会跟踪key的访问频率,所以低频的key将被淘汰。这意味着经常访问的key有很大的机会一直留在内存中。

要配置LFU模式,可以使用以下策略:

  • volatile-lfu:针对设置了过期时间的key,使用近似lfu淘汰;
  • allkeys-lfu:针对所有key,使用近似lfu淘汰;

LFU近似于LRU:它使用一个称为Morris的概率计数器来估计key访问频率,计数器中每个key只占用几个bit,并且计数器功能附加衰减周期,这样计数器统计的key访问频率就会随着时间的推移而降低(如果一段时间内一个key访问频率低于计数器衰减速度,最终这个key会被淘汰)。直至某一刻,我们不再将一些key视为频繁访问的key,即使它们在过去是被频繁访问的,以便算法能够适应访问模式的变化。

该信息的采样方式与LRU(如本文档前一节所述)选择淘汰key的情况类似。

然而,与LRU不同的是,LFU具有某些可调参数:例如,如果一个频繁key不再被访问,那么它的访问频率级别应该降低多少?还可以调整Morris计数器范围,以更好地使算法适应特定的场景。

默认情况下,Redis配置为:

  • 在大约100万次请求时让计数器饱和;
  • 每一分钟使计数器衰减一次;

这些配置应该是合理的,并且经过了实验测试,但用户可能希望使用这些配置设置来选择最佳值。

有关如何调整这些参数的说明,可以在源发行版的示例redis.conf文件中找到。简而言之,它们是:

lfu-log-factor 10
lfu-decay-time 1

衰减时间是最明显的一个,它是计数器在采样时应该衰减的分钟数。特殊值0表示:永远不会衰减计数器。

计数器对数因子决定了使频率计数器达到饱和需要的key命中次数,频率计数器刚好在0-255范围内。系数越高,需要更多的访问才能达到最大值;系数越低,低频访问计数器的分辨率越好,如下表所示:

 

 

本文转载于网络 如有侵权请联系删除

相关文章

  • 专访新腾数致研发总监金涛:新思想、新工具与新效率

    采访背景介绍您去政务服务窗口办理过业务吗?在过去,经常是怀抱一个满满的档案袋,排队几小时,结果被告知“资料不足”。而今足不出户,很多政务服务拿着手机或者电脑就可以网上办理,政务办理变得像“网购”一样便利。数字政务、数字民生、数字农业......数字化已经逐渐渗透到了产业动脉与生活点滴当中。这些实实在在的效率提升离不开所有深耕数字化领域的企业与组织。作为产业互联网的新兴力量,新腾数致网络科技有限公司(以下简称新腾数致)正在为民生、政务、金融、农业等领域注入科技力量,推动数字化在产业中的落地。为了能按时保质交付业务项目给客户,新腾数致在自身内部的研发效率、运营效率等方面积极求进。每一个想要跑得更快的企业,都是为了让客户走得更远。本次采访将聚焦于新腾数致在软件开发效率提升的探索与改进,CODING带您一起看看新腾数致如何借助新思想、新工具,让自己跑得更快。采访对象介绍新腾数致:用数字科技连接城市和乡村新腾数致作为新希望集团和腾讯共同投资成立的公司,依托新希望产业优势与腾讯互联网科技能力,致力于推动民生、产业和政务的数字化发展。公司四大业务板块:数字政务:作为数字政府集成解决方案的提供商,助力

  • HDOJ/HDU 2551 竹青遍野(打表~)

    ProblemDescription “临流揽镜曳双魂落红逐青裙依稀往梦幻如真泪湿千里云” 在MCA山上,除了住着众多武林豪侠之外,还生活着一个低调的世外高人,他本名逐青裙,因为经常被人叫做”竹蜻蜓”,终改名逐青,常年隐居于山中,不再见外人.根据山上附近居民所流传的说法,逐青有一个很奇怪的癖好,从他住进来那天开始,他就开始在他的院子周围种竹子,第1个月种1根竹子,第2个月种8根竹子,第3个月种27根竹子…第N个月就种(N^3)根竹子.他说当他种下第X根竹子那一刻,就是他重出江湖之时!告诉你X的值,你能算出逐青的复出会是在第几个月吗?Input 首先输入一个t,表示有t组数据,跟着t行.每行是一个整数X,X<1000000000Output 输出一个整数n,表示在第n个月复出SampleInput 3 1 2 10SampleOutput 1 2 3直接打表就可以了~~ 将第i个月能种多少竹子,存在db[i]中~ 再从db.length-1依次往前面小的找~直到找到x大于db[i], 这个时候i+1就是答案了~~根据打表可知数组累加到253,和就正好超过10亿了。importjav

  • OJ刷题记录:将十进制数转换成八进制数 题目编号:545

    将十进制数转换成八进制数题目编号:545题目要求: 将三个十进制数分别转换成八进制数,建议使用栈来实现。输入描述 输入三个十进制数,每个占一行。 输出描述 输出每个十进制数所对应的八进制数,每个占一行。 输入样例 256 189 15 输出样例 400 275 17解题思路: 一个十进制整数转换为八进制表示的数时,可按除8取余的方法进行。高进制转换为低进制时先取得的余数为低位数,而进制转换时我们需要从高位到低位,所以我们将所得余数依次压入栈,因为栈先进后出,输出时即可实现从高位到低位的结果输出。通关代码:#include<iostream> #defineLENGTH10 usingnamespacestd; classStack{ public: Stack():top_(-1){} public: voidPush(intval); voidPop(); voidPrint(); private: intlist_[LENGTH]; inttop_; }; voidStack::Push(intval){ top_++

  • 一个静态注入动态库的工具: luject

    luject是一个静态注入动态库的工具,它可以实现对mac,ios,linux,windows的可执行程序,动态库程序进行修改,来插入指定动态库实现注入和加载。另外luject也实现了对ios的ipa包,android的apk包自己macOS的.app包的动态库注入,重打包和重签名支持。注入技术简介我们可以通过ptrace附加或启动一个程序,然后将指定的动态库注入进去,但很多情况下需要root权限才行。除了通过动态注入,我们也可以通过设置DYLD_INSERT_LIBRARIES等环境变量的方式,来注入指定的动态库,mac/ios程序就可以使用这种方式来简单快速地实现注入,例如:$DYLD_INSERT_LIBRARIES=inject.dylib./test 复制不过这种方式在ios上也需要越狱后才可用,另外我们也可以在工程的BuildSettings中找到OtherLinkerFlages并添加下面的字段来限制这种加载方式,实现对可执行程序的注入保护。-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null 复制因此,也不是非常的通用,其实还有

  • 04-OpenStack的命令行管理

    命令行管理在计算节点安装openstack客户端管理工具[root@computer~]#yuminstall-ypython-*client复制把控制节点的OpenStack客户端环境配置复制到计算节点[root@controller~]#scp/root/keystonerc_adminroot@computer:/root复制加载环境变量[root@computer~]#sourcekeystonerc_admin复制glance查看帮助#查看glance有哪些命令参数 [root@computer~(keystone_admin)]#glance--help Positionalarguments: <subcommand> image-createCreateanewimage. image-deleteDeletespecifiedimage(s). image-downloadDownloadaspecificimage. image-listListimagesyoucanaccess. image-showDescribeaspecificimage. i

  • 测试开发进阶(二十五)

    痛点代码冗余极其严重,不符合优秀测开风格数据校验非常麻烦,且可复用性差编码没有统一的规范,杂乱无章的感觉写的代码非常多,不够简洁仅支持json格式的传参,不支持form表单传参仅能返回json格式的数据,其他类型不支持列表页视图没有分页,过滤,排序功能DjangoRESTframework在Django框架基础上,进行二次开发用于构建RestfulAPI简称为DRF框架或RESTfreamwork框架特性提供了强大的Serializer序列化器,可以高效地进行序列化与反序列化操作提供了丰富的类视图,Mixin扩展类,ViewSet视图集提供了直观的WebAPI界面多种身份认证和权限认证强大的排序,过滤,分页,搜索,限流等功能可扩展性,插件丰富安装$pipinstalldjangorestframework复制配置LearnDjango/settings.py中添加'rest_framework'INSTALLED_APPS=['django.contrib.admin','django.contrib.auth','

  • 微信小程序敏捷开发实战

    wxml->wcc编译->javascript 用户javascript->wawebview->view小程序原理微信 小程序-》 webview appservice native首次加载cdn 小程序包 冷加载读取缓存/检查更新热加载直接后台切前台ajax请求server responsewebview预加载微信小程序以及后台交互架构后端服务服务apiwebserver-》业务应用-》文件,数据库,缓存 后台服务后台设备: lb负载均衡webserver业务应用服务器-》分布式存储-》数据库集群-》缓存集群serverless架构 无服务器image.pngimage.png小程序-》api网关-》云函数-》cdb云数据库小程序通过网络api,发起请求//主播 <live-pushersrc=""></live-pusher> //观众 <live-playersrc=""></live-player>复制构建直播小程序 申请腾讯云直播服务 获取加密私钥 部署自己的业

  • 时间管理,这篇文章就够了!

    hhhh,好像有点标题党的味道。今天分享一下时间管理的技能,时间管理不论是在读书的时候,还是在工作的时候,都特别重要。我一直觉得Life=Time. 之前接触过时间管理,走了很多弯路,自己也读过什么《高效能人士的七个臭毛病》这样的书,后来实际上发现没啥用,自己该拖延的还是拖延,本来要去学习的还是去打游戏。所以这里列出时间管理的误区,然后给出一个解决方法供大家参考。计划100%vs执行0%很多人最开始做时间管理常常会列出以下的一些清单:6:00-6:30起床洗漱 6:30-7:30学习java虚拟机 7:30-8:30锻炼,吃早餐 8:30-10:00在去公司的地铁上学习. ...复制看起来真的太完美了,我就想问一句:兄弟,你早上不困吗?而实际上做这种计划的人通常在深夜,而且深夜让人失去理智变得无比矫情。晚上想起来千条路,第二天起来走原路:一觉睡到8:30,匆匆忙忙赶地铁,早餐也没吃。 这里最重要的误区:时间管理!=时间计划。第二个误区是程序员可能由于很多人有代码洁癖的原因,一直追求完美,实际上面对问题,我们只需要追求迭代升级,不要追求一次完美。追求完美在时间上很容易造成拖延,你需要的是

  • 腾讯云汽车精准获客服务更新历史

    第1次发布 发布时间:2021-01-1414:56:09 本次发布包含了以下内容: 改善已有的文档。 新增接口: GetTaskDetail GetTaskList PredictRating QueryCallDetails QueryCallStat QueryGeneralStat UploadId 新增数据结构: CallDetailItem CallDetails CallStatItem GeneralStat LabelDetailData LabelValue ListModel RatingData TaskData TaskDetailData TaskListData

  • 使用国内pypi源来安装python包

    国内源 http://pypi.douban.com/ 豆瓣 http://pypi.hustunique.com/ 华中理工大学 http://pypi.sdutlinux.org/ 山东理工大学 http://pypi.mirrors.ustc.edu.cn/ 中国科学技术大学 使用方法 手动指定: 手动指定源,可以在pip后面跟-i来指定源,比如用豆瓣的源来安装slinter(记得在源地址后面添加simple): $sudopip3install-ihttp://pypi.douban.com/simple/splinter Requirementalreadysatisfied(use--upgradetoupgrade):splinterin/usr/local/lib/python3.4/dist-packages/splinter-0.7.3-py3.4.egg Downloading/unpackingselenium>=2.47.1(fromsplinter) http://pypi.douban.com/simple/

  • mockery expectation 覆盖

        publicfunctiontestOverrideExpectation() { //如果没有指定expectation调用次数,那么每次调用mock的expectation方法都会返回第一个expectation $mock=\Mockery::mock(); $mock->shouldReceive('foo')->andReturn('green'); $mock->shouldReceive('foo')->andReturn('blue'); $this->assertEquals('green',$mock->foo()); //第一个expectation指定了只调用一次,所以下面第二次调用的时候返回了blue $mock=\Mockery::mock(); $mock->shouldReceive('foo')->once()->andReturn('green'); $mock->shouldReceive('foo')->andReturn('blue'); $thi

  • 第十二关——2012提高组真题

    17:39:56我只见他对我笑过两次,一次生离,一次死别。——南派三叔《盗墓笔记》 总结:2012提高组真题类型 第一题Vigenère密码:模拟暴力 第二题国王游戏:贪心+高精度 第三题开车旅行:倍增 第四题同余方程:扩展欧几里得 第五题借教室:线段树/前缀数组 第一题Vigenère密码 要考虑的就是密钥k的长度问题,如果k的长度不够,我们需要把k不断的从第一个开始往后拼,直到拼到密文的长度,便于我们进行处理; 注意ASCLL码的转换,大小写中相差多少 #include<bits/stdc++.h> usingnamespacestd; charaa[10001],bb[10001],ans[10001]; boolcheck(intx) { if(x>='a'&&x<='z')returntrue; returnfalse; } intmain() { stringt,k; cin>>k>>t; intlk=k.length(),lt=t.length(); for(inti=0;i<lk;i

  • 《傅雷家书》- 读书有感

    看完这本把13年的信件汇集而成的书,仿佛看到了一位老父亲对儿子无微不至的关心和谆谆教导。在当时的社会,傅雷的很多观点可以说是超有前瞻性了,这可能得益于他的翻译工作和国外留学的经验。另一方面,傅雷的教育方式在现在看来,可能有点父权主义了,他对傅聪的生活和工作事无巨细,过于操心,已经超过了指导层面,迫切地想包办孩子的一切……这一点在书信中表现得淋漓尽致,可能一般的孩子都接受不了吧。但不得不说傅雷对艺术的解读,对人生的感悟以及对精神的信仰,真的令人敬佩和惊叹,这也是傅雷家书带给我们最宝贵的财富,值得再次品读!    

  • 程序员指令隐藏电脑文件夹

    隐藏指令: attrib+s+h/s/dwqj复制 隐藏成功后文件夹变灰色,退出H盘,再次进入,就会发现"wqj"文件夹已经被隐藏     打开隐藏指令 attrib-s-h/s/dwqj复制 再次打开H盘,可发现“wqj”文件夹已经可见    注: 如果要隐藏H盘文件,需打开H盘,在下图位置,输入“cmd”,点击回车即可。其他盘或者文件夹以此类推  

  • django中配置允许跨域请求

      https://www.cnblogs.com/randomlee/p/9752705.html   pipinstalldjango-cors-headers==3.10.0复制 INSTALLED_APPS=[ ... 'corsheaders', ... ]复制 MIDDLEWARE_CLASSES=( ... 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', ... )复制 CORS_ALLOW_CREDENTIALS=True CORS_ORIGIN_ALLOW_ALL=True CORS_ORIGIN_WHITELIST=() CORS_ALLOW_METHODS=( 'DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'VIEW', ) CORS_ALLOW_HEADERS=( 'accept', 'accept-encoding', 'authoriza

  • 作业(二)——学习callback回调函数

    简介:   回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应   可能这些概念性的东西不是太好理解,通俗一点,回调函数就是在两个独立函数或者独立类通信的通道 举个例子:  财务处是负责对公司财务状况和每个月的开销进行汇总   老板只会去看每个月的报表  那么在这个当中,老板不会去关心,财务整个汇总的过程,他只会去关心结果,那么,如果从面向对象的方法去理解的话,老板是一个对象.财务部是一个对象,当老板想看报表的时候,会跟财务打个招呼,等财务部汇总完了.然后将报表再去提交给老板,那么问题来了,而两个类之间实现通信的就是接口回调,从财务类的中,将结果回调到对象中.这种实现是通过接口自动完成的  如果用C语言的面向过程去理解的话,那么老板想看报表可以理解为一个函数,而财务处计算过程可以看成一个

  • 树上M乘积路径数

    此题是在某个的oj上看到的,题目标题和数据都不记得了,只能说个大概(标题瞎编的) 题目大意 给出\(n\)个点,可以任意选择生成树和\([1,m]\)的边权。由这些点连成一棵树,树中每一条边的权重介于\([1,m]\)给出两点\(a,b\)问有多少种树满足\(a,b\)之间的路径的权值乘积为\(m\) 数据范围 \(n<=10^{6}\)(应该是),\(m<=10^{18}\) 题目解析 这里有道简化版的类似题目:CodeForces#539(Div.2)F:SashaandInterestingFactfromGraphTheory 首先此题需要用到凯利公式(原题提示中已给出):$$设T_{n,k}为n个有标号点分成k个连通块的的分割种数,其中节点1,2,3,…k属于不同的联通块,则有 T_{n,k}=k\n^{n-k-1}$$ 与上面简化版类似,假设给定的\(a,b\)之间假设存在条路径,总共有\(i\)条边,\(i+1\)个点,那么除了\(a,b\)选择剩下的节点方案数为\(C_{n-2}^{i-1}\),乘以对点进行全排列\(A_{i-1}\)。 满足ab路径的边权

  • 模板集

     oi各类模板集 https://www.luogu.org/paste/h3mzcfo1 https://www.cnblogs.com/phemiku/p/11622062.html   各种模板题   1.快速幂与快速乘 #include<bits/stdc++.h> usingnamespacestd; typedeflonglongll; intkase,a,b,q; llc,d,r; intqpow(inta,intb,intq){ lls=1; while(b){ if(b&1) s=s*a%q; a=(ll)a*a%q; b>>=1; } returns; } llqmul(llc,lld,llr){ lls=0; while(d){ if(d&1) s=(s+c)%r; c=(c+c)%r; d>>=1; } returns; } intmain(){ scanf("%d",&kase); while(kase--){ scanf("%d%d%d%lld%lld%lld

  • Java动态代理演变之路

     1、什么是代理?     代理,英文成文Proxy。意思是你不用去做,别人代替你去处理。比如有人想找明星周董去唱歌,他需要做签约、讨论、唱歌和付款等等过程,但真正周董擅长的事情是唱歌,其他的事情可以交代给他的经纪人来做,经纪人就是一个代理,周董就是被代理的人。 2、我们为什么要引入代理?     比如我们要统计每个方法的执行时间,以对性能做出评估,那我们就需要在每个方法的头尾都需要一个获取时间的方法?这样的代码是不是就有“坏味道”了呢?而针对这个问题我们就可以引入代理,让代理类来做这些事情。 3、代理分类     代理可以分为静态代理和动态代理,究竟什么是静态代理,什么是动态代理呢?且看我的分析:静态代理,我们的代理类由我们在程序中直接并主动创建;动态代理,当程序运行期间自动创建代理类,而不需要我们在编写程序时主要的去编写代码。    由于篇幅关系,本文首先介绍静态代理。 4、静态代理实现   4.1接

  • .NET 云原生架构师训练营(RGCA 四步架构法)--学习笔记

    RGCA Requirement:从利益相关者获取需求 Goal:将需求转化为目标(功能意图) Concept:将目标扩展为完整概念 Architecture:将概念扩展为架构 目录 从利益相关者获取需求 将需求转化为目标 将目标扩展为完整概念 从利益相关者获取需求 有哪些类型的利益相关者 利益相关者需求 需求分类与排序 需求的特征 有哪些类型的利益相关者 利益相关方 关注系统的事物和对象 - 投资方 有助于解决问题的利益相关者 投资人微软、微软股东等 受益者 从系统受益的利益相关方 客户、程序员 客户 订购系统或购卖系统的利益相关方 使用ASP.NETCore开发应该的组织 用户 直接操作使用系统的利益相关方 C#程序员 供应商 开发、支持和管理系统或商品的利益相关方 利益相关者需求 利益相关方 投资人微软、微软股东等 - 受益者 投资人 通过框架吸引C#开发者,为开发工具VisualStudio和Azure云带去收入 客户 使用ASP.NETCore开发应用的组织 低成本,开发高质量、可靠的产品产生收入;可以快速开

  • 推荐系统相关资料

    一、一般推荐系统的构建流程 一般推荐系统的架构分为三个部分:在线部分,近线部分和离线部分。 理解业务问题,比如是分类、回归、聚类问题 选取特征:数值型、分类型 训练模型、导出模型文件、模型部署 二、召回阶段 三、排序阶段 (1)、LR (2)、FM/FFM 在LR的模型中加入二阶特征的组合,即任意两个特征进行组合作为新的特征,这种组合的方式和多项式核方法SVM是等价的,然而在实际的业务中它有个潜在的问题,在大规模稀疏特征的场景下,模型的泛化能力很弱。 为什么说FM模型泛化能力强? 第09章:深入浅出ML之Factorization家族|计算广告与机器学习 深入FFM原理与实践-美团技术团队 推荐系统召回四模型之:全能的FM模型-知乎 (3)、GBDT+LR融合模型 一般说要训练推荐打分或者分类模型,99%的人会想到经典的逻辑回归(以下称LR),的确,LR的优点很明显: 搭建简单:无论你是使用Python或者Scala,简单易用的接口让你分分钟能搭好一个分类模型 结果容易解释:输出的结果介于[0,1]之间,用来打分或者分类妥妥的 易大规模并行:其分布式优化算法SGD、LBFG

相关推荐

推荐阅读