《自然》评选改变科学的10个计算机代码项目

《自然》评选改变科学的10个计算机代码项目,第1张

从Fortran到arXiv.org,这些计算机编码和平台让生物学、气候科学和物理学等学科的发展达到了真正“日新月异”的速度。

2019年,事件视界望远镜团队让世界首次看到了黑洞的样子。不过,研究人员公布的这张发光环形物体的图像并不是传统的图片,而是经过计算获得的。利用位于美国、墨西哥、智利、西班牙和南极地区的射电望远镜所得到的数据,研究人员进行了数学转换,最终合成了这张标志性的图片。研究团队还发布了实现这一壮举所用的编程代码,并撰文记录这一发现,其他研究者也可以在此基础上进一步加以分析。

这种模式正变得越来越普遍。从天文学到动物学,在现代每一项重大科学发现的背后,都有计算机的参与。美国斯坦福大学的计算生物学家迈克尔·莱维特因“为复杂化学系统创造了多尺度模型”与另两位研究者分享了2013年诺贝尔化学奖,他指出,今天的笔记本电脑内存和时钟速度是他在1967年开始获奖工作时实验室制造的计算机的1万倍。“我们今天确实拥有相当可观的计算能力,”他说,“问题在于,我们仍然需要思考。”

如果没有能够解决研究问题的软件,以及知道如何编写并使用软件的研究人员,一台计算机无论再强大,也是毫无用处的。如今的科学研究从根本上已经与计算机软件联系在一起,后者已经渗透到研究工作的各个方面。近日,《自然》(Nature)杂志将目光投向了幕后,着眼于过去几十年来改变科学研究的关键计算机代码,并列出了其中10个关键的计算机项目。

这台CDC 3600型计算机于1963年交付给位于科罗拉多州博尔德的国家大气研究中心,研究者在Fortran编译器的帮助对其进行了编程

语言先驱:Fortran编译器(1957年)

最初的现代计算机并不容易 *** 作。当时的编程实际上是手工将电线连接成一排排电路来实现的。后来出现了机器语言和汇编语言,允许用户用代码为计算机编程,但这两种语言都需要对计算机的架构有深入的了解,使得许多科学家难以掌握。

20世纪50年代,随着符号语言的发展,特别是由约翰·巴克斯及其团队在加州圣何塞的IBM开发的“公式翻译”语言Fortran,这种情况发生了变化。利用Fortran,用户可以用人类可读的指令来编程,例如x = 3 + 5。然后由编译器将这些指令转换成快速、高效的机器代码。

不过,这一过程仍然很不容易。早期的程序员使用正冲打孔卡来输入代码,而复杂的模拟可能需要数万张打孔卡。尽管如此,新泽西州普林斯顿大学的气候学家真锅淑郎(Syukuro Manabe)还是指出,Fortran让非计算机科学家也能编程,“握清戚这是我们第一次能够自己给计算机编程”。他和同事们利用这种语言开发的气候模型是最早取得成功的模型之一。

Fortran发展至今已经到了第八个十年,它仍然广泛应用于气候建模、流体动力学、计算化学等学科,这些学科都涉及到复杂线性代数并需要强大的计算机来快速处理数字。Fortran生成的代码速度很快,而且仍然有很多程序员知道如何编写。古早的Fortran代码库仍然活跃在世界各地的实验室和超级计算机上。“以前的程序员知道他们在做什么,”美国海军研究院的应用数学家和气候模型师弗兰克·吉拉尔多说,“他们非常注重内存,因为他们拥有的内存非常少。”

信号处理器:快速傅立叶变换(1965)

当射电天文学家扫描天空时,他们捕捉到的是随时间变化的复杂信号杂音。为了理解这些无线电波的本质,他们需要看到这些信号作为频率的函数时是什么样的。一种名为“傅里叶变换”的数学过程可以帮到研究人员,但它的效率很低,对于一个大小为N的数据集需要N^2次计算。

1965年,美国数学段陵家詹姆斯·库利和约翰·杜基想出了一种加速该过程的方法。快速傅里叶变换(FFT)通过递归(一种通过重复将问题分解为同类的子问题而解决问题的编程方法)将计算傅里叶变换的问题简化为N log2(N)步。随着N的增加,速度也会提高。对于1000个点,速度提升大约是100倍;100万个点则是5万倍。

