导读:程序员应该怎么学数学?
下载APP
关闭
渠道合作
推荐作者
导读:程序员应该怎么学数学?
2018-12-07 黄申 来自北京
《程序员的数学基础课》
课程介绍
讲述:黄申
时长12:56大小11.81M
你好,我是黄申。
在开篇,我详细讲了程序员为什么需要学数学。那么,怎样的学习方法才是行之有效的呢?我想你现在心里还没有一个固定的答案,而我不想一味地去讲我自己的一家之言,毕竟没有什么学习方法是最好的。
你能做的是要多看,去找适合自己的。而我能做的,就是尽量给你更多的参考,让你可以自己来选择。所以,我邀请了几位朋友,让他们来谈一谈,自己学习数学的一些心得体会,希望对你有所启发。
刘超 | 《趣谈网络协议》专栏作者:“学数学就像学一门新技术”
程序员是否需要学好数学?原本学数学分析、概率论、线性代数的时候,我也没想到数学和写程序有啥关系,但是随着研究的开源软件越来越多,我发现很多技术深入下去,本质就是数学。
程序员应该怎么学习数学呢?我不建议你将大学的数学书拿出来啃一遍,一来耗费大量时间,二来和实际应用结合不起来,往往该看的忽略了,不该看的费了半天劲用不上,过一阵又忘了。
我们了解一个新技术有三个阶段,第一阶段是,怎么使用;第二阶段是,如何实现,原理是什么;第三阶段是,为什么这样实现。学数学和学一门新技术一样,也有这样三个阶段,先用起来,了解原理,然后了解为什么。
用一句话来说,我们不能为了数学而学数学,学数学要和具体的应用结合在一起。
徐文浩 | bothub.ai 创始人:“先广度,再深度”
随着过去几年深度学习成为程序员界的显学,不少程序员开始回头复习微积分、概率论和线性代数这样的基础数学课,乃至开始学习最优化、博弈论这样的应用数学课。我自己则是因为从 2010 年一头扎入了计算广告的大坑之后,重新开始学习数学。
可以说,这次重新学习数学,为我自己推开了程序世界中另一扇门,使得我在埋头具体写代码之外,有机会重新从另一个角度,去认识和理解“程序”和“问题的解决方案”这两件事情。
我为什么要学点数学?
投入时间学习数学,于我来说主要是两个原因,一来,数学在工作中用得上;二来,学点数学很多时候是个有趣的事。
譬如说,过去几年火起来的深度学习,以及之前没那么火,但是实际上早早就在搜索、广告这些领域,应用的机器学习和推荐算法。这里面其实就是结合了微积分、线性代数、概率论之后的最优化问题。
事实上,大部分应用领域的核心解决方案,都是把应用领域的问题,形式化为一个个数学问题。在找到数学问题的“解法”之后,用写程序的方式翻译成实际应用的“算法”。而能够应用“数学”的方式来解决问题,是从一个只能套用现成方案的“码农”,向能够将新问题形式化、并找出创新解决方案的“研发工程师”迈出的第一步。
很多问题当你知道如何用数学来解决的时候,常常会有醍醐灌顶的感觉。譬如当我第一次搞明白,广告中的竞价问题,居然能够变成一个博弈论中“寻找上策均衡”的问题,并且能够通过简简单单的公式表示出来的时候,我是很有满足感的。
此外,一旦熟悉了机器学习中用到的数学知识,很多想要解决的系统问题,都能通过定义更好的数学优化目标,变成一个能够找到最优解的程序算法,最后通过写个程序,翻译成数学问题来解决,这个过程带给我巨大的身心愉悦。
我是如何学数学的?
数学整个领域很大,如果想要学点什么,我建议从工作相关的领域开始,先广度,再深度。
从工作相关的领域开始,是让自己一是能有实际用得上学到的知识的机会,二是日常工作中容易耳濡目染,相当于常常在复习。而先有广度,是让自己在心中有一个问题到解决方法的“地图”,遇到具体的问题能够对得上,容易获得正反馈;然后再有深度,具体去对一个特定的主题学习应用。
当开始深入学一个特定问题的时候,最好的方式是,追一门在线课程,譬如 Coursera、TEDx,或者在极客时间上找一门课程来学习。
这是因为,在线课程有明确的节奏,通常还会提供作业和测验。通过作业和测验,让自己对自己的学习有一个联系和反馈的过程。即使实践中没有足够的应用,过一段时间有些知识没有那么熟悉了,但是也容易建立自己很快可以“捡”回来的信心,降低“复习”的启动成本。跟随在线课程的节奏,可以有效避免“三天打渔两天晒网”的恶习,让学习有始有终。
最后,给你介绍一个有程序员特色的学习方法,针对学习的内容写一点程序。把正在学习的问题的解法,写一个算法实现出来。这是一个非常有效的练习方式。譬如学习线性代数,理解仿射,反复读书的效率对我来说,就不如找来 Coding The Matrix,通过写程序,让学习、理解变得更深入。
王天一 | 《人工智能基础课》《机器学习 40 讲》专栏作者:“数学是工具而非问题,是手段而非目的”
在数学的学习中,首要的问题是明确需求。作为非数学专业出身的“外行”,我们使用数学的目的不是顶天,而是立地;不是上下求索艰深的理论问题,而是将生活中的具体问题抽象化,进而加以解决。
因此,对于我们这些票友来说,学习数学的基础在于经验而非哲学,比较实际的思路是秉持功利主义的原则,用多少学多少。掌握基本的线性代数与矩阵论、概率论与数理统计知识足以应付日常的使用,盲目地好高骛远通常有害无益。理论化和公理化这些比较深邃的尝试固然让人着迷,但它们可能并没有肉眼可见的实用性,对于绝大部分计算机从业者恐怕过于阳春白雪。
其次,在学习时还要理解数学的本质。数学是工具而非问题,是手段而非目的。探索世界奥秘的学科是“格物穷理”的物理学,相形之下,数学更像是个任人打扮的小姑娘,它存在的意义就是通过合理的设计简化物理学的研究。
正因如此,在数学中存在着各种各样在现实中不可能出现的理想化模型(比如无穷小和极限的诞生),也存在着对同一个物理过程不同的建模方式(比如矩阵力学和波动力学)。充分理解数学的人造特质,可以在学习中少走很多无谓的弯路。
理解数学的工具属性就会自然而然地引出了数学学习中的另一个关键点,那就是工具设计的出发点,也就是所谓的数学思想与数学逻辑。
任何一个工具都不是平白无故地设计出来的,它必然要解决某个特定的问题,比如线性代数与矩阵论是对具体对象的抽象表示与运算,比如概率论和数理统计是对不确定性及其定型定量表示的建模。因此,在掌握每一种数学工具的微观技巧之前,理解它们的宏观目标是更加重要的。只有掌握了工具诞生的背景与目的,才有可能有效地使用它们。
在这里还要多说一句,数学绝不仅仅是算术,把主要精力放在计算上未免因小失大。在经典科幻《银河系漫游指南》中,超级计算机告诉人们,世界的终极答案是“42”——这更像是对数字主义者善意嘲讽的一个梗。但对算术的过度强调并不鲜见,在相当数量的现行数学教材中,讲解线性代数时开篇便给出行列式的计算方法,这种编排着实让人费解。
具体到数学每个子学科的学习方法上,相关的经验教训已然汗牛充栋,很多内容都无需在此赘言。但在我看来,学习时值得突出强调的一点是举一反三的能力。同一种工具及其背后的思想可以出现在不同的场景下,解决不同的问题,但是一旦深入到本质层面,就会发现它们实际上是相通的。如何透过现象看本质,将不同场景融会贯通,才是值得锻炼的高级能力。
同一个工具存在不同应用的例子不胜枚举:
特征向量计算的是系统的不动点,在数据降维中有举足轻重的作用,但如果熟悉电子通信的话你就会知道,对线性时不变系统的分析(也就是各种变换)都是基于特征向量展开的;
在给定隐马尔可夫模型的观测序列时,可以利用维特比算法求解后验概率最大的状态序列,将这一方法应用在信道编码中,就是最经典的卷积码译码算法;
在分类问题中,以类间方差最大化为标准可以推导出线性判别分析和决策树等模型,应用在图像处理中,类间方差最大化原理给出的就是图像分割中的 Otsu 方法。
凡此种种都说明,即使是不同的学科,使用的数学基础也有着千丝万缕的联系,将基本的数学概念和充分的想象力结合起来,触类旁通就变得轻而易举。
总结起来,我对数学学习的几点拙见是:把握数学的工具属性,学习具体方法时先溯因再求果,勤于思考解决相同问题的不同方法,与解决不同问题的相同方法之间的联系与区别。希望这几条建议能够在数学的学习中助你一臂之力。
好了,三位老师都分享完了自己的学习方法。其实他们有一个共同的观点,那就是数学要是“实用”的,这和我的想法如出一辙。
因此,我在这里绘制了一张“程序员的数学应用地图”,里面包含四个部分,分别是数据结构、编程语句、基础算法,以及机器学习算法。
(长按保存后可查看大图)
我们来一起看看这张图里都有什么内容。
首先我们来看最常用的数据结构和编程语句,我想你对它们应该非常熟悉。在我眼里,这些基础的内容,同样富含了数学思维。例如,数组和链表就体现了迭代和递归的思想,判断语句就是使用了逻辑(布尔)代数。
对于架构在这些数据结构和编程语句之上的算法(为了将这些算法和机器学习的算法区分,我称其为通用算法),除了迭代和递归,也体现了排列、组合和动态规划等思想。
对于机器学习的算法而言,我们更需要理解概率统计和线性代数的核心思想,包括什么是概率、贝叶斯定理、数据的统计分布、向量、矩阵、线性方程等等。
整个专栏我基本上都是从数学的角度出发,逐步推进到这些知识在计算机中的应用。不过在绘制这张应用地图的时候,我特意反其道而行之,从计算机编程的角度出发,为你展示程序员应该如何看待编程中的数学知识。
我觉得在开始学习之前,这个地图会给你一个大体的认识,告诉你计算机领域常用的数学思想有哪些。这时,你也许会产生一些疑惑,同时你可以带着自己的思考和问题去逐篇学习。等你学完整个专栏之后,再回头来看看这个地图,应该会有更深的感触。我希望这种双向打通,能够进一步加强你的学习体验。
好了,听了这么多心得和方法,有没有什么地方是最触动你的呢?下一节我们就要进入正式的学习了,我想听你讲讲,你准备怎么来学习这门课呢?
欢迎留言和我分享,也欢迎点击“请朋友读”,把今天的内容分享给你的朋友,和他一起精进。
分享给需要的人,Ta购买本课程,你将得20元
生成海报并分享
赞 116
提建议
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
上一篇
开篇词 | 作为程序员,为什么你应该学好数学?
下一篇
01 | 二进制:不了解计算机的源头,你学什么编程
精选留言(212)
- 蔡雪钧置顶2018-12-10图是用什么工具画的
编辑回复: iPad Paper
共 3 条评论61 - shuifa2018-12-07我学数学是为了防止老年痴呆,老师不要笑话我,😂共 9 条评论266
- Jerry银银2018-12-07死磕:这是一种精神 实践:有目的的使用,刻意练习 反思:举一反三,串联知识展开89
- 帅迪2018-12-09因为工作中使用SQL最多,在用SQL完成了相当多的工作后,每天看到类似的工作感到烦闷无聊,明知道自己动动脑,动动手,使用经验就能完成,但就是提不起热情来。 直到最近看了一本关于SQL进阶的书,在讲解完实用内容之后,最后压轴的内容就是讲SQL的数学基础——集合论和逻辑学。让我感到数据库相关的工作乐趣无穷,重新燃起了对编程的热情。书中的后记印象深刻: “这个世界没有一天是无聊的,只不过是你懒惰已久的感官无法发现眼前事物的乐趣而已”。 总之,我会用专栏中的数学思维重新审视日常工作,并记录所感。展开
作者回复: 非常好的感想,希望本专栏给你带来更多的触动
共 7 条评论57 - 开心2018-12-07打卡 数学之美 我的方法是在讲完一种算法然后用python去实现,然后应用54
- Mr.J2018-12-07当初大学的时候,总给自己找各种借口不学数学,说什么用不到,因为还没对编程有一个全的认识,后来随着开发时间的边长,越来越觉得数学都多么的重要,当初大学那么好的机会学各种高等数学,都白白浪费了,现在看到这个课,毫不犹豫,连别人的优惠码都没找,直接就订阅了!
作者回复: 感谢你的支持!相信这个专栏对你会有启发
共 2 条评论46 - someday2018-12-07因为数学差,所以要跟数学干到底共 2 条评论27
- Neo_Zhang2018-12-12大学中唯一对数学用到编程中的三件事就是:1,在竞赛中用微积分把一段冗长的代码化简为一个很简单的递归程序;2,在数学建模竞赛上用概率论公式求数据拟合度;3,用线性代数中的矩阵变换求图形学中会用到的世界、窗口坐标系。 关于这门专栏的学习,我是抱着抛弃曾经脑海中残留的幻觉影像,重新开始一步一步的学习体会,不管是问题还是心得体会都会通过留言的方式发布出来,到时有不妥的地方还望老师指点一二!展开22
- 北天魔狼2018-12-07数学是手段,不是目的。我学数学就是为了更好理解算法。20
- 广洲2019-02-17我是为了从零开始,转行成功。祝福我吧共 2 条评论15
- 南山2018-12-07打卡共 1 条评论10
- 战斗力只有2的渣2018-12-10考研复习的时候,静下心来自己习读大学数学课本,才发现除了微积分以外,线性代数和概率论与数理统计其实真的很好玩,无奈课本本身编排的很无聊,之后就一直想寻找能把数学讲的好玩的课程。看了几位老师的分享,深以为然!对老师充满期待!9
- 单车2018-12-11老师,想请教一下您! 因为大学时候非常懈怠,以至于高数、线代、概率论等数学课程基本没有去学,很多都挂科了,所以想知道这样的基础学您的课程没问题吗(高中数字学的其实很不错,但是这会儿也忘的差不多了)? 还有,学完您的课程,以后做算法、机器学习之类的是不是相当于有了一个数学基础,不用再去补这方面的空缺,学会运用就行,还有,需要去补补以前落下的高数、线代之类的吗?需不需要同时学一些别的数学课程或者书籍来巩固和加强自己的学习成果!展开
作者回复: 你好,我是从基础开始,逐步深入的,你应该跟得上。比较难的部分我尽量讲得浅显易懂,让你可以入门,之后你再去看更多相关的资料就会更轻松
8 - 西北偏北2018-12-25总结来看,还是要从应用出发。不能想着系统体系的去学大学当中的数学书。你没这个时间,并且太偏理论,离实际应用远,你会边学边忘,映像不深。带着问题,去看一些视频课程,实战,揣摩。知道这个诞生的背景,和目的。这是学所有知识最好,最快的方式。共 1 条评论7
- escray2019-05-14我是在专栏结束之后才再一次开始学习的,我注意到,刚开始的时候,放出来的精选留言比较多,后来就越来越少了——比较合理的推测是,不少同学都逐渐掉队了。我之前也追过专栏的更新,不过很快就放弃掉了。 那么对我来说,首先要争取能够把整个专栏完整的过一遍,建立一个基本的框架。 在这个基础上,争取每篇都能写留言,或者是自己的想法,或者是回答课后问题。 既然是一个与编码有关的数学专栏,如果能够做到学完每篇文章之后,留下一点代码,就更好了。不论是照抄文中的示例代码,还是从网络上找到的相关示例代码,当然最好的是自己手写的代码。 如果能够顺利完成这个专栏,那么接下来会去学习算法专栏,也算是提前做一点准备。展开
作者回复: 感谢你的留言,让我也产生了一些感触,相信这个专栏会对你有所帮助!
4 - Faraway2018-12-11大学狗听着有些名词好陌生哈哈4
- upup2018-12-08渣渣学校应用数学专业,说实话学了四年数学并不知道如何应用。4
- Noah2018-12-07在学习之前先把知识地图在脑中勾勒起来,发着金光,逐项学习时尽量把知识点通过编程实现以加深印象,举一反三,思考这个知识点还可以用在什么地方,举个例子,及时复习,书读百遍,先从认真学完一遍做起。4
- 罗耀龙@坐忘2020-03-21老师好。 这里有两点思想对于我来说很有价值。 1、数学的工具,是拿来用的。 想想在大学学习高数,线性代数那么痛苦,却不知道怎么用,现在早忘光光了。 冯诺依曼早就想通玩理论数学是没有前途的,哥德尔不完备性定理就是天花板。我没大神的资质,有一把锤子,我就先用起来吧。 2、基于上面的思想,“先广度,再深度”对于我(纯小白)来说,也许是可行策略。 先掌握“怎么使用”吧,想想,面对一个新家电,不是先琢磨底层原理,而是先看看它的使用说明书,先学会用再说。展开3
- 陈小虎2018-12-07原来不只是我觉得联系数学不到实际学着很无聊:)3