精华内容
下载资源
问答
  • 什么是消息队列你了解过么?

    你知道的越多,你不知道的越多

    点赞再看,养成习惯

    GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善

    面试开始

    一个风度翩翩,穿着格子衬衣的中年男子,拿着一个满是划痕的mac向你走来,看着铮亮的头,心想着肯定是尼玛顶级架构师吧!但是我们看过暖男敖丙的系列,腹有诗书气自华,虚都不虚。

    小伙子之前问了你这么多Redis的知识,你不仅对答如流,你还能把各自场景的解决方案,优缺点说得这么流畅,说你是不是看过敖丙写的《吊打面试官》系列呀?

    惊!!!老师你怎么知道的,我看了他的系列根本停不下来啊。

    呵呵,Redis没难住你,但是我问个新的技术栈我还怕难不住你?我问问你你项目中用过消息队列么?你为啥用消息队列?

    噗此,这也叫问题?别人用了我能不用么?别人用了我就用了呗,我就是为了用而用。

    你心里嘀咕就好了,千万别说出来哈,说出来了没拿到Offer别到时候就在那说,敖丙那个渣男教我说的!

    面试官你好:我们公司本身的业务体量很小,所以直接单机一把梭啥都能搞定了,但是后面业务体量不断扩大,采用微服务的设计思想分布式的部署方式,所以拆分了很多的服务,随着体量的增加以及业务场景越来越复杂了,很多场景单机的技术栈和中间件以及不够用了,而且对系统的友好性也下降了,最后做了很多技术选型的工作,我们决定引入消息队列中间件

    哦?你说到业务场景越来越复杂,你那说一下你都在什么场景用到了消息队列?

    嗯,我从三个方面去说一下我使用的场景吧。

    Tip:这三个场景也是消息队列的经典场景,大家基本上要烂熟于心那种,就是一说到消息队列你脑子就要想到异步、削峰、解耦,条件反射那种。

    异步:

    我们之前的场景里面有很多步骤都是在一个流程里面需要做完的,就比如说我的下单系统吧,本来我们业务简单,下单了付了钱就好了,流程就走完了。

    但是后面来了个产品经理,搞了个优惠券系统,OK问题不大,流程里面多100ms去扣减优惠券。

    后来产品经理灵光一闪说我们可以搞个积分系统啊,也行吧,流程里面多了200ms去增减积分。

    再后来后来隔壁的产品老王说:下单成功后我们要给用户发短信,也将就吧,100ms去发个短信。

    再后来。。。(敖丙你有完没完!!!)

    反正就流程有点像这样 ↓

    你们可以看到这才加了三个,我可以斩钉截铁的告诉你真正的下单流程涉及的系统绝对在10个以上(主流电商),越大的越多。

    这个链路这样下去,时间长得一批,用户发现我买个东西你特么要花几十秒,垃圾电商我不在你这里买了,不过要是都像并夕夕这么便宜,真香

    但是我们公司没有夕夕的那个经济实力啊,那只能优化系统了。

    Tip:我之前在的电商老东家要求所有接口的RtResponseTime响应时间)在200ms内,超出的全部优化,我现在所负责的系统QPS也是9W+就是抖动一下网络集群都可能炸锅那种,RT基本上都要求在50ms以内。

    大家感受一下这个QPS。

    嗯不错,链路长了就慢了,那你怎么解决的?

    那链路长了就慢了,但是我们发现上面的流程其实可以同时做的呀,你支付成功后,我去校验优惠券的同时我可以去增减积分啊,还可以同时发个短信啊。

    那正常的流程我们是没办法实现的呀,怎么办,异步

    你对比一下是不是发现,这样子最多只用100毫秒用户知道下单成功了,至于短信你迟几秒发给他他根本不在意是吧。

    小伙子我打断你一下,你说了异步,那我用线程,线程池去做不是一样的么?

    诶呀,面试官你不要急嘛,我后面还会说到的,骚等。

    解耦:

    既然面试官这么问了,我就说一下为啥我们不能用线程去做,因为用线程去做,你是不是要写代码?

    你一个订单流程,你扣积分,扣优惠券,发短信,扣库存。。。等等这么多业务要调用这么多的接口,每次加一个你要调用一个接口然后还要重新发布系统,写一次两次还好,写多了你就说:老子不干了!

    而且真的全部都写在一起的话,不单单是耦合这一个问题,你出问题排查也麻烦,流程里面随便一个地方出问题搞不好会影响到其他的点,小伙伴说我每个流程都try catch不就行了,相信我别这么做,这样的代码就像个定时炸弹💣,你不知道什么时候爆炸,平时不炸偏偏在你做活动的时候炸,你就领个P0故障收拾书包提前回家过年吧。

    Tip:P0—PN 是互联网大厂经常用来判定事故等级的机制,P0是最高等级了。

    但是你用了消息队列,耦合这个问题就迎刃而解了呀。

    哦,帅丙怎么说?

    且听我娓娓道来:

    你下单了,你就把你支付成功的消息告诉别的系统,他们收到了去处理就好了,你只用走完自己的流程,把自己的消息发出去,那后面要接入什么系统简单,直接订阅你发送的支付成功消息,你支付成功了我监听就好了

    那你的流程走完了,你不用管别人是否成功么?比如你下单了积分没加,优惠券没扣怎么办?

    问题是个好问题,但是没必要考虑,业务系统本身就是自己的开发人员维护的,你积分扣失败关我下单的什么事情?你管好自己下单系统的就好了。

    Tip:话是这么说,但是这其实是用了消息队列的一个缺点,涉及到分布式事务的知识点,我下面会提到。

    削峰:

    就拿我上一期写的秒杀来说(暗示新同学看我上一期),你平时流量很低,但是你要做秒杀活动00 :00的时候流量疯狂怼进来,你的服务器,RedisMySQL各自的承受能力都不一样,你直接全部流量照单全收肯定有问题啊,直接就打挂了。

    那怎么办?

    简单,把请求放到队列里面,然后至于每秒消费多少请求,就看自己的服务器处理能力,你能处理5000QPS你就消费这么多,可能会比正常的慢一点,但是不至于打挂服务器,等流量高峰下去了,你的服务也就没压力了。

    你看阿里双十一12:00的时候这么多流量瞬间涌进去,他有时候是不是会慢一点,但是人家没挂啊,或者降级给你个友好的提示页面,等高峰过去了又是一条好汉了。

    为了这个图特意打高一台服务的流量
    为了这个图特意打高一台服务的流量

    听你说了辣么多,怎么都是好处,那我问你使用了消息队列有啥问题么?

    诶,看过前面我写的文章的人才都知道,我经常说的就是,技术是把双刃剑

    没错面试官,我使用他是因为他带给我们很多好处,但是使用之后问题也是接踵而至

    同样的暖男我呀,也从三个点介绍他主要的缺点:

    系统复杂性

    本来蛮简单的一个系统,我代码随便写都没事,现在你凭空接入一个中间件在那,我是不是要考虑去维护他,而且使用的过程中是不是要考虑各种问题,比如消息重复消费消息丢失消息的顺序消费等等,反正用了之后就是贼烦。

    我插一句嘴,上面的问题(重复消费、消息丢失、顺序消费)你能分别介绍一下,并且说一下分别是怎么解决的么?

    不要!我都说了敖丙下一章写啥?

    其实不是暖男我不想在这里写,这三个问题我想了下,统统都是MQ重点问题,单独拿一个出来就是一篇文章了,篇幅实在太长了,我会在下一章挨个介绍一遍的。

    数据一致性

    这个其实是分布式服务本身就存在的一个问题,不仅仅是消息队列的问题,但是放在这里说是因为用了消息队列这个问题会暴露得比较严重一点。

    就像我开头说的,你下单的服务自己保证自己的逻辑成功处理了,你成功发了消息,但是优惠券系统,积分系统等等这么多系统,他们成功还是失败你就不管了?

    我说了保证自己的业务数据对的就好了,其实还是比较不负责任的一种说法,这样就像个渣男,没有格局这样呀你的路会越走越窄的

    所有的服务都成功才能算这一次下单是成功的,那怎么才能保证数据一致性呢?

    分布式事务:把下单,优惠券,积分。。。都放在一个事务里面一样,要成功一起成功,要失败一起失败。

    Tip:分布式事务在互联网公司里面实在常见,我也不在这里大篇幅介绍了,后面都会专门说的。

    可用性

    你搞个系统本身没啥问题,你现在突然接入一个中间件在那放着,万一挂了怎么办?我下个单MQ挂了,优惠券不扣了,积分不减了,这不是杀一个程序员能搞定的吧,感觉得杀一片。

    至于怎么保证高可用,还是那句话也不在这里展开讨论了,我后面一样会写,像写Redis那样写出来的。

    放心敖丙我不是渣男来的,我肯定会对你们负责的。点赞!

    看不出来啊,你有点东西呀,那我问一下你,你们是怎么做技术选型的?

    目前在市面上比较主流的消息队列中间件主要有,Kafka、ActiveMQ、RabbitMQ、RocketMQ 等这几种。

    不过敖丙我想说的是,ActiveMQRabbitMQ这两着因为吞吐量还有GitHub的社区活跃度的原因,在各大互联网公司都已经基本上绝迹了,业务体量一般的公司会是有在用的,但是越来越多的公司更青睐RocketMQ这样的消息中间件了。

    KafkaRocketMQ一直在各自擅长的领域发光发亮,不过写这篇文章的时候我问了蚂蚁金服,字节跳动和美团的朋友,好像大家用的都有点不一样,应该都是各自的中间件,可能做过修改,也可能是自研的,大多没有开源

    就像我们公司就是是基于KafkaRocketMQ两者的优点自研的消息队列中间件,吞吐量、可靠性、时效性等都很可观。

    我们回归正题,我这里用网上找的对比图让大家看看差距到底在哪里:

    大家其实一下子就能看到差距了,就拿吞吐量来说,早期比较活跃的ActiveMQRabbitMQ基本上不是后两者的对手了,在现在这样大数据的年代吞吐量是真的很重要

    比如现在突然爆发了一个超级热点新闻,你的APP注册用户高达亿数,你要想办法第一时间把突发全部推送到每个人手上,你没有大吞吐量的消息队列中间件用啥去推?

    再说这些用户大量涌进来看了你的新闻产生了一系列的附带流量,你怎么应对这些数据,很多场景离开消息队列基本上难以为继

    部署方式而言前两者也是大不如后面两个天然分布式架构的哥哥,都是高可用的分布式架构,而且数据多个副本的数据也能做到0丢失。

    我们再聊一下RabbitMQ这个中间件其实还行,但是这玩意开发语言居然是erlang,我敢说绝大部分工程师肯定不会为了一个中间件去刻意学习一门语言的,开发维护成本你想都想不到,出个问题查都查半天。

    至于RocketMQ(阿里开源的),git活跃度还可以。基本上你push了自己的bug确认了有问题都有阿里大佬跟你试试解答并修复的,我个人推荐的也是这个,他的架构设计部分跟同样是阿里开源的一个RPC框架是真的很像(Dubbo)可能是因为师出同门的原因吧。

    Tip:Dubbo等我写到RPC我会详细介绍的。

    Kafka我放到最后说,你们也应该知道了,压轴的这是个大哥,大数据领域,公司的日志采集,实时计算等场景,都离不开他的身影,他基本上算得上是世界范围级别的消息队列标杆了。

    以上这些都只是一些我自己的个人意见,真正的选型还是要去深入研究的,不然那你公司一天UV就1000你告诉我你要去用Kafka我只能说你吃饱撑的。

    记住,没有最好的技术,只有最适合的技术,不要为了用而用

    面试结束

    嗯,小伙子不错不错,分析得很到位,那你记得下期来说一下消息队列的高可用,重复消费、消息丢失、消息顺序、分布式事务等问题?

    嗯嗯好的面试官,不过不确定能不能一口气说完,毕竟敖丙还没开始写,而且读者还有可能白嫖,动力不一定够。

    嗯嗯这倒是个问题,不过啊在看的都是人才肯定会给你点赞👍的!

    我也这么认为。

    总结

    消息队列的基础知识我就先介绍这么多,消息队列在面试里面基本上也是跟我前面写的Redis一样必问的。

    面试的思路还是一样,要知其然,也要知其所以然,就是要知道为啥用,用了有啥好处,有啥坑。

    面试官不喜欢只知道用的,你只会用那哪天线上出问题怎么办?你难道在旁边拜佛?

    Tip:本来有很多我准备的资料的,但是都是外链,或者不合适的分享方式,博客的运营小姐姐提醒了我,所以大家去公众号回复【资料】好了。

    鸣谢

    之前的文章写了很多人加我,然后有个人才说是他蚂蚁金服的Leader推荐的我,我突然意识到我文章的受众好像慢慢变广了,之后不严谨的点要杜绝掉。

    所以之后我的文章经常会有大厂的小伙伴Review,也希望帮助我更好的监督自己的文章吧。

    这次是 某阿里系电商跟我一起做过活动小组的 佩恩 帮我Review的文章,感谢!

    絮叨

    另外,敖丙把自己的面试文章整理成了一本电子书,共 1630页!目录如下

    现在免费送给大家,在我的公众号三太子敖丙回复 【888】 即可获取。

    我是敖丙,一个在互联网苟且偷生的程序员。

    你知道的越多,你不知道的越多人才们的 【三连】 就是丙丙创作的最大动力,我们下期见!

    注:如果本篇博客有任何错误和建议,欢迎人才们留言!


    文章持续更新,可以微信搜索「 三太子敖丙 」第一时间阅读,回复【资料】有我准备的一线大厂面试资料和简历模板,本文 GitHub https://github.com/JavaFamily 已经收录,有大厂面试完整考点,欢迎Star。

    展开全文
  • 1、什么是单例模式 单例模式意味着只有个对象,至于单例模式如何实现就不这里就不多说了,有很多种实现办法。 2、什么时候该使用单例模式?如果不使用单例模式会出现什么问题? 先举2个例子 例子1 当我们做...

    1、什么是单例模式

    单例模式意味着只有一个对象,至于单例模式如何实现就不这里就不多说了,有很多种实现办法。

     

     

    2、什么时候该使用单例模式?如果不使用单例模式会出现什么问题?

    先举2个例子
     
    例子1
                
    当我们做得到最新的短信和最新的通话记录的时候,我们一般采取一个类继承ContentObserver,当数据库里面的内容变化时候,就会触发里面的onchange()函数,部分代码如下
     
    public class Sms {
            public Handler  handler;
            public HandlerThread handlerThread;
            public statid final threadName = "smsThread";
        
            public Sms(){
                   handlerThread = new HandlerThread (threadName );
                   handlerThread .start();
                   handler = new Handler(handlerThread.getLoop());
            }
         
    class sms extend contentObserver {
    
          onchange(boolean self){
                //逻辑代码
               //上传给服务端用handler
               handler.post(new Runable(){
               
                });
          }
    }
    }
    
    这里没有写注册的代码,问题是onchange会多回调很多次,当我们在不同的地方多次构建Sms对象的时候,然后就有了很多不同的handler,然后再去发送就会发送重复数据,我们为了避免重复数据,这样的情况下我们就需要采取单例模式得到handler,改成下面的情况
    public class Sms {
            public Handler  handler;
            public HandlerThread handlerThread;
            public statid final threadName = "smsThread";
            private Sms sms= new Sms();
        
            private Sms(){
                   handlerThread = new HandlerThread (threadName);
                   handlerThread .start();
                   handler = new Handler(handlerThread.getLoop());
            }
            public static Sms getInstance() {
                return  sms;
            }
             
         
    class sms extend contentObserver {
    
          onchange(boolean self){
                //逻辑代码
               //上传给服务端用handler
               handler.post(new Runable(){
               
                });
          }
    }
    }
     
    这样当我们构建对象的时候只有一个,就不会上传重复数据了
     
    例子2
     
    当我们做通话录音的功能,会通过自己写的onstart(), 然后里面实现我们的录音功能,但是我们构建这个类的对象的时候有多次,但是我们每次只允许一个地方录音,然后在我们类通过一个成员属性变量,来控制,如下
     
    public Record () {
        public boolean isRunning = false;
        public Record (){}
        public onstart() {
         isRunning  =  true;
         //录音逻辑
       }
    }

    当我们多个地方调用的时候,每次都是构建Record,我们又初始化了isRunning,所以这个里面的isRunning = true,无效
     
    这个时候我们需要采用单例模式
     
    public Record(){
      public Record record = new Record();
      public boolean isRunning = false;
      private Record () {
       }
    
       public Record static getInstance() {
            return record;
       }
       public onstart() {
           isRunning = true;
           //录音逻辑
       }
    }
    

    这样就不会重复录音了,其实还有一个办法,就是把这个isRunning变成静态变量,但是我们出发点还是希望一个对象好,所以我们还是用单例模式吧。
     
     

    3、总结

    当这个类的对象在多个地方创建的时候,使得内部的方法多次调用,但是我们希望只要一个对象操作这个方法,或者不希望多个地方同时调用这个方法,我们需要保持这个方法的单一性质,我们就用单利模式吧。
     
     
     

     

    展开全文
  • 希望下文能对大家有帮助。  你需先了解以下内容: 1.浏览器 请使用chrome浏览器,更新到最新版。我们对chrome浏览器支持最好,其他浏览器,我们还在加油! 2.场景文案 场景制作前,先要策划好文案,你才能为...

               应用之星已经让做个免费场景不难,但做个好看的,这就需要用户自己修炼了!希望下文能对大家有帮助。

               你需先了解以下内容:

    1.浏览器

    请使用chrome浏览器,更新到最新版。我们对chrome浏览器支持最好,其他浏览器,我们还在加油!

    2.场景文案

    场景制作前,先要策划好文案,你才能为场景定好图片、音乐等调子。一切始于文案!名称和描述就是场景的广告,名称和标题都应当具有吸引力,另外名称比描述重要。

    3.场景图片

    图片好了,你的场景就成功了一半,那么,如何为场景制作好图片?

    图片素材可以从以下渠道获取:

    ①公司内部;

    ②设计师制作;

    ③百度图片搜索;

    ④花瓣等图片设计类网站。

    图片格式:

    ①静态背景图,推荐jpg格式;

    ②动态背景图,使用gif格式。

    图片大小:300KB以内,风景等色彩比较多的背景图,图片质量中高即可。

    图片适配问题:一部分需要场景应用制作平台解决,另一部分需要我们自己解决。

    3.场景动效

    给文字、图片等元素加上动作,就可以变成动效效果,有两种实现方式:

    ①通过应用之星提供的模板来解决,优点是按着模板制作,省时省力;

    ②通过应用之星提供的动效功能来自己设定动态效果,优点是自由度大,可以设计出好看的效果。

    4.背景音乐

    用户访问场景时开始播放音乐,可以增加场景感染力。

    音乐素材如何获得:

    ①百度音乐下载,然后本地上传;

    ②在音乐库查找。

    制作要求:

    ①40秒-1分钟为宜;

    ②节奏适合重复播放;

    ③大小1-2M,不应大于3M,否则用户打开加载时间长然后本地上传体验不好,这跟图片要控制大小一个道理。

    了解完这些后,制作就很简单了。

    以下是app制作步骤。

    1. 进入应用之星网站,注册激活账号并登录;

    2. 点击应用制作——>高级模式——>点“+”创建;你也可以直接使用系统模板;


    3. 进入制作界面,有各种控件使用,根据需要进行选择。你可以使用音乐控件,视频控件,也可以设置动画效果,这样制作出来的效果更酷炫。关于控件的使用,请看教程:应用之星:app开发的控件合集介绍


    4. 当你觉得制作完成后,在发布之前,你可以点开设置,在这里,你可以添加名称、描述、选择类型、翻页方式,翻页效果,播放方式,选择背景音乐,修改封面。

    5. 等你一切制作好后,点击设置—>高级,再选择Android,即可生成安卓app了。其中Web就是指的H5页面。有关H5页面的介绍,请看:http://www.appstar.com.cn/course/290670.html

    6. 点击发布,你将看到预览页面,通过扫描二维码就能下载了。Android即app,Web即H5页面。

    是不是很简单?动手制作一个吧。


    展开全文
  • 各种机器学习算法的应用场景分别是什么?   关于这个问题我今天正好看到了这个文章。讲的正是各个算法的优劣分析,很中肯。 https://zhuanlan.zhihu.com/p/25327755正好14年的时候有人做过个实验[1],比较在...

    各种机器学习算法的应用场景分别是什么?

     

    关于这个问题我今天正好看到了这个文章。讲的正是各个算法的优劣分析,很中肯。

    https://zhuanlan.zhihu.com/p/25327755正好14年的时候有人做过一个实验[1],比较在不同数据集上(121个),不同的分类器(179个)的实际效果。

    论文题为:Do we Need Hundreds of Classifiers to Solve Real World Classification Problems?

    实验时间有点早,我尝试着结合我自己的理解、一些最近的实验,来谈一谈吧。主要针对分类器(Classifier)。

    没有最好的分类器,只有最合适的分类器。

    随机森林平均来说最强,但也只在9.9%的数据集上拿到了第一,优点是鲜有短板。

    SVM的平均水平紧随其后,在10.7%的数据集上拿到第一。

    神经网络(13.2%)和boosting(~9%)表现不错。

    数据维度越高,随机森林就比AdaBoost强越多,但是整体不及SVM[2]。

    数据量越大,神经网络就越强。

    近邻 (Nearest Neighbor)

     

    典型的例子是KNN,它的思路就是——对于待判断的点,找到离它最近的几个数据点,根据它们的类型决定待判断点的类型。

    它的特点是完全跟着数据走,没有数学模型可言。

    适用情景:

    需要一个特别容易解释的模型的时候。

    比如需要向用户解释原因的推荐算法。

    贝叶斯 (Bayesian)

    典型的例子是Naive Bayes,核心思路是根据条件概率计算待判断点的类型。

    是相对容易理解的一个模型,至今依然被垃圾邮件过滤器使用。

    适用情景:

    需要一个比较容易解释,而且不同维度之间相关性较小的模型的时候。

    可以高效处理高维数据,虽然结果可能不尽如人意。

    决策树 (Decision tree)

     

     

    决策树的特点是它总是在沿着特征做切分。随着层层递进,这个划分会越来越细。

    虽然生成的树不容易给用户看,但是数据分析的时候,通过观察树的上层结构,能够对分类器的核心思路有一个直观的感受。

    举个简单的例子,当我们预测一个孩子的身高的时候,决策树的第一层可能是这个孩子的性别。男生走左边的树进行进一步预测,女生则走右边的树。这就说明性别对身高有很强的影响。

    适用情景:

    因为它能够生成清晰的基于特征(feature)选择不同预测结果的树状结构,数据分析师希望更好的理解手上的数据的时候往往可以使用决策树。

    同时它也是相对容易被攻击的分类器[3]。这里的攻击是指人为的改变一些特征,使得分类器判断错误。常见于垃圾邮件躲避检测中。因为决策树最终在底层判断是基于单个条件的,攻击者往往只需要改变很少的特征就可以逃过监测。

    受限于它的简单性,决策树更大的用处是作为一些更有用的算法的基石。

    随机森林 (Random forest)

    提到决策树就不得不提随机森林。顾名思义,森林就是很多树。

    严格来说,随机森林其实算是一种集成算法。它首先随机选取不同的特征(feature)和训练样本(training sample),生成大量的决策树,然后综合这些决策树的结果来进行最终的分类。

    随机森林在现实分析中被大量使用,它相对于决策树,在准确性上有了很大的提升,同时一定程度上改善了决策树容易被攻击的特点。

    适用情景:

    数据维度相对低(几十维),同时对准确性有较高要求时。

    因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林。

    SVM (Support vector machine)

     

    SVM的核心思想就是找到不同类别之间的分界面,使得两类样本尽量落在面的两边,而且离分界面尽量远。

    最早的SVM是平面的,局限很大。但是利用核函数(kernel function),我们可以把平面投射(mapping)成曲面,进而大大提高SVM的适用范围。

     

    提高之后的SVM同样被大量使用,在实际分类中展现了很优秀的正确率。

    适用情景:

    SVM在很多数据集上都有优秀的表现。

    相对来说,SVM尽量保持与样本间距离的性质导致它抗攻击的能力更强。

    和随机森林一样,这也是一个拿到数据就可以先尝试一下的算法。

    逻辑斯蒂回归 (Logistic regression)

    逻辑斯蒂回归这个名字太诡异了,我就叫它LR吧,反正讨论的是分类器,也没有别的方法叫LR。顾名思义,它其实是回归类方法的一个变体。

    回归方法的核心就是为函数找到最合适的参数,使得函数的值和样本的值最接近。例如线性回归(Linear regression)就是对于函数f(x)=ax+b,找到最合适的a,b。

    LR拟合的就不是线性函数了,它拟合的是一个概率学中的函数,f(x)的值这时候就反映了样本属于这个类的概率。

    适用情景:

    LR同样是很多分类算法的基础组件,它的好处是输出值自然地落在0到1之间,并且有概率意义。

    因为它本质上是一个线性的分类器,所以处理不好特征之间相关的情况。

    虽然效果一般,却胜在模型清晰,背后的概率学经得住推敲。它拟合出来的参数就代表了每一个特征(feature)对结果的影响。也是一个理解数据的好工具。

    判别分析 (Discriminant analysis)

    判别分析主要是统计那边在用,所以我也不是很熟悉,临时找统计系的闺蜜补了补课。这里就现学现卖了。

    判别分析的典型例子是线性判别分析(Linear discriminant analysis),简称LDA。

    (这里注意不要和隐含狄利克雷分布(Latent Dirichlet allocation)弄混,虽然都叫LDA但说的不是一件事。)

    LDA的核心思想是把高维的样本投射(project)到低维上,如果要分成两类,就投射到一维。要分三类就投射到二维平面上。这样的投射当然有很多种不同的方式,LDA投射的标准就是让同类的样本尽量靠近,而不同类的尽量分开。对于未来要预测的样本,用同样的方式投射之后就可以轻易地分辨类别了。

    使用情景:

    判别分析适用于高维数据需要降维的情况,自带降维功能使得我们能方便地观察样本分布。它的正确性有数学公式可以证明,所以同样是很经得住推敲的方式。

    但是它的分类准确率往往不是很高,所以不是统计系的人就把它作为降维工具用吧。

    同时注意它是假定样本成正态分布的,所以那种同心圆形的数据就不要尝试了。

    神经网络 (Neural network)

    神经网络现在是火得不行啊。它的核心思路是利用训练样本(training sample)来逐渐地完善参数。还是举个例子预测身高的例子,如果输入的特征中有一个是性别(1:男;0:女),而输出的特征是身高(1:高;0:矮)。那么当训练样本是一个个子高的男生的时候,在神经网络中,从“男”到“高”的路线就会被强化。同理,如果来了一个个子高的女生,那从“女”到“高”的路线就会被强化。

    最终神经网络的哪些路线比较强,就由我们的样本所决定。

    神经网络的优势在于,它可以有很多很多层。如果输入输出是直接连接的,那它和LR就没有什么区别。但是通过大量中间层的引入,它就能够捕捉很多输入特征之间的关系。卷积神经网络有很经典的不同层的可视化展示(visulization),我这里就不赘述了。

    神经网络的提出其实很早了,但是它的准确率依赖于庞大的训练集,原本受限于计算机的速度,分类效果一直不如随机森林和SVM这种经典算法。

    使用情景:

    数据量庞大,参数之间存在内在联系的时候。

    当然现在神经网络不只是一个分类器,它还可以用来生成数据,用来做降维,这些就不在这里讨论了。

    Rule-based methods

    这个我是真不熟,都不知道中文翻译是什么。

    它里面典型的算法是C5.0 Rules,一个基于决策树的变体。因为决策树毕竟是树状结构,理解上还是有一定难度。所以它把决策树的结果提取出来,形成一个一个两三个条件组成的小规则。

    使用情景:

    它的准确度比决策树稍低,很少见人用。大概需要提供明确小规则来解释决定的时候才会用吧。

    提升算法(Boosting)

    接下来讲的一系列模型,都属于集成学习算法(Ensemble Learning),基于一个核心理念:三个臭皮匠,顶个诸葛亮。

    翻译过来就是:当我们把多个较弱的分类器结合起来的时候,它的结果会比一个强的分类器更

    典型的例子是AdaBoost。

    AdaBoost的实现是一个渐进的过程,从一个最基础的分类器开始,每次寻找一个最能解决当前错误样本的分类器。用加权取和(weighted sum)的方式把这个新分类器结合进已有的分类器中。

    它的好处是自带了特征选择(feature selection),只使用在训练集中发现有效的特征(feature)。这样就降低了分类时需要计算的特征数量,也在一定程度上解决了高维数据难以理解的问题。

    最经典的AdaBoost实现中,它的每一个弱分类器其实就是一个决策树。这就是之前为什么说决策树是各种算法的基石。

    使用情景:

    好的Boosting算法,它的准确性不逊于随机森林。虽然在[1]的实验中只有一个挤进前十,但是实际使用中它还是很强的。因为自带特征选择(feature selection)所以对新手很友好,是一个“不知道用什么就试一下它吧”的算法。

    装袋算法(Bagging)

    同样是弱分类器组合的思路,相对于Boosting,其实Bagging更好理解。它首先随机地抽取训练集(training set),以之为基础训练多个弱分类器。然后通过取平均,或者投票(voting)的方式决定最终的分类结果。

    因为它随机选取训练集的特点,Bagging可以一定程度上避免过渡拟合(overfit)。

    在[1]中,最强的Bagging算法是基于SVM的。如果用定义不那么严格的话,随机森林也算是Bagging的一种。

    使用情景:

    相较于经典的必使算法,Bagging使用的人更少一些。一部分的原因是Bagging的效果和参数的选择关系比较大,用默认参数往往没有很好的效果。

    虽然调对参数结果会比决策树和LR好,但是模型也变得复杂了,没事有特别的原因就别用它了。

    Stacking

    这个我是真不知道中文怎么说了。它所做的是在多个分类器的结果上,再套一个新的分类器。

    这个新的分类器就基于弱分类器的分析结果,加上训练标签(training label)进行训练。一般这最后一层用的是LR。

    Stacking在[1]里面的表现不好,可能是因为增加的一层分类器引入了更多的参数,也可能是因为有过渡拟合(overfit)的现象。

    使用情景:

    没事就别用了。

    (修订:@庄岩

    提醒说stacking在数据挖掘竞赛的网站kaggle上很火,相信参数调得好的话还是对结果能有帮助的。

    http://blog.kaggle.com/2016/12/27/a-kagglers-guide-to-model-stacking-in-practice/**

    这篇文章很好地介绍了stacking的好处。在kaggle这种一点点提升就意味着名次不同的场合下,stacking还是很有效的,但是对于一般商用,它所带来的提升就很难值回额外的复杂度了。)

    多专家模型(Mixture of Experts)

    最近这个模型还挺流行的,主要是用来合并神经网络的分类结果。我也不是很熟,对神经网络感兴趣,而且训练集异质性(heterogeneity)比较强的话可以研究一下这个。

    讲到这里分类器其实基本说完了。讲一下问题里面其他一些名词吧。

    最大熵模型 (Maximum entropy model)

    最大熵模型本身不是分类器,它一般是用来判断模型预测结果的好坏的。

    对于它来说,分类器预测是相当于是:针对样本,给每个类一个出现概率。比如说样本的特征是:性别男。我的分类器可能就给出了下面这样一个概率:高(60%),矮(40%)。

    而如果这个样本真的是高的,那我们就得了一个分数60%。最大熵模型的目标就是让这些分数的乘积尽量大。

    LR其实就是使用最大熵模型作为优化目标的一个算法[4]。

    EM

    就像最大熵模型一样,EM不是分类器,而是一个思路。很多算法都是基于这个思路实现的。

    @刘奕驰 已经讲得很清楚了,我就不多说了。

    隐马尔科夫 (Hidden Markov model)

    这是一个基于序列的预测方法,核心思想就是通过上一个(或几个)状态预测下一个状态。

    之所以叫“隐”马尔科夫是因为它的设定是状态本身我们是看不到的,我们只能根据状态生成的结果序列来学习可能的状态。

    适用场景:

    可以用于序列的预测,可以用来生成序列。

    条件随机场 (Conditional random field)

    典型的例子是linear-chain CRF。

    具体的使用 @Aron 有讲,我就不献丑了,因为我从来没用过这个。

    就是这些啦。

    相关的文章:

    [1]: Do we need hundreds of classifiers to solve real world classification problems.

    Fernández-Delgado, Manuel, et al. J. Mach. Learn. Res 15.1 (2014)

    [2]: An empirical evaluation of supervised learning in high dimensions.

    Rich Caruana, Nikos Karampatziakis, and Ainur Yessenalina. ICML '08

    [3]: Man vs. Machine: Practical Adversarial Detection of Malicious Crowdsourcing Workers

    Wang, G., Wang, T., Zheng, H., & Zhao, B. Y. Usenix Security'14

    [4]:http://www.win-vector.com/dfiles/LogisticRegressionMaxEnt.pdf**



    作者:城市中迷途小书童
    链接:https://www.jianshu.com/p/3c6aad5bdefd
    來源:简书

    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

     

     

     

     

     

    展开全文
  • 详解java动态代理机制以及使用场景()

    万次阅读 多人点赞 2017-10-19 10:29:10
    说起java动态代理,在我刚开始学java时对这项技术也是十分困惑,明明可以直接调通的对象方法为什么还要使用动态代理?随着学习的不断深入和工作经验的积累,慢慢的体会并理解了java动态代理机制。昨天再给公司新同事...
  • 在h5火热的当下,各种绚丽的场景层出不穷。但是,我们是不是发现大部分或者说绝大部分的网站只是个向用户展示信息的平台。至于用户与其进行的交互则仅限于下拉浏览,点击触发,或者填写一些表单信息。我一直在思考...
  • 参考资料好的书籍都是值得反复看的,那好的文章,好的资料也值得...CF框架源码(这是份很重要的源码,可以看到CF框架的每次迭代,我们可以下载最新的版本来分析,或与以下文章对比学习。目前最新的是CF-1153.18.ta
  • 1.1 什么场景法?   场景法又称之为流程分析法,是种通过使用“场景”的特殊方式对玩法、系统等功能点或业务流程进行描述,奕是针对策划案模拟出不同的“场景”进行所有功能点及业务流程的覆盖,从而提高测试...
  • 区块链技术的核心是沿时间轴记录数据与合约,并且只能读取和写入,不能修改和删除。... 本文结合案例介绍金融领域内的6个区块链应用场景和细分市场:数字货币转账、支付、借贷;跨境支付与结算;央行
  • 结合 spring ,使用QLExpress做个淘宝的场景模型,对于场景的描述可以参照这个demo。 下载最新的QlExpresss代码 http://code.taobao.org/svn/QLExpress/trunk 运行下 ...
  • 之前面试被问@Transactional注解哪些场景下会失效,一时语塞致使面试失败。所以今天简单的和大家分享一下@Transactional相关的知识。 @Transactional 注解相信大家并不陌生,平时开发中很常用的个注解,它能保证...
  • Hibernate 二级缓存的使用场景

    千次阅读 2016-01-14 09:00:15
    Hibernate中提供了两级Cache,第级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程...
  • 连连看项目实战之(搭建场景

    千次阅读 2019-01-14 16:35:17
     Scene In Build中场景对应的下标从0开始,默认打开游戏后的界面的第场景,即下标为0的场景。所以最终的从上到下的排序结果是StartScene,LevelScene,GameSccene  现在,一切都准备就绪了,我们可以开开心心...
  • 另外种像刚才一样,主播1推流出去,观众拉流观看,其中观众1希望能和主播1视频连麦互动,这时观众1也会推一路流出去,主播将观众1的音视频流拉下来观看,这样他们之间就构成了个相互拉流观看的场景,相互都能...
  • 以下内容来自:  ...、视图与相机 产生目标场景视图的变换过程类似于用相机进行拍照,主要步骤为: (1)把相机固定在三脚架上,让它对准场景(视图变换); (1)对场景进行安排,使照片中各物...
  • Java 序列化和反序列化()Serializable 使用场景 1. 最简单的使用:Serializable 接口 2. 序列化 ID 的问题 3. ...
  • 想起了前些天个DBA朋友和我的聊天,是关于读写分离的场景中,读写模块是否使用同个帐号的问题,感觉蛮有代表性的,把聊天记录分享出来,欢迎大家继续讨论 朋友A问我:“那你们读写分离是2套账号还是一套呢...
  • 聊上拉电阻、下拉电阻、使用场景及阻值选择

    万次阅读 多人点赞 2020-03-14 15:28:13
    相关文章: 一文搞懂三极管开关电路,基极电阻如何选择? 文章目录 1. 上拉电阻 2. 下拉电阻 3. 上拉电阻使用场景 3.1. TTL驱动CMOS 3.2.... 今天的文章到这里就结束了,希望对你有帮助,我们下期见。
  • MQ入门总结()消息队列概念和使用场景

    万次阅读 多人点赞 2017-11-29 10:40:59
    如果希望发送的消息可以不被做任何处理、或者只被个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型。 2. 推模式和拉模式:消息的更新者 推(push)模式 是种基于C/S机制、由 服务器...
  • 多线程应用的场景什么? 我知道开发Application Server需要用到多线程, 我也使用过一些调度任务比如Quartz, Timer等等,还有Sping的线程池创建线程来处理时间很长的后续任务(比如个请求中,需要完成A:向...
  • ETCD应用场景

    千次阅读 2017-03-13 15:10:04
    etcd是什么?...很多人对这个问题的第反应可能是,它是个键值存储仓库,却没有重视官方定义的后半句,用于配置共享和服务发现。 A highly-available key value store for shared configuration
  • 从顶层的路由场景到底层的参数(路由场景-场景-规则组-规则-决策-因子-参数-数据接口-参数)每个节点、节点间都是由用户配置的,在产品上期望用户的操作流程是连贯的,在个操作流程中解决尽量多的问题。...
  • 流计算 应用场景

    千次阅读 2019-01-10 10:49:35
    举个搜索场景中的例子,当个卖家发布了条宝贝信息时,他希望的当然是这个宝贝马上就可以被卖家搜索出来、点击、购买啦,相反,如果这个宝贝要等到第二天或者更久才可以被搜出来,估计这个大哥就要骂娘了。...
  • 作者:机器之心 ...来源:知乎 著作权归作者所有。...Part 1:什么是迁移学习?迁移学习的场景与应用。 深度 | 迁移学习全面概述:从基本概念到相关研究 文章来源于http://sebastianruder.com,作...
  • Redis-使用场景

    万次阅读 2018-06-06 18:23:40
    Redis的7个应用场景 Redis是个key-value存储...个产品的使用场景肯定是需要根据产品的特性,先列举一下Redis的特点: 读写性能优异 持久化 数据类型丰富 单线程 数据自动过期 发布订阅 分布式 这里我...
  • 作者:xyzh ...来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。...随机森林平均来说最强,但也只在9.9%的数据集上拿到了第,优点是鲜有短板。 SVM的平均水平紧随其后,在10...
  • 一线工程师告诉你嵌入式真实现状与发展前景

    万次阅读 多人点赞 2018-10-02 18:49:59
    本人并不是年薪百万的技术大牛,但总算是名合格的嵌入式工程师,现在某企业担任嵌入式软件工程师开发职,以下观点可能会带有片面或者分析不全,但却是名一线企业嵌入式软件开发者真实感受和所得,希望能帮助...
  • 翻译官方文档加上自己的一些理解。 参考:WorldStreamer官方文档。 目标:将我自己的...设置个“参照点”(通常是Player,如果是RTS,则是Camera),当参照点足够接近某个虚拟格子,或碰到碰撞体时,将其异
  • 消息队列的使用场景

    万次阅读 多人点赞 2016-03-04 10:26:20
    、消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境,...
  • netty应用场景之三点

    千次阅读 2019-04-17 16:31:24
    前言 本文基于Netty4.1展开介绍相关理论模型,使用场景,基本组件、整体架构,知其然且知其所以然,希望给大家在实际开发实践、学习开源...Netty 应用场景一 使用netty可以作为一个http的服务器,就像ttomcat一样...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 488,677
精华内容 195,470
关键字:

一什么场景一什么希望