这个“发现”实际上是一个再发现,因为德国数学家高斯在1805年就对此进行了研究,但他从未发表过。而詹姆斯·库利和约翰·杜基做到了,他们开启了傅里叶变换在数字信号处理、图像分析、结构生物学等领域的应用,成为应用数学和工程领域的重大事件之一。FFT在代码中的应用已有很多次,近年一个流行的方案是FFTW,被认为是世界上最快的FFT。

保罗·亚当斯是加州劳伦斯伯克利国家实验室分子生物物理学和综合生物成像部门的主任,他回忆称,当他在1995年改进细菌蛋白质凝胶的结构时,即使使用FFT和超级计算机,也需要“很多个小时,甚至数天”的计算。“如果在没有FFT的情况下尝试做这些,我不知道在现实中应该如何做到,”他说,“那可能要花很长时间。”

分子编目:生物数据库(1965年)

数据库是当今科学研究中不可或缺的组成部分,以至于人们很容易忘记它们也是由软件驱动的。过去的几十年中,数据库资源的规模急剧膨胀,影响了许多领域,但或许没有哪个领域的变化会比生物学领域更引人注目。

蛋白质数据库Protein Data Bank拥有超过17万个分子结构的档案,包括这种细菌的“表达子”(expressome),其功能是结合RNA和蛋白质合成的过程。

今天,科学家所用的庞大基因组和蛋白质数据库源于美国物理化学家玛格丽特·戴霍夫的工作,她也是生物信息学领域的先驱。20世纪60年代初,当生物学家们致力于梳理蛋白质的氨基酸序列时,戴霍夫开始整理这些信息,以寻找不同物种之间进化关系的线索。她与三位合著者于1965年发表了《蛋白质序列和结构图谱》,描述了当时已知的65种蛋白质的序列、结构和相似性。 历史 学家布鲁诺·斯特拉瑟在2010年写道,这是第一个“与特定研究问题无关”的数据集,它将数据编码在打孔卡中,这使得扩展数据库和搜索成为可能。

其他“计算机化”的生物数据库紧随其后。蛋白质数据库Protein Data Bank于1971年投入使用,如今详细记录了超过17万个大分子结构。加州大学圣地亚哥分校的进化生物学家拉塞尔·杜利特尔在1981年创建了另一个名为Newat的蛋白质数据库。1982年,美国国立卫生研究院(NIH)与多个机构合作,成立了GenBank数据库,这是一个开放获取的DNA序列数据库。

这些数据库资源在1983年7月证明了其存在价值。当时,由伦敦帝国癌症研究基金会蛋白质生物化学家迈克尔·沃特菲尔德领导的团队,与杜利特尔的团队各自独立报道了一个特殊的人类生长因子序列与一种导致猴子出现癌症的病毒蛋白质之间的相似性。观察结果显示了一种病毒诱发肿瘤机制——通过模仿一种生长因子,病毒会诱导细胞不受控制地生长。美国国家生物技术信息中心(NCBI)前主任詹姆斯·奥斯特尔说:“这一结果让一些对计算机和统计学不感兴趣的生物学家头脑里灵光一闪:我们可以通过比较序列来了解有关癌症的一些情况。”

奥斯特尔还表示,这一发现标志着“客观生物学的到来”。除了设计实验来验证特定的假设,研究人员还可以挖掘公共数据集,寻找那些实际收集数据的人可能从未想到的联系。当不同的数据集连接在一起时,这种力量就会急剧增长。例如,NCBI的程序员在1991年通过Entrez实现了这一点;Entrez是一个可以让研究人员在DNA、蛋白质和文献之间自由检索和比对的工具。

预测领先者:大气环流模式(1969年)

在第二次世界大战结束时,计算机先驱约翰·冯·诺伊曼开始将几年前用于计算d道轨迹和武器设计的计算机转向天气预测问题。真锅淑郎解释道,在那之前,“天气预报只是经验性的”,即利用经验和直觉来预测接下来会发生什么。相比之下,冯·诺伊曼的团队“试图基于物理定律进行数值天气预测”。

