精华内容
下载资源
问答
  • 我听到的一些发声 ...技术路线吧,又没有那么多时间。也许是借口,时候时间,但人是惰性的,就……这个年龄确实需要些管理能力了,毕竟项目不是一个人搞定的。我们在招人时确实对他们管理能力的考虑,

    我听到的一些发声

    你们赚的钱已经可以了:

    我一个发小是做土木工程的,上海大学博士,参与很多著名建筑的工程,但是从薪资上看,还不如一些稍微像样的公司的6年多的高级开发。为什么?这就是行业的红利,个体是享受了这个红利。所以说我们做IT的,应该感谢马云,雷军等等他们。

    某转管理的程序员:

    有时候我也挺迷茫的,到底走技术路线还是管理路线。技术路线吧,又没有那么多时间。也许是借口,有时候有时间,但人是有惰性的,就……这个年龄确实需要些管理能力了,毕竟项目不是一个人搞定的。我们在招人时确实对他们有管理能力的考虑,因为你想,一个在小公司做那么久的技术,一定对周围的同学有些影响力,然后一般就会带团队。

    危机的根源

    我一直相信这样一句话:真正的危机,来源于在正确的时间做不正确的事。没有在正确的时间,为下一步做出积累,这才是危机的根源。

    比如,当你迈过了30岁这个坎,你的能力还局限于程序的范围,也没有积累好自己的深度以及视野。如果真是这样,我想我一定会每天夜不能寐,每天唾骂自己,你特么究竟每天在干神马。

    我也一直相信这样一句话,当你把你的眼泪流干了,你唯一剩下的就只有行动,只有行动和努力了。

    如果你正在这条成长路上的朋友,晚醒不如早醒,这就是我想说的。**千万别等到中年才发现自己没有建立好自己的护城河,这个时候才知道努力。**在自己努力的阶段,不仅不努力反了选择了纵容自己,这才是危机的根源。

    一条正确的人生规划路线

    我就是一个土生土长的程序员,最早做的前段开发(第一代css、js程序员),然后开始转做后端开发Java,又转到架构师以及管理,然后再做产品…以下就是我从有限的10年左右提炼出的部分建议。这些也许对你来说不一定有用,但一定是发自我内心的建议。

    23-27岁:技术积累阶段

    假设本科23岁毕业,那么工作的前5年对你来说就是打基础的阶段。在这5年时间里面,你要积累足够的技术底子,打磨自己的技术实力,成为某一个技术细分领域的牛人。

    我自己依然记得当年这样的场景:蹲在出租房里面每晚每晚的啃技术文档,在公司连续打地铺干通宵的场景。

    只有真正经历过贫穷,经历过苦难的人,才会越早就懂得努力才自己这一生唯一的出路和唯一的机会。忘了谁说的了,大概就是这个理。

    27-30岁:形成思维方法论和知识体系的阶段

    当你积累足够的技术实力,例如超过10万行代码以后,你应该形成了自己的思维方法论和自己独立的学习技巧,任何新的技术在你眼中都能迅速的看到技术的本质,快速吸收成为你的知识体系的一部分。

    你只要前一个阶段打的基础足够牢固,这个阶段你一定会开始蚕食别的领域,这是一定的。逐渐的不再满足于纯技术领域的探索,而是开始探索技术背后的事情:什么技术在什么样的场合能够发挥最大的价值;技术团队应该怎样构建;技术在公司未来的价值?创业公司对技术的需求?支撑技术的产品,怎样学习做产品?支撑产品背后的运营体系是怎样建立的?商业社会对技术、产品、运营等的是怎样的认知,商业社会有什么的特定规律?也许还有更多…

    在这个阶段,积累技术对你来说简直是小菜一碟,你更需要磨练的是思考能力,形成自己的思维方法和知识体系,这将是你帮助你一生的武器。

    30-33岁这个阶段,最关键的是了解自己。知道自己擅长什么,自己的优势在哪里,怎样才能够最大化自己的价值,同时也知道自己有什么重大缺陷。未来是扬长避短还是不断避免自己的缺陷,这些需要提前想清楚。

    如何打破35岁魔咒?

    古人云:生于忧患,死于安乐。

    1. 现有岗位上玩命干。就是要用牛逼的技术搞定别人口中的难题,就是要加班完成时间紧任务重的项目,业界不服不罢休。
    2. 跳槽。问下自己要多少钱,那些公司给得了,自己有别人要求的这些技术与管理能力没。没有就好好学,有就投简历吧。

    程序员常见发展路径有两种:管理路径、技术路径,以下

    你适合学什么?2.你需要学什么?

    1、阅读源码

    阅读、分析源码是程序员最基本的码代码能力也是码农的根本所在,学习经典源码中所用到的经典设计思想及常用设计模式,能够帮你了解大牛是如何写代码的,从而吸收大牛的代码功力**。在阿里面试中,MyBatis,Spring等框架的底层原理是经常会被问到的**

    2、分布式架构

    阿里巴巴有很多大团队,这种大团队里有很多小团队,到小团队之后,做的业务都不相同,如果想立足成为一线互联网公司中的万能选手,最主流的分布式架构中有很多知识都是必须要去了解与学习的。并且在阿里面试过程中,面试官会问到实际应用场景的问题:比如微服务化、用户量、并发量、业务复杂度以及可扩展程度等,这里不多赘述。本屌提供一个分布式架构的学习思路也是自己目前还在学习中的体系:

    3、微服务架构

    微服务是现在互联网架构技术中最火热的话题之一,也是本屌目前正在学习研究的方向。在阿里面试过程中,面试官很少会问到关于微服务相关的问题。但作为一名开发者,一名有技术梦想的程序员微服务架构是现在必须要去了解的主流技术,小编给自己制定了一个微服务技术的学习计划:

    4、并发编程

    并发编程几乎是所有互联网公司面试必问问题,并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。目前网上没有系统的全面的并发编程学习大纲,我搜集了很多资料总结出来一个最全面的学习大纲:

    5、性能优化

    性能一直是让程序员比较头疼的问题。当系统架构变得复杂而庞大之后,性能方面就会下降,特别是阿里巴巴这样的一线互联网公司最为注重,因此想进入阿里,性能优化一定是要去深入学习与理解的一环,本屌在性能优化这一块虽然不能算专家,也可以自信的说是精通了

    6.设计模式

    设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。

    作为后端Java过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料

    总结

    总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

    如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。

    这些视频如果需要的话,可以无偿分享给大家,点击这里即可免费领取

    自己能上手再买这些书看又是非常有收获的事了。

    这些视频如果需要的话,可以无偿分享给大家,点击这里即可免费领取

    展开全文
  • 我刚开始做Web开发的时候,根本没有前端,后端之说。 原因很简单,那个时候服务器端的代码就是一切:接受浏览器的请求,实现业务逻辑,访问数据库,用JSP生成HTML,然后发送给浏览器。 即使后来Javascript在...

      我刚开始做Web开发的时候,根本没有前端,后端之说。

           原因很简单,那个时候服务器端的代码就是一切:接受浏览器的请求,实现业务逻辑,访问数据库,用JSP生成HTML,然后发送给浏览器。

           即使后来Javascript在浏览器中添加了一些AJAX的效果,那也是锦上添花,绝对不敢造次。因为页面的HTML主要还是用所谓“套模板”的方式生成:美工生成HTML模板,程序员用JSP,Veloctiy,FreeMaker等技术把动态的内容添加上去,仅此而已。

      那个时候最流行的图是这个样子:

                                                                       

           在最初的J2EE体系中,这个表示层可不仅仅是浏览器中运行的页面,还包括Java写的桌面端,只是Java在桌面端太不争气, 没有发展起来。

           每个程序员都是所谓“全栈”工程师,不仅要搞定HTML, JavaScript, CSS,还要实现业务逻辑,编写访问数据库的代码。等到部署的时候,就把所有的代码打成一个WAR包,往Tomcat指定的目录一扔,测试一下没问题,收工回家!

      不差钱的公司会把程序部署到Weblogic,Websphere这样的应用服务器中,还会用上高大上的EJB。

      虽然看起来生活“简单”又“惬意”,但实际上也需要实现那些多变的、不讲逻辑的业务需求,苦逼的本质并没有改变。

                               

    1、前后端的分离

           随着大家对浏览器页面的视觉和交互要求越来越高,“套模板”的方式渐渐无法满足要求,这个所谓的表示层慢慢地迁移到浏览器当中去了,一大批像Angular, ReactJS之类的框架崛起,前后端分离了!

      后端的工程师只负责提供接口和数据,专注于业务逻辑的实现,前端取到数据后在浏览器中展示,各司其职。

      像Java这样的语言很适合去实现复杂的业务逻辑,尤其是一些MIS系统,行业软件如税务、电力、烟草、金融,通信等等。 所以剥离表示层,只做后端挺合适的。

      但是如果仅仅是实现业务逻辑,那后端也不会需要这么多技术了,搞定SSH/SSM就行了。

    2、后端技术

           互联网,尤其是移动互联网开始兴起以后,海量的用户呼啸而来,一个单机部署的小小War包肯定是撑不住了,必须得做分布式。

           原来的单个Tomcat得变成Tomcat的集群,前边弄个Web服务器做请求的负载均衡,不仅如此,还得考虑状态问题,session的一致性。

      (注:参见文章《小白科普:分布式和集群》)

           业务越来越复杂,我们不得不把某些业务放到一个机器(或集群)上,把另外一部分业务放到另外一个机器(或集群)上,虽然系统的计算能力,处理能力大大增强,但是这些系统之间的通信就变成了头疼的问题,消息队列(MQ),RPC框架(如Dubbo)应运而生,为了提高通信效率,各种序列化的工具(如Protobuf)也争先空后地问世。

           单个数据库也撑不住了,那就做数据库的读写分离,如果还不行,就做分库和分表,把原有的数据库垂直地切一切,或者水平地切一切, 但不管怎么切,都会让应用程序的访问非常麻烦,因为数据要跨库做Join/排序,还需要事务,为了解决这个问题,又有各种各样“数据访问中间件”的工具和产品诞生。

           为了最大程度地提高性能,缓存肯定少不了,可以在本机做缓存(如Ehcache),也可以做分布式缓存(如Redis),如何搞数据分片,数据迁移,失效转移,这又是一个超级大的主题了。

           互联网用户喜欢上传图片和文件,还得搞一个分布式的文件系统(如FastDFS),要求高可用,高可靠。

           数据量大了,搜索的需求就自然而然地浮出水面,你得弄一个支持全文索引的搜索引擎(如Elasticsearch ,Solr)出来。

           林子大了,什么鸟都有,必须得考虑安全,数据的加密/解密,签名、证书,防止SQL注入,XSS/CSRF等各种攻击。

                           

    3、“大后端”

           前面提到了这么多的系统,还都是分布式的,每次上线,运维的同学说:把这么多系统协调好,把老子都累死了。

           得把持续集成做好,能自动化地部署,自动化测试(其实前端也是如此),后来出现了一个革命化的技术docker, 能够让开发、测试、生成环境保持一致,系统原来只是在环境(如Ngnix, JVM,Tomcat,MySQL等)上部署代码,现在把代码和环境一并打包, 运维的工作一下子就简化了。

           公司自己购买服务器比较贵,维护也很麻烦,又难于弹性地增长,那就搞点虚拟的服务器吧,硬盘、内存都可以动态扩展(反正是虚拟的), 访问量大的时候多用点,没啥访问量了就释放一点,按需分配,很方便,这就是云计算的一个场景。

      随着时间的推移,各个公司和系统收集的数据越来越多,都堆成一座大山了,难道就放在那里白白地浪费硬盘空间吗?

      有人就惊奇地发现,咦,我们利用这些数据搞点事情啊, 比如把数据好好分析一下,预测一下这个用户的购买/阅读/浏览习惯,给他推荐一点东西嘛。

           可是这么多数据,用传统的方式计算好几天甚至好几个月才能出个结果,到时候黄花菜都凉了,所以也得利用分布式的技术,想办法把计算分到各个计算机去,然后再把计算结果收回来, 时势造英雄,Hadoop及其生态系统就应运而生了。

      之前听说过一个大前端的概念,把移动端和网页端都归结为“前端”,我这里造个词“大后端”,把那些用户直接接触不到的、发生在服务器端的都归结进来。想要在程序员生涯内有更高的成就的话,C/C++就是一个既可以强化思维能力,又可以打好编程基础的编程语言,要做软件开发,成为核心程序员的话,就来湫湫学习C/C++吧!你如果感觉自学C/C++语言有困难的话,C/C++编程学习,六零四,一六8和719。即使是零基础的学习者,都可以一起成长进步。

                             

    4、怎么学好后端?

           现在无论是前端还是后端,技术领域多如牛毛,都严重地细分了,所以我认为真正的全栈工程师根本不存在,因为一个人精力有限,不可能搞定这么多技术领域,太难了

      培训机构所说的“全栈”,我认为就是前后端还在拉拉扯扯,藕断丝连,没有彻底分离的时候的“全栈”工程师。

      那么问题来了, 后端这么多东西,我该怎么学?

      之前写过一篇文章叫做《上天还是入地》,说了学习的广度和深度,在这里也是相通的。

      往深度挖掘,可以成为某个技术领域的专家,如搜索方面的专家、安全方面的专家,分布式文件的专家等等,不管是哪个领域,重点都不是学会使用某个工具和框架, 而是保证你可以自己的知识和技术去搞定这个领域的顶尖问题。

      往广度发展,各个技术领域都要了解,对于某种需求,能够选取合适的软件和技术架构来实现它,把需求转化成合适的技术组件,让这些组件以合适的方式连接、部署、运行,这也需要持续地学习和不断的经验积累。

      最后,以一张漫画来结束吧!学习C/C++编程,欢迎关注微信公众号:C语言编程学习基地。

                                            

    展开全文
  • IT互联网技术是指在计算机技术的...比如Web 前端开发、Java 后端开发等等方向;金字塔越往上需求量越少,相应的供应量也少。例如算法工程师、桌面程序开发工程师等这些岗位市场需求相对会减少一些,因此供应量也会...

    IT互联网技术是指在计算机技术的基础上开发建立的一种信息技术。IT行业这些年一直很火爆, 对于IT就业岗位的选择一直也都是热门话题。

    01、IT人才供需

    一般IT行业的需求可以比喻成一个金字塔型。IT开发人员需求量大的供应量也大。比如Web 前端开发、Java 后端开发等等方向;金字塔越往上需求量越少,相应的供应量也少。例如算法工程师、桌面程序开发工程师等这些岗位市场需求相对会减少一些,因此供应量也会少一些。在这里并不是要说哪个IT岗位好,具体岗位的好坏和个人的主观感受关系有很大关联。

    一般建议先选择符合金字塔供需关系且需求稳定的岗位,等到对技术和行业有一定的认知之后,再做出下一步的抉择。

    02具体岗位及薪资分析

    一、后端开发:

    后端语言包括Java、PHP和Python等。后端的发展前景很大,无论是B/S还是C/S,无论是Web还是原生,或者是智能硬件,后端都会屹立不倒。

    后端薪资:

    0~1年:4K~8K

    1年~3年:8K~13K

    3年~5年:13K~20K

    5年以上~

    ?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0521%2F65d9f46cj00qant6n0014d000hs00bap.jpg&thumbnail=650x2147483647&quality=80&type=jpg

    二、Web前端:

    CSS工程师要考虑更多的就是兼容性。一般来说,CSS工程师并不存在,写CSS的人最好要掌握JS代码、Html5。这是前端人员必备技能。

    Web前端薪资:

    1.切图熟练、能写一些JS效果:月收入5k~1w;

    2.会切图会JS,并可以熟练用JS开发各种组件:月收入8K~1.5w;

    3.具备前两条,熟悉1~N个后端语言:月收入1.5w~3w;

    4.具备以上所有,并对前端架构、性能优化方面有深入了解:月收入平均4w,并且企业抢着要!

    三、Python开发工程师:

    需要技能:

    1.熟悉Python,掌握基本数据结构,熟悉标准数据库,认同Python设计理念;

    2. 熟悉常见的Python框架,精通Tornado,flask,django优先;

    3. 熟悉常见的数据库,熟练掌握Mysql,Mongodb,Redis者优先;

    4. 掌握Linux操作系统,理解TCP,HTTP等网络协议;

    Python开发工程师薪资:

    0年~1年:9K~10K

    1年~3年:10K~15K

    3年以上:15K~35K+

    03、根据自己情况选择岗位

    1、选择长期而言对自己成长有帮助的岗位。一定要选择一个对成长有帮助的岗位,只有自己做得好,未来发展才会好。

    2、尽量选择与自己技术对口的岗位,以便能够发挥技术特长,特别是在刚开始入行选择的时候。

    3、不要妄自菲薄,每个技术岗位基本都是万事开头难,你觉得难,其他人也一样;也不要好高骛远,脚踏实地一步一步来,坚持就是成功的一半,再回头看时,发现自己已进步很大。

    IT行业岗位的选择还是要和自己的兴趣爱好及已有技能相结合,根据具体情况制定技术闯关路线。爱尚实训刘老师希望大家都能做出正确理智的选择。

    展开全文
  • 这一章的内容并不多,不像视觉里程计那章的内容那么厚。但是我认为它是整个SLAM十四讲中最的一章,难点主要在于卡尔曼滤波器的推导涉及到一屁股的数学公式,非常的讨厌,如果不能静下心来,就很容易被吓到。但是...

    这一章的内容并不多,不像视觉里程计那章的内容那么厚。但是我认为它是整个SLAM十四讲中最难的一章,难点主要在于卡尔曼滤波器的推导涉及到一屁股的数学公式,非常的讨厌,如果不能静下心来,就很容易被吓到。但是真正看懂以后实质上它是比较简单的,并没有用到什么太过复杂的变换(不像傅里叶变换就十分的抽象,这也是我从电信科专业转到计算机专业的主要原因之一,因为我实在厌烦了与傅里叶变换打交道。),本质上这节内容掌握一些基本的数理统计和矩阵知识就可以明白含义了。如果实在不明白推导过程,我最后也总结了怎么从宏观上明白卡尔曼滤波器的作用。希望这节的内容可以帮助到大家!另外很乐意能和相关领域的研究者有交流,所以欢迎留言交流。

    另外,配一个跟推导无关的图画解释,从现实意义上讲解什么是卡尔曼滤波器:

    视觉SLAM14讲学习笔记(十五)卡尔曼滤波器的直观理解


    状态估计的概率解释:位姿x和路标y服从某种概率分布,目的是通过某些运动数据u(比如惯性测量传感器IMU输入)和观测数据z(比如拍摄到的照片像素点的值)来确定状态量x和y的分布。


    再次看一下状态方程和观测方程,第一个状态方程表明了根据上一时刻k-1的状态、传感器的读数u和噪声误差wk计算得到这一时刻k的状态,第二个观测方程实际上指的就是拍摄的图像,是根据k时刻的实际状态xk和地标y(把两者写到一起)、像素误差vk得到这一时刻的观测数据zk。

    先提前介绍两个概念的实际意义(这块一定要深刻明白,再往下读):

    先验:根据0~k-1时刻的各种数据来推测k时刻的状态

    后验:结合了k时刻观测数据的k时刻状态。

    (比如这章的卡尔曼滤波在做的事情,目的就是从k-1时刻的后验数据推测k时刻的先验数据,再用k时刻的先验数据k时刻的后验数据。)

    关于这部分内容到现在为止先有个大致了解,下面我将进行展开叙述:

    我们希望的目的,就是根据0~k时刻所有的数据,来观测当前的状态。那么这就可以写成:

                 

    下标没必要叙述大家应该都能明白。这个东西怎么来算呢?就是根据贝叶斯法则拆开。先回忆一下贝叶斯法则:

    贝叶斯等式左边的正比于贝叶斯等式右边的分子,因为分母是在求和,不会有选择和改变的余地。

    因此式子写成:

    (其实对于这个式子的推导,我个人觉得不应该直接这么写,为了方便理解应该先写一步中间过程,即左边先正比于P(X0,U1:k,Z1:k | Xk)* P(Xk),这样才符合贝叶斯公式的直接推导。然后对于第一项,显然k时刻的先验并不能决定除了Zk以外的在k时刻之前的数据,因此第一项就等于P(Zk | Xk),第二项单独一个Xk拿出来是什么?是没有Zk情况下的k时刻状态,它也就等于在前面的记录的x0,z1:k-1……发生情况下产生的数据。)

    这个式子不应该写到这里就直接继续推导了,而是应该先停一下,看看其中每部分的含义:

    1. 等式左边是我们想要知道的,根据0~k时刻所有的数据,来得到当前的状态,

    2. 等式右边第二项,是根据0~k-1时刻的观测数据,推测得知k时刻的先验状态(对于这个,里面的u作为一个传感器数据,其实可以忽略掉它,因为0~k-1时刻的数据不应该包含uk,但是本书里面着重要讲的是视觉SLAM,u应该指的是惯性逻辑单元IMU之类的数据,如果只依靠观测的图像来判断状态的话,忽略掉u就行了

    3.等式右边第一项,是“给定了一个先验Xk的情况下,什么观测数据Zk最能符合这个先验“的概率。因此这就是所谓的似然。

    4.把整个式子联合起来看,"根据0~k时刻所有的数据得到的k时刻的状态"所服从的概率分布,是正比于"根据0~k-1时刻的观测数据,推测得知k时刻的先验状态"的概率分布 与 "由k时刻产生的先验状态的基础上最符合的观测数据zk"的概率分布的乘积!

    即:后验=似然*先验。

    注意这里的先验,被表示为,它只是表示了“在有0时刻的状态和后续的观测数据”的情况下,推测k时刻的状态。我们如果想把它写的紧凑一些,弄成k-1时刻的状态和k时刻的状态的关系,那么就用如下表示:

    这个式子是怎么得出来的呢,这其实本身是一个全概率公式:

    B就是先验Xk,非要多出一项Xk-1的话,那么就把Xk-1当成是A。(注意上面的全概率公式和上面的10.6公式等式右边的两项是相反顺序的,懒得手打公式了,直接找了个公式截图,顺序刚好左右相反,但是乘积是一样的)

    那么对离散的A求和,和对连续的状态求积分是一样的。

    如果把先验的展开代回到后验=似然*先验公式里去的话,也就是很多论文里经常出现的马尔科夫链:

    这个就很清晰了,后验=似然*先验的展开,似然意味着给定状态解释当前测量的概率,先验的展开意味着系统的动态变化。个人觉得高博最开始就应该从这个公式入手,然后再逐步加入什么X0,u0:k……

     

    到这里为止,如果认为k时刻的状态只与k-1时刻有关,那就是用扩展卡尔曼滤波器(EKF)来做。如果觉得和所有状态都有关,那就是用非线性优化来做。目前主流是非线性优化。


    再放一下10.6式:

    如果是假设了马尔科夫性,即k时刻状态只与k-1时刻的状态有关,那么没用的都删掉,等式右边第一项就变成了:

    第二项变成:

    (k-1时刻的状态与之后的传感器读数uk无关)

    这第二项就变成了等式左边的形式,这说明这个先验的积分可以逐渐不断的向更早时间推移,这说明只要维护一个状态量就可以了。


    扩展卡尔曼滤波器的定义在讲述之前,先应该知道卡尔曼滤波器,这也是这章公式最多的一块,前所未有的多,但是细读并不是很难。我们这里先树立一个主线那就是:后验=似然*先验,这之前已经推导过了。之所以要把这个主线树立起来,是因为这节推导比较繁琐,防止中途忘记了自己是想干什么,以至于之后进行不下去了。在推导的过程中要牢牢抓住这个主线!

    先假设状态量都服从高斯分布,这是一个线性高斯系统:

    这时候就引入了附录A.3

    由于状态方程是,我们应该再补充一个Xk-1时刻的后验分布:

    然后按照附录A.3里的推导,用尖帽子xk表示后验,横线帽子xk表示先验,那么k时刻的先验应该是:

    这样正态分布里的第一项均值和第二项的协方差,就是k时刻的先验:

    这样我们主线里的 “后验=似然*先验” 的先验就表达出来了,即先验=

    根据主线里面,似然还不知道。这个根据观测方程:

    得到似然的高斯分布:P(Zk|Xk)=

    关于这块可能会有一个疑问:这里的协方差是一个Q,为什么不套用附录,得到协方差是CkP^k-1CkT+Q了(这里只是一个Q)?

    我个人的理解是:因为这里的Xk已经由状态方程产生了,作为一个实实在在的确定的Xk值,对应的Zk的协方差自然是0。(虽然Xk的先验均值服从于N(Xk横线帽子,Pk横线帽子),但是对于一个确定的Xk,它就是它自身,因此协方差是0。而状态方程的推导过程中,Xk的分布受Xk-1分布的影响。

    用尖帽子表示后验概率,那么主线的“后验=似然*先验”就是:

    为什么一定要抓住这个主线呢,是因为我们最终是想要比较靠谱的后验状态,而后验状态是根据似然和先验算出来的。

    高斯分布的表示形式主要是指数部分不同,把上面的式子两边的指数展开,先看看附录2.1:

    根据上面的属性,展开以后就是:

    看到这里还是先停一下,以防在公式推导里迷失掉。

    上面的xk,指的是状态xk所满足的分布,它可能是任何值,这些值暗中满足一个高斯分布;

    xk带尖帽子,指的是后验的xk满足的分布均值状态;xk带横线帽子,指的是先验的xk满足的分布的均值状态;Pk尖帽子是K时刻后验状态满足的分布的协方差,Pk横线帽子是K时刻先验状态满足的分布的协方差,Q是观测方程的噪声满足的协方差。(状态方程的噪声满足的协方差R去了哪里?被写进了Pk横线帽子里面)Ck是状态方程中zk=Ck*xk+vk

    在对这个公式里的各个参数足够了解以后,再继续往下看:

    在上面的方程里,xk是未知数,总的思路是展开上式,通过两边对于xk的一次与二次系数相等,从而确定等式左边的后验Xk(尖帽子)和等式右边的先验Xk(横线帽子)之间的关系!这就是公式进一步推导的目的。

    书上没有展开,我把它亲手推了一遍:

    (值得注意的是,这个等式中的每一项都是一个常数,对于常数来说,求它的转置与它本身是相同的,举例来说:

     这两个一次项怎么合并成的?答:就是前者求转置等于其本身,然后合并。另外还有一个问题,P,Q这种转置等于自身吗?答:是的,因为它们是协方差矩阵,根据定义是对称非负定矩阵)

    到现在为止,得到两个等式:

    这个是二次项系数的等式;

    这个是一次项系数的等式;

    先说二次项系数的:

    文中的处理方式是把左边化成单位矩阵I:

    然后定义一个中间变量K(这个K其实就是所谓的卡尔曼增益):

    从而得到:

    我们主线的目的是,建立起先验和后验的关系,因此要把这个式子移项:

    因此我们可以看出,卡尔曼增益K描述了“后验状态满足的分布的协方差”与“先验状态满足的分布的协方差”之间的关系。

    不过这里有个很蛋疼的事情:在之前K的定义中,是由后验协方差Pk尖帽子和观测方程系数Ck和观测方程噪声协方差Q表述的,也就是说K是由后验协方差Pk尖帽子定义的,上面这个式子后验协方差Pk尖帽子又是由K定义的,到底是先有鸡还是先有蛋?循环定义。关于这点,高博在注释里说,K可以不依靠后验的协方差Pk尖帽子算出(这是必定的,不然既然我知道了后验协方差还算什么卡尔曼增益?算卡尔曼增益的目的是,根据先验的协方差Pk横线帽子来计算后验协方差Pk尖帽子)

    关于这点,现在留心一下,一会下文还要再说。

    再说一次项系数的:

    这个直接看高博书里的推导吧:

    也就是说,后验的状态均值Xk尖帽子,等于先验的状态均值Xk横线帽子 加上 一个修正量。

    修正量表述为

    记得最开始的观测方程:

    zk-CkXk应该是vk,也就是像素误差,因此10.22和10.23里的实际含义就是:

    后验的位姿状态与先验的位姿状态的差异,事实上就是(“观测值”与“估计的观测值”之间的误差 )乘以一个(卡尔曼增益)!

    (这是书里没有详细写明的地方,如果上面的公式没太看明白怎么推导的,也没有关系,因为如果现在把资料都收起来,就给我一张纸和笔叫我裸推,我大概率也推不出来。我觉得等我准备找工作的时候,再准备裸推。)

    所以到这里卡尔曼滤波器就快结束了,一起再总结下:

    卡尔曼增益表达了两层性质:

    第一:后验协方差与先验协方差之间的关系,即:

    第二,后验状态均值与先验状态均值之间的关系:


    不过,之前我们还有一个历史遗留问题,那就是卡尔曼增益的定义,本身包括了后验协方差,也就是说我们实际利用卡尔曼增益K,根据先验计算后验的时候,是没法计算的,因为你想求结果需要用到K,但是K里面包含了结果。(也就是刚刚说的循环定义问题)高博给了一个不同的步骤:

    这个步骤也就是:

    1.先根据k-1时刻的后验分布的均值和协方差,算k时刻的先验状态的均值与协方差;(所谓的预测,A是状态方程系数,R是状态方程的噪声协方差,之后的C是观测方程的系数,Q是观测方程的噪声协方差)

    2.计算卡尔曼增益K(注意,这里的K定义就不再是循环定义了,它用到的是K时刻的先验协方差而不是后验协方差,因为是想计算后验协方差。问题:这里的K定义与之前的相同吗?答:相同,据高博所言,用到了SWM恒等式,其证明过程比较繁琐,在第10讲的习题1中给了参考的文献)

    注:这块我是没有自己推过的,但是有网友(博客地址墨尔本在远方)把自己推了一遍的结果私信我了(太认真了,敬佩),好像没有用到SWM恒等式,也能证明相等。

    这个推导过程我没发现有问题。

    3.利用卡尔曼增益,根据k时刻状态的先验均值和协方差,计算k时刻状态的后验均值与协方差。

    值得注意一点:卡尔曼滤波器有若干种推导方式,这里是从概率角度出发的最大后验概率估计的形式。卡尔曼滤波器构成了线性系统的最优无偏估计。


    到上面为止,卡尔曼滤波器的内容就结束了。不得不感慨数学真是博大精深,一切工科专业归根到底就是数学。

    卡尔曼滤波器针对的是线性系统,高斯分布。而这是有问题的,一个高斯分布经过非线性的变换,结果往往不再是高斯分布。

    接下来讲解扩展卡尔曼滤波器(Extended Kalman Filter,EKF),这部分内容也要抓住一个主线:

    EKF是KF的修正,原理是相同的,但是是在某个点附近,对运动方程与观测方程一阶泰勒展开,保留一阶项(线性部分),然后按照KF方式来推导。

    把偏导数记为F和H。

    还是把握KF的主线:后验=先验*似然

    这里的非线性的近似先验就满足:

    顺便放上线性的卡尔曼滤波器的比较一下:

     

    非线性的近似先验是怎么得出的?其实是:

    等式左边满足正态分布,右边也是,根据附录A.3:

    此处,相当于是y,相当于是x,相当于是Ax,相当于是b。然而的均值是0,因此也就是的均值就是,方差是

    也就是:中,均值和方差的由来。

     

    对于观测方程,也就是似然,分布满足于:

    注意这里,在状态方程的推导中,的均值是0,而在这里,的均值不是0,这个我们很早就解释过了:以Xk-1为例:

    这里的协方差为什么还是只是一个Q而不是根据附录得到的HPk-1HT+Q,我的理解还是和卡尔曼那里一样,因为是先产生先验再产生似然,先验已经产生了那就是确定的值了,不用满足某个分布。(这里可能不对,欢迎指正)

    最后得到的卡尔曼增益:

    是扩展卡尔曼滤波器那里原先的系数C这里换成了偏导数H。

    后验概率和先验概率分布的关系为:

    这个给出的是单次线性近似下的最大后验估计(MAP)


    讨论:EKF 的局限:

    1.是基于马尔科夫性的,但如果当前帧与很久前有关,滤波器难以处理。(不如非线性优化可以考虑很久前的状态)

    2.EKF是用泰勒展开一次导数的系数作为线性近似,但如果实际情况有着强烈的非线性,那就会有非线性误差。

    3.EKF slam由于视觉slam中路标数量很大,因此存储量呈平方增长。


    关于这部分我的理解是,书里仅仅是介绍概念和理论,其实看完,哪怕实际推导完一遍以后,也不是很明白该怎么用,比如怎么利用代码来实现(扩展)卡尔曼滤波器。书上的代码给的是BA的过程,也强调了slam中一般是使用非线性优化的方式。

    另外,配一个跟推导无关的图画解释,从现实意义上讲解什么是卡尔曼滤波器:

    视觉SLAM14讲学习笔记(十五)卡尔曼滤波器的直观理解

    因此我感觉这章前半部分的内容,不应该属于一个重点,但它确确实实是一个难点。我个人感觉应该从宏观上理解所谓卡尔曼增益的实际含义, 其中的具体推导应该是现用现查为好。不知道实际面试的时候会不会给白纸让推导一遍考察理论水平。关于这块我觉得我应该在找工作之前再针对性的强化一下。

    据我的总结,后端优化一共有五种思路,这里介绍了两种,分别是卡尔曼滤波器和扩展卡尔曼滤波器。另外还有三种:BA优化,Pose Graph优化 以及 因子图优化。我把它总结到了下一节笔记,欢迎查阅:SLAM14讲学习笔记(七)后端(BA与图优化,Pose Graph优化的理论与公式详解、因子图优化)

    展开全文
  • dmd后端

    2020-12-31 09:56:41
    重写代码,很.1%花费500%的时间,还要花几年去解决过去已解决的漏洞. dmd后端12万行,包括:优化器,调试符号信息,生成异常处理表,及大量目标文件格式.实际生成代码约4万行. 对现代cpu,调度器没啥用. ...
  • 归来后端

    2021-01-17 22:41:19
    经过学习方向的划分,我毅然决然的选择了后端,我很高兴能够对前端有所了解,也更高兴能够继续对后端进行深入学习,我很希望在未来的学习之路上能够专心潜入研究java,最终会一番成就。 一、关于后端 关于前端...
  • 我的同事就女孩子,而且c和java的功力不低,但是前端一塌糊涂然后老板让她负责一个java写的系统,每次被老板批评后,跑我这来问问题,我都发现因为前端不懂引起的被老板骂哭过,后来她辞职了你发现问题没有,她...
  • 只要接触过IT行业的人可能听过一个说法“前端比后端简单”,“前端简单好学,后端比前端多了”,事实真的是这样吗,前端发展真的不如后端吗?易牛云朗沃却并不这么认为。 这样的结论是初学技术,没有深入钻研技术...
  • 我是做JAVA后端的,前端也了解一些,但主流框架暂时...虽然自己清楚前端只是入门简单,学到后面会越来越,但是从长远的角度来看,Web前端真的比JAVA后端好就业吗?我很纠结要不要尝试转前端。还请各位帮忙指点迷津。
  • 我记得刚开始做开发的时候,还不流行前后端分离,那时候也没那么多的前端框架,什么 Vue、React 都还不存在,Angular 才刚刚发布第一代版本不久,但是在国内基本上还没人用。 那时候,大部分应用都还是服务端渲染,...
  • 后端框架

    2020-06-09 11:18:54
    我相信对于大部分开发人员来说,框架再熟悉不过了,但是要给未接触过的人讲明白恐怕是非常的,本节的目的就是让读者对于框架50%的认知,剩下的需要在实践中体会。 框架与PPT 假设我们把PPT当作一个框架。好了,...
  • MySQL为何不选择平衡二叉树 既然平衡二叉树解决了普通二叉树的问题,那么mysql为何不选择平衡二叉树作为... 根据这三点,可以如下大致的一个简单的结构图: 上图中数字表示的是索引的值,0x开头的表示磁盘地址,根
  • 在知乎上看到个问题:为什么 211/985 毕业的前端工程师那么难招?下面个评论很有意思:工程师A说我是211的,工程师B说我是985的,工程师C说我996的,玩笑中又带点心酸。在这内卷又压力的环境下,还是得夯实技术...
  • 不管你用什么语言,PHP、Python 还是 Java,后端都会涉及到这些东西1、计算机基础:操作系统、网络系统(协议)、数据库系统、数据结构与算法2、中间件:Nginx、MQ 等3、开发工具:Git、Docker 等4、架构方面:CAP、...
  • 后端语言

    2020-04-01 18:15:28
    后端语言是用于响应请求的语言,也是连接数据库必须的语言,它没有视图只有抽象的逻辑与内置函数, PHP除去刚刚开始学的运算符优先级,剩下的都是数据类型与内置函数, 不像java导包一样,PHP不用配置很多复杂的...
  • 前端和后端的区别?

    万次阅读 多人点赞 2019-07-30 02:36:16
    的人认为,前端很好学,后端不好学。 也的人认为,前端不好学,后端好学,归根到底还得看个人兴趣。 前端和后端做简单的叙述 后端:入门,深入更,枯燥乏味,没有太大成就感,看一堆业务逻辑代码。 ...
  • 话不多说,我主要谈一下哪些...在Java后端开发中,MVC模型还是主流。而Struts作为一个MVC框架,单从技术上来说,还是很优秀的。 但是,现在Spring实在是太强势了,越来越成为Java开发中的“一站式”工具包,...
  • 后端测试

    千次阅读 多人点赞 2018-06-14 11:01:28
    一般来说,服务端测试两种:一种是直接对WEB或者APP的服务端进行测试;另一种是对更后端的数据库、缓存系统、中间件、文件系统等进行测试。一、先来说第一种吧:直接对WEB或者APP的服务端进行测试。一般来说,这种...
  • 在上周,密集面试了若干位Java后端的候选人,工作经验在3到5年间。我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面的。 我也...
  • 不管你用什么语言,PHP、Python 还是 Java,后端都会涉及到这些东西1、计算机基础:操作系统、网络系统(协议)、数据库系统、数据结构与算法2、中间件:Nginx、MQ 等3、开发工具:Git、Docker 等4、架构方面:CAP、...
  • ``` <input type="radio" name="sex" value="m"> Male <input type="radio" name="sex" value="f"> Female ``` 从数据库取出简单, 用代码 ``` ($data['sex']);?> ...就从数据库取出数据。但是让它再根据数据库...
  • 最近我看到不少在校的同学在学java,而且,在我最近举办的一次直播活动中,也不少在校生同学来提问,java该怎么学。 对于那些已经工作的同学,哪怕才工作不久,毕竟也能从项目实践里总结和探索java的学习途径和...
  • 关于前端和后端java学习难以程度,以下是我的分享。 易程度: web前端开发 起点低。容易入门,相对于Java来说,前端对于逻辑思维的要求比较低,所以学习前端也要容易一些,所以你不用担心学不会。很多程序员都是0...
  • 最近我看到不少在校的同学在学java,而且,在我最近举办的一次直播活动中,也不少在校生同学来提问,java该怎么学。 对于那些已经工作的同学,哪怕才工作不久,毕竟也能从项目实践里总结和探索java的学习途径和...
  • java后端面试总结

    千次阅读 多人点赞 2019-01-25 15:49:36
     在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间。我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面的。  ...
  • web前端与后端有什么区别?

    千次阅读 2019-05-14 17:01:10
     一位好的Web前端开发工程师在知识体系上既要广度,又要深度,所以很多大公司即使出高薪也很招聘到理想的前端开发工程师。那么如何系统的学习企业实用的web前端技术呢,现在说的重点不在于讲解技术,而是更...
  • 前端:入门简单,先易后,能看到自己做出来的展示界面,成就感。 前端和后端两者工作的内容和负责的东西是完全的不同 展示方式 前端指的是用户可见的界面,网站前端页面也就是网页的页面开发,比如网页上的特效...
  • 近期知乎上一个普通提问,却引发前端后端热烈讨论,相信不少学习和从业后端的朋友都这个疑问,那么事实真的如此吗?学习数字IC后端该何去何从? 数字IC后端 真的不如前端设计和验证吗? 我是一名研一的学生,最近...
  • 前端和后端区别

    2020-10-13 07:54:16
    的人认为,前端很好学,后端不好学。 也的人认为,前端不好学,后端好学,归根到底还得看个人兴趣。 前端和后端做简单的叙述 后端:入门,深入更,枯燥乏味,没有太大成就感,看一堆业务逻辑代码。 前端:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,296
精华内容 42,918
关键字:

后端有那么难吗