新泽西州普林斯顿的美国国家海洋和大气管理局(NOAA)地球物理流体动力学实验室的建模系统部门负责人Venkatramani Balaji表示,几十年来,人们已经熟知这些方程式。但早期的气象学家无法实际解决这些问题。要做到这一点,需要输入当前的条件,计算它们在短时间内会如何变化,并不断重复。这个过程非常耗时,以至于在天气状况实际出现之前还无法完成数学运算。1922年,数学家刘易斯·弗莱·理查森花了几个月时间计算德国慕尼黑的6小时预报。根据一段 历史 记载,他的结果是“极不准确的”,包括“在任何已知的陆地条件下都不可能发生的”预测。计算机使这个问题变得很容易解决。

20世纪40年代末,冯·诺伊曼在普林斯顿高等研究院建立了天气预报团队。1955年,第二个团队——地球物理流体动力学实验室——开始进行他所谓的“无限预测”,也就是气候建模。

真锅淑郎于1958年加入气候建模团队,开始研究大气模型;他的同事柯克·布莱恩将这一模型应用在海洋研究中。1969年,他们成功将二者结合起来,创造了《自然》杂志在2006年所说的科学计算“里程碑”。

今天的模型可以将地球表面划分为一个个25公里 25公里的正方形,并将大气层划分为数十层。相比之下,真锅淑郎和布莱恩的海洋-大气联合模型划分的面积为500平方公里,将大气分为9个层次,只覆盖了地球的六分之一。尽管如此,Venkatramani Balaji表示,“这个模型做得很好”,使研究团队第一次能够通过计算机预测二氧化碳含量上升的影响。

数字运算机:BLAS(1979年)

科学计算通常涉及到使用向量和矩阵进行相对简单的数学运算,但这样的向量和矩阵实在太多了。但在20世纪70年代,还没有一套普遍认可的计算工具来执行这些运算。因此,从事科学工作的程序员会将时间花在设计高效的代码来进行基本的数学运算,而不是专注于科学问题。

加州劳伦斯利弗莫尔国家实验室的Cray-1超级计算机。在BLAS编程工具于1979年问世之前,并没有线性代数标准可供研究人员在Cray-1超级计算机等机器上工作

编程世界需要一个标准。1979年,这样的标准出现了:基本线性代数程序集(Basic Linear Algebra Subprograms,简称BLAS)。这是一个应用程序接口(API)标准,用以规范发布基础线性代数 *** 作的数值库,如矢量或矩阵乘法。该标准一直发展到1990年,为向量数学和后来矩阵数学定义了数十个基本例程。

美国田纳西大学计算机科学家、BLAS开发团队成员杰克·唐加拉表示,事实上,BLAS把矩阵和向量数学简化成了和加法和减法一样基本的计算单元。

美国德克萨斯大学奥斯汀分校的计算机科学家Robert van de Geijn指出,BLAS“可能是为科学计算定义的最重要的接口”。除了为常用函数提供标准化的名称之外,研究人员还可以确保基于BLAS的代码在任何计算机上以相同方式工作。该标准还使计算机制造商能够优化BLAS的安装启用,以实现在其硬件上的快速 *** 作。

40多年来,BLAS代表了科学计算堆栈的核心,也就是使科学软件运转的代码。美国乔治·华盛顿大学的机械和航空航天工程师洛雷娜·巴尔巴称其为“五层代码中的机械”。而杰克·唐加拉说:“它为我们的计算提供了基础结构。”

显微镜必备:NIH Image(1987年)

20世纪80年代初,程序员韦恩·拉斯班德在马里兰州贝塞斯达的美国国立卫生研究院的脑成像实验室工作。该实验室拥有一台扫描仪,可以对X光片进行数字化处理,但无法在电脑上显示或分析。为此,拉斯班德写了一个程序。

这个程序是专门为一台价值15万美元的PDP-11小型计算机设计的,这是一台安装在架子上的计算机,显然不适合个人使用。然后,在1987年,苹果公司发布了Macintosh II,这是一个更友好、更实惠的选择。拉斯班德说:“在我看来,这显然是一种更好的实验室图像分析系统。”他将软件转移到新的平台上,并重新命名,建立了一个图像分析生态系统。

NIH Image及其后续版本使研究人员能在任何计算机上查看和量化几乎任何图像。该软件系列包括ImageJ,一个拉斯班德为Windows和Linux用户编写的基于Java的版本;以及Fiji,这是ImageJ的分发版,由德国德累斯顿的马克斯普朗克分子细胞生物学和遗传学研究所的Pavel Tomancak团队开发,其中包括关键的插件。“ImageJ无疑是我们所拥有的最基础的工具,”布洛德研究所(由麻省理工学院和哈佛大学联合创立)成像平台的计算生物学家贝丝·契米妮说,“我从来没有和一个使用过显微镜,但没有使用过ImageJ或Fiji的生物学家说过话。”

拉斯班德表示,部分原因可能是这些工具是免费的。但威斯康星大学麦迪逊分校的生物医学工程师Kevin Eliceiri指出,另一个原因是用户可以很容易地根据自己的需求定制工具。自拉斯班德退休后,Kevin Eliceiri的团队一直领导着ImageJ的开发。ImageJ提供了一个看似简单、极简主义的用户界面,自20世纪90年代以来基本上没有改变。然而,由于其内置的宏记录器(允许用户通过记录鼠标点击和菜单选择的序列来保存工作流)、广泛的文件格式兼容性和灵活的插件架构,该工具具有无限的可扩展性。该团队的编程主管柯蒂斯·鲁登表示,有“数以百计的人”为ImageJ贡献了插件。这些新添加的功能极大扩展了研究人员的工具集,例如在视频中跟踪对象或自动识别细胞的功能。

Kevin Eliceiri说:“这个程序的目的不是做到一切或终结一切,而是服务于用户的目标。不像Photoshop和其他程序,ImageJ可以成为你想要的任何东西。”

序列搜索器:BLAST (1990年)

可能没有什么能比把软件名称变成动词更能说明文化的相关性了。提到搜索,你会想到谷歌;而提到遗传学,研究者会立刻想到BLAST。

通过诸如替代、删除、缺失和重排等方式,生物将进化中的改变蚀刻在分子序列中。寻找序列之间的相似性——特别是蛋白质之间的相似性——可以让研究人员发现进化关系,并深入了解基因功能。在迅速膨胀的分子信息数据库中,想要快速而准确地做到这一点并不容易。

玛格丽特·戴霍夫在1978年提供了关键的进展。她设计了一种“点接受突变”矩阵,使研究人员不仅可以根据两种蛋白质序列的相似程度,还可以根据进化距离来为评估它们的亲缘关系。

1985年,弗吉尼亚大学的威廉·皮尔森和NCBI的大卫·利普曼引入了FASTP,这是一种结合了戴霍夫矩阵和快速搜索能力的算法

数年后,利普曼与NCBI的沃伦·吉什和斯蒂芬·阿特舒尔,宾夕法尼亚州立大学的韦伯·米勒,以及亚利桑那大学的吉恩·迈尔斯一起开发了一种更强大的改进技术:BLAST(Basic Local Alignment Search Tool)。BLAST发布于1990年,将处理快速增长的数据库所需的搜索速度,与提取进化上更为遥远的匹配结果的能力结合起来。与此同时,该工具还可以计算出这些匹配发生的概率。

阿特舒尔表示,计算结果出来得非常快,“你可以输入搜索内容,喝一口咖啡,搜索就完成了。”但更重要的是,BLAST很容易使用。在一个通过邮寄更新数据库的时代,沃伦·吉什建立了一个电子邮件系统,后来又建立了一个基于网络的架构,允许用户在NCBI计算机上远程运行搜索,从而确保搜索结果始终是最新的。

哈佛大学的计算生物学家肖恩·艾迪表示,BLAST系统为当时处于萌芽阶段的基因组生物学领域提供了一个变革性的工具,即一种根据相关基因找出未知基因可能功能的方法。对于各地的测序实验室,它还提供了一个新颖的动词。“它是众多由名词变成动词的例子之一,”艾迪说,“你会说,你正准备BLAST一下你的序列。”

预印本平台:arXiv.org (1991年)

20世纪80年代末,高能物理学家经常将他们已投稿的论文手稿副本邮寄给同行,征求他们的意见——但只发给少数人。物理学家保罗·金斯帕格在2017年写道:“处于食物链较低位置的人依赖于一线研究者的成果,而非精英机构中有抱负的研究人员则往往身处特权圈以外。”

1991年,当时在新墨西哥州洛斯阿拉莫斯国家实验室工作的金斯帕格编写了一个电子邮件自动应答程序,希望建立一个公平的竞争环境。订阅者每天都会收到预印本列表,每一篇都与文章标识符相关联。只需通过一封电子邮件,世界各地的用户就可以从实验室的计算机系统中提交或检索论文,并获得新论文的列表,或按作者或标题进行搜索。

金斯帕格的计划是将论文保留三个月,并将内容限制在高能物理学界。但一位同事说服他无限期地保留这些文章。他说:“就在那一刻,它从布告栏变成了档案馆。”于是,论文开始从比各个领域如潮水般涌来。1993年,金斯伯格将这个系统迁移到互联网上,并在1998年将其命名为arXiv.org,沿用至今。

arXiv成立已近30年,拥有约180万份预印本,全部免费提供,而且每月有超过1.5万份论文提交,下载量达3000万次。十年前,《自然-光子学》(Nature Photonics)的编辑在评论arXiv创立20周年时写道:“不难看出为什么arXiv的服务会如此受欢迎,这个系统让研究人员能快速而方便地插上旗帜,显示他们所做的工作,同时避免投稿传统同行评议期刊时的麻烦和时间成本。”

arXiv网站的成功也促进了生物学、医学、 社会 学和其他学科同类预印本网站的繁荣。在如今已出版的数万份关于新冠病毒的预印本中就可以看到这种影响。“很高兴看到30年前在粒子物理学界之外被认为是异端的方法,现在被普遍认为是平淡无奇和自然而然的,”金斯伯格说,“从这个意义上说,它就像一个成功的研究项目。”

数据浏览器:IPython Notebook (2011年)

2001年,费尔南多·佩雷斯还是一位希望“寻找拖延症”的研究生,当时他决定采用Python的一个核心组件。

Python是一种解释型语言,这意味着程序是逐行执行的。程序员可以使用一种称为“读取-评估-打印循环”(read–evaluate–print loop,简称REPL)的计算调用和响应工具,在其中输入代码,然后由解释器执行代码。REPL允许快速 探索 和迭代,但佩雷斯指出,Python的REPL并不是为科学目的而构建的。例如,它不允许用户方便地预加载代码模块,也不允许打开数据可视化。因此,佩雷斯自己编写了另一个版本。

结果就是IPython的诞生,这是一个“交互式”Python解释器,由佩雷斯在2001年12月推出,共有259行代码。十年后,佩雷斯与物理学家布莱恩·格兰杰和数学家埃文·帕特森合作,将该工具迁移到web浏览器上,推出了IPython Notebook,开启了一场数据科学革命。

与其他计算型Notebook一样,IPython Notebook将代码、结果、图形和文本合并在一个文档中。但与其他类似项目不同的是,IPython Notebook是开源的,邀请了大量开发者社区的参与其中。而且它支持Python,一种很受科学家欢迎的语言。2014年,IPython演变为Jupyter,支持大约100种语言,允许用户在远程超级计算机上 探索 数据,就像在自己的笔记本电脑上一样轻松。

《自然》杂志在2018年写道:“对于数据科学家,Jupyter实际上已经成为一个标准。”当时,在GitHub代码共享平台上有250万个Jupyter Notebook;如今,这一数字已经发展到1000万个,在2016年引力波的发现,以及2019年的黑洞成像工作中,它们都发挥了重要的作用。佩雷斯说:“我们对这些项目做出了很小的贡献,这是非常值得的。”

快速学习器:AlexNet(2012年)

人工智能有两种类型。一种是使用编码规则,另一种则通过模拟大脑的神经结构来让计算机“学习”。加拿大多伦多大学的计算机科学家杰弗里•辛顿表示,几十年来,人工智能研究人员一直认为后者是“一派胡言”。但在2012年,他的研究生亚力克斯·克里泽夫斯基和伊尔亚·苏茨克维证明了事实并非如此。

在一年一度的ImageNet比赛中,研究人员被要求在一个包含100万张日常物体图像的数据库中训练人工智能,然后在一个单独图像集上测试生成的算法。辛顿表示,当时最好的算法错误分类了大约四分之一的图像。克里泽夫斯基和苏茨克维的AlexNet是一种基于神经网络的“深度学习”算法,它将错误率降低到了16%。辛顿说:“我们基本上把错误率减半了,或者说几乎减半了。”

辛顿还指出,该团队在2012年的成功反映了足够大的训练数据集与出色的编程,以及新出现的图形处理单元的强大能力的结合。图形处理单元是最初设计用来加速计算机视频性能的处理器。“突然之间,我们可以将(算法)运行速度提高30倍,”他说,“或者说,学习多达30倍的数据。”

真正的算法突破实际上发生在三年前,当时辛顿的实验室创建了一个神经网络,可以比经过几十年改进的传统人工智能更准确地识别语音。“只是稍微好一点,”辛顿说,“但这已经预示了某些东西。”

这些成功预示着深度学习在实验室研究、临床医学和其他领域的崛起。通过人工智能的深度学习,手机能够理解语音查询,图像分析工具能够很容易地在显微照片中识别出细胞;这就是为什么AlexNet会成为众多从根本上改变科学,也改变世界的工具之一。(任天)

集束搜索(又名定向搜索,Beam Search)——最佳优先搜索算法的优化。

A*搜寻算法——图形搜索算法,是最佳优先搜索的范例,从给定起点到给定终点计算出路径。

数据压缩——采取特定编码方案,使用更少的字节数(或是其他信息承载单元)对信息编码的过程,又叫来源编码。

离散微分算法(Discrete differentiation)

哈希算法(Hashing)

堆排序(Heaps)

合并排序(Merge Sort)

梯度下降(Gradient descent)——一种数学上的最优化算法。

牛顿法(Newton's method)——求非线性方程(组)零点的一种重要的迭代法。

欧几里得算法(Euclidean algorithm)——计算两个整数的最大公约数。最古老的算法之一,出现在公元前300前欧几里得的《几何原本》。

Buchberger算法——一种数学算法,可将其视为针对单变量最大公约数求解的欧碰慧几里得算法和线性系亏拆统中高斯消元法的泛化。

动态规划算法(Dynamic Programming)——展示互相覆盖的子问题和最优子架构算法。

Diffie-Hellman密钥交换算法——一种加密协议,允许双方在事先不了解对方的情况下,在不安全的通信信道中,共同建立共享密钥。该密钥以后可与一个对称密码一起,加密后续通讯。

Dijkstra算法——针对没有负值权重边的有向图,计算其中的单一起点最短算法。

二分查找(Binary Search)——在线性数组中找特定值的算法,每个步骤去掉一半不符合要求的数据。

合并查找算法(Union-find)——给定一组元素,该算法常常用来把这些元素分为多个分离的、彼此不重合的组。

期望-最大算法(Expectation-maximization algorithm,又名EM-Training)——在统计计算中,期望-最大算法在概率模型中寻找可能性最大的参数估算值,其中模型依赖于未发现的潜在变量。

快速傅里叶变换(Fast Fourier transform,FFT)——计算离散的傅里叶变换(DFT)及其反转。

最大流量算法(Maximum flow)——该算法试图从一个流量网络中找到最大的流。

LLL算法(Lenstra-Lenstra-Lovasz  lattice reduction)——以格规约(lattice)基数为输入,输出短正交向量基笑空答数。

两次筛法(Quadratic Sieve)——现代整数因子分解算法,在实践中,是目前已知第二快的此类算法(仅次于数域筛法Number Field Sieve)。

RANSAC——是“RANdom SAmple Consensus”的缩写。该算法根据一系列观察得到的数据,数据中包含异常值,估算一个数学模型的参数值。

求解线性方程组(Solving a system of linear equations)——线性方程组是数学中最古老的问题,它们有很多应用,比如在数字信号处理、线性规划中的估算和预测、数值分析中的非线性问题逼近等等。求解线性方程组,可以使用高斯—约当消去法(Gauss-Jordan elimination),或是柯列斯基分解( Cholesky decomposition)。

Q-learning学习算法——这是一种通过学习动作值函数(action-value function)完成的强化学习算法,函数采取在给定状态的给定动作,并计算出期望的效用价值,在此后遵循固定的策略。

Schönhage-Strassen算法——在数学中,Schönhage-Strassen算法是用来完成大整数的乘法的快速渐近算法。其算法复杂度为:O(N log(N) log(log(N))),该算法使用了傅里叶变换。

RSA——公钥加密算法。首个适用于以签名作为加密的算法。RSA在电商行业中仍大规模使用,大家也相信它有足够安全长度的公钥。

Strukturtensor算法——应用于模式识别领域,为所有像素找出一种计算方法,看看该像素是否处于同质区域( homogenous region),看看它是否属于边缘,还是是一个顶点。

单纯型算法(Simplex Algorithm)——在数学的优化理论中,单纯型算法是常用的技术,用来找到线性规划问题的数值解。

奇异值分解(Singular value decomposition,简称SVD)——在线性代数中,SVD是重要的实数或复数矩阵的分解方法,在信号处理和统计中有多种应用,比如计算矩阵的伪逆矩阵(以求解最小二乘法问题)、解决超定线性系统(overdetermined linear systems)、矩阵逼近、数值天气预报等等。

维特比算法(Viterbi algorithm)——寻找隐藏状态最有可能序列的动态规划算法,这种序列被称为维特比路径,其结果是一系列可以观察到的事件,特别是在隐藏的Markov模型中。

1、编程中的数学于是我马上回顾了下编程中用到的数学知识,好像少的可怜。

计数的能力:for循环中经常用, 小学生都会。

数字的加减乘除:每种编程语言都会内置支持,都不需要你自己算余数和模:偶尔会用得到集合运算:交集、并集、差集,编程中用的不多。

布尔运算: AND,OR, 非各种进制:二进制、十进制、十六进制还有哪些?我想不起来了。

当然这和我从事的编程领域有极大关系,辽宁北大青鸟http://www.kmbdqn.cn/认为如果我做的不是Web开发,而是搜索,游戏,安全,算法,人工智能等,那对数学的要求估计就开始飙升了。

其实计算机的基础是数让搜裂学,只是我们一直在应用层编程,体会不到罢了。

比如说我们日常使用的计算机,绝大部分都是所谓冯诺依曼结构,这个结构可以说是图灵机这个概念机器的具体实现,而图灵机就是一个纯数学的东西啊,没有图灵机这么伟大的抽象作为数学基础,现代的计算机是制造不出来的。

再比如说密码领域需要很多数论的知识,RSA算法就涉及到大素数的分解我们常用的Mysql,Oracle等关系数据库的底层基础是离散数学的笛卡尔乘积通信系统中很重要的一个原理就是傅里叶变换。

编译器会用到有限状态机数据的压缩会用到各种数学的算法项目管理中的进度管理,甘特图数学基础就是图论。

.....总之,数学在计算机科学扮演着非常重要的角色,是整个学科的基础。

2、不拼数学拼什么?具体到应用层编程,尤其Web开发、企业信息化开发,整天折腾的是框架和类库,用不到这么多高大上的数学知识,那到底拼的是什么?想想编程中常用的数组,如果是一维数组,做个循环和遍历,每个人都能轻松应对。

如果要用数组来表示二叉树坦闭,就需要把一个树形结构对应到线性结构,那难度立刻上升。

如果在编程中需要自己实现链表,就会发现把各个节点的链接关系维护好,需要把指针调来调去,挪来挪去,实在不是一件容易的事情。

这样的能力就是逻辑思维的一种体现。

我们在做系统设计的时候,经常需要总结、分析现实需求,找到容易变化的部分和相对稳定的部分,把他们封装起来,形成核心的概念,支撑起整个系统,这是一个抽象的过程,虽然用不到多少数学知识,但是思维的过程也极不容易。

逻辑思维能力和抽象能力的差别,能够区分出程序员的优秀和平庸。

一个优秀程序员写出的代码,接口清晰,容易扩展,易于维护 一个差程序员写出的代码,思路混乱,完全是一些计算机语句的堆砌,漏卜别人看不明白,过一段时间自己都看不明白了。

数学系的同学在这两方面恰恰是长项,想想看,数学系同学们整天折腾这么多“枯燥的”抽象概念,再去看编程这样大部分都是具体化的实现,简直是分分钟搞定!这可能是数学系的转到编程领域很厉害的原因吧。

逻辑思维能力通过学习数据结构和算法,做数据结构的习题可以得到有效的提高,抽象能力需要在实践中不断的练习、积累经验。

对于初学编程的同学,从现在就开始努力提升吧!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12527631.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存