数学和编程

042132541731719 好些人来信问我,要成为一个好的程序员,数学基础要达到什么样的程度?十八年前,当我成为大学计算机系新生的时候,也为同样的问题所困扰。面对学数学,物理等学科的同学,我感到自卑。经常有人说那些专业的知识更加精华一些,难度更高一些,那些专业的人毕业之后如果做编程工作,水平其实比计算机系毕业的还要高。直到几年前深入研究程序语言之后,对这个问题我才得到了答案和解脱。由于好多编程新手遇到同样的困扰,所以我想在这里把这个问题详细的阐述一下。 数学并不是计算机科学的基础 很多人都错误的认为,计算机科学是数学的一个分支,数学是计算机科学的基础,数学是更加博大精深的科学。这些人以为只要学会了数学,编程的事情全都不在话下,然而事实却并非如此。 事实其实是这样的:

  • 计算机科学其实根本不是数学,它只不过借用了非常少、非常基础的数学,比高中数学还要容易一点。所谓“高等数学”,在计算机科学里面基本用不上。
  • 计算机是比数学更加基础的工具,就像纸和笔一样。计算机可以用来解决数学的问题,也可以用来解决不是数学的问题,比如工程的问题,艺术的问题,经济的问题,社会的问题等等。
  • 计算机科学是完全独立的学科。学习了数学和物理,并不能代替对计算机科学的学习。你必须针对计算机科学进行学习,才有可能成为好的程序员。
  • 数学家所用的语言,比起常见的程序语言(比如C++,Java)来说,其实是非常落后而糟糕的设计。所谓“数学的美感”,其实大部分是夜郎自大。
  • 99%的数学家都写不出像样的代码。
数学是异常糟糕的语言 这并不是危言耸听。如果你深入研究过程序语言的理论,就会发现其实数学家们使用的那些符号,只不过是一种非常糟糕的程序语言。数学的理论有些是有用的,然而数学家门用于描述这些理论所用的语言,却是纷繁复杂,缺乏一致性,可组合性(composability),简单性,可用性。这也就是为什么大部分人看到数学就头痛。这不是他们不够聪明,而是数学语言的“设计”有问题。人们学习数学的时候,其实只有少部分时间在思考它的精髓,而大部分时间是在折腾它的语法。 举一个非常简单的例子。如果你说x-1表示x的-1次方(x的倒数),那么f-1表示什么?f的-1次方,f的倒数?别被数学老师们的教条和借口欺骗啦,他们总是告诉你:“你应该记住这些!” 可是你想过吗:“凭什么!” x-1表示x的-1次方,而f-1,明明是一模一样的形式,表示的却是函数f的反函数。一个是求幂,一个是反函数,风马不及,却写成一个样子。这样的语言设计混淆不堪,却喜欢以“约定俗成”作为借口。 如果你再多看一些数学书,就会发现这只是数学语言几百年累积下来的糟粕的冰山一角。数学书里尽是各种上标下标,带括号的上标下标,x,y,z,a,b,c,f,g,h,各种扭来扭去的希腊字母,希伯来字母…… 斜体,黑体,花体,双影体,……用不同的字体来表示不同的“类型”。很多符号的含义,在不同的子领域里面都不一样。有些人上一门数学课,到最后还没明白那些符号是什么意思。 很多人学习微积分都觉得困难,其实问题不在他们,而在于莱布尼兹(Leibniz)。莱布尼兹设计来描述微积分的语言(∫,dx, dy, …),从现代语言设计的角度来看,其实非常之糟糕,可以说是一塌糊涂。我不能怪莱布尼兹,他毕竟是几百年前的人了,他不知道我们现在知道的很多东西。然而古人的设计,现在还不考虑改进,反而当成教条灌输给学生,那就是不思进取了。 数学的语言不像程序语言,它的历史太久,没有经过系统的,考虑周全的,统一的设计。各种数学符号的出现,往往是历史上某个数学家有天在黑板上随手画出一些古怪的符号,说这代表什么,那代表什么,…… 然后就定下来了。很多数学家只关心自己那块狭窄的子领域,为自己的理论随便设计出一套符号,完全不管这些是否跟其它子领域的符号相冲突。这就是为什么不同的数学子领域里写出同样的符号,却可以表示完全不同的涵义。在这种意义上,数学的语言跟Perl(一种非常糟糕的程序语言)有些类似。Perl把各种人需要的各种功能,不加选择地加进了语言里面,造成语言繁复不堪,甚至连Perl的创造者自己都不能理解它所有的功能。 数学的证明,使用的其实也是极其不严格的语言——古怪的符号,加上含糊不清,容易误解的人类语言。如果你知道什么是 Curry-Howard Correspondence 就会明白,其实每一个数学证明都不过是一段代码。同样的定理,可以有许多不同版本的证明(代码)。这些证明有的简短优雅,有的却冗长繁复,像面条一样绕来绕去,没法看懂。你经常在数学证明里面看到“未定义的变量”,证明的逻辑也包含着各种隐含知识,思维跳跃,非常难以理解。很多数学证明,从程序的观点来看,连编译都不会通过,就别提运行了。 数学家们往往不在乎证明的优雅性。他们认为只要能证明出定理,你管我的证明简不简单,容不容易看懂呢。你越是看不懂,就越是觉得我高深莫测!这种思潮到了编程的时候就显出弊端了。数学家写代码,往往忽视代码的优雅性,简单性,模块化,可读性,性能,数据结构等重要因素,认为代码只要能算出结果就行。他们把代码当成跟证明一样,一次性的东西,所以他们的代码往往不能满足实际工程的严格要求。 编程是一门艺术 从上面你也许已经明白了,普通程序员使用的编程语言,就算是C++这样毛病众多的语言,其实也已经比数学家使用的语言高明很多。计算机科学并不是数学的一个分支,它在很大程度上是优于数学,高于数学的。有些数学的基本理论可以被计算机科学所用,然而计算机科学并不是数学的一部分。数学在语言方面带有太多的历史遗留糟粕,它其实是泥菩萨过河,自身难保,它根本解决不了编程中遇到的实际问题。 编程真的是一门艺术,因为它符合艺术的各种特征。艺术可以利用科学提供的工具,然而它却不是科学的一部分,它的地位也并不低于科学。和所有的艺术一样,编程能解决科学没法解决的问题,满足人们新的需求,开拓新的世界。所以亲爱的程序员们,别再为自己不懂很多数学而烦恼了。数学并不能帮助你写出好的程序,然而能写出好程序的人,却能更好的理解数学。我建议你们先学编程,再去看数学。]]>

回归分析(regression analysis)

回归分析(英语Regression Analysis)是一种统计学上分析数据的方法,目的在于了解两个或多个变数间是否相关、相关方向与强度,并建立数学模型以便观察特定变数来预测研究者感兴趣的变数。更具体的来说,回归分析可以帮助人们了解在只有一个自变量变化时因变量的变化量。一般来说,通过回归分析我们可以由给出的自变量估计因变量的条件期望。 回归分析是建立因变数(或称依变数,反应变数)与自变数(或称独变数,解释变数)之间关系的模型。简单线性回归使用一个自变量复回归使用超过一个自变量()。 回归分析的类型 简单线性回归(英语:simple linear regression) 复回归分析(英语:multiple regression analysis) 是简单线性回归的一种延伸应用,用以了解一个依变项与两组以上自变项的函数关系。 对数线性回归(英语:Log-linear model) 是将解释变项(实验设计中的自变项)和反应变项(实验设计中的依变项)都取对数值之后再进行线性回归,所以依据解释变项的数量,可能是对数简单线性回归,也可能是对数复回归。 非线性回归 逻辑回归(英语:Logistic Regression) 偏回归(英语:Partial Regression) 自回归 自回归滑动平均模型 差分自回归滑动平均模型 向量自回归模型]]>

GNU Octave:专访约翰·W·伊顿和霍尔迪·古铁雷斯

这真是我们为您提供的本星期一个伟大的访谈!GNU Octave的开发人员John W. Eaton和Jordi Gutiérrez(OctConf于2012年加拿大蒙特利尔(幻灯片和报告)的主要开发者和组织者之一),他们从其繁忙的日程中,花时间与我们的读者 分享令人尊敬的GNU Octave背后的故事,以及这个非常活跃的项目的细节,希望有个愉快的阅读!

作者: edwood

– 2012年9月26日 发表

译者注:F4S即Floss For Science网站

F4S:你们好, 请给我们简要介绍介绍一下你们自己吧。

[John]我的GNU Octave的原作者,并从一开始就一直是维护者,起始于1992年。 当我刚开始投入Octave时,我是德克萨斯州大学的博士后研究员和系统管理员。然后从1995年到2008年,我在威斯康辛大学做研究员,但从1992年到2008年我大部分的时间花在Octave。现在我有属于我自己的软件公司,专注于支持Octave。

[Jordi]我称自己是一个数学家,程序员,以及唐吉诃德式的黑客游侠。我有一个学士学位,和半个数学学位,我开始攻读数学学位后半部分的时候开始使用Octave。一段时间后,我投入到推动Octave的开发,现在我正努力地让它更好为大家所使用。我现在的老板是在医疗成像处理业务,而他们最初聘请我要帮助他们把Octave集成到他们的流水线。

F4S:什么是GNU的Octave?

[Jordi] Octave是一个免费的数字环境,与Matlab大部分地兼容。这样做是为了解放那些为matlab 编写的代码,并使尽可能少地修改就可以在Octave上运行,最好是没有任何修改。这是一个非常困难的任务,因为Matlab是一个变动的语言,它的语言 不断变化。我们总是会落后于Matlab的变化,至少有一些方面。在少数情况下,我们领先Matlab之前实现了一个功能,但随后Matlab实现它的方 式与我们略有不同,这使得在语言级别上很难创新太多,所以我们是相当保守的。

对于开发包,类似于Matlab的toolbox,我们有Octave-Forge,它具有更宽松的标准。目前,我们正在努力使这两个项目在一起,因为两者之间有一些组织的困难。

F4S:为什么GNU Octave会诞生,又是什么时候呢?

[John]Octave原本打算作为配套软件,应用于威斯康星大学麦迪逊分校的詹姆斯·B·罗林斯和德克萨斯大学的John G. Ekerdt所写的化学反应设计方面的本科教科书。我记得,我们在1988年或者是1989年的夏天开始谈论为教科书编写软件, 但我并没有开始工作,直到在1992年初我完成博士论文。

最初,我们计划写一些Fortran的子程序,并按照惯例与教材配套分发。但在为教科书编写代码之前,我们也开始确信一个 Fortran子程序库是不会成功的,一部分原因是看到本科学生被计算机事务所缠足,我们发现,他们花费太多时间试图使一个Fortran程序编译运行, 没有足够的时间去了解该计算的目标是要说明的观点。

很显然,我们需要让它更容易执行,以解决(化学)反应工程问题所需的计算,但我们也坚信我们不应该使软件过于简单化。例如,我们很快否决了创建一些 图形化的软件,这些软件不会让学生使用多个不同的参数,而我们曾当时其他教科书的配套软件看到这种做法。我们肯定,学生有一定了解的编程概念是至关重要 的,而不仅仅是数据录入。我们还认为,对于学生能够检查计算的所有部分,看看如何计算过程是真正地在幕后工作,这是有必要的。最后一点,希望软件能够被分 发,并用于教学或者非教学,促使我们把Octave制作成了自由软件。

最终,我们决定编写一个小的语言,定于数值计算,以演示化学反应的设计。由于越来越多的同事都开始用Matlab作为其主要计算工具,我们选择尽量兼容Matlab的语法,让我们的同事可以使用Octave,而无需学习一种全新的语言。

最初的目标不是创建一个完全兼容Matlab的系统,并且Octave先后引进了一批在Matlab中不存在的功能。然而,自从 Octave首次发布,Octave用户明确而且越来越强烈地要求与Matlab保持更兼容。现在,Octave社区更愿意去掉与Matlab的差异,而不是试图纠正Matlab的任何理解上的功能缺陷,使得现有的Matlab代码越来越大的体积(其中很大一部分也是开源软件)进入社区。理想情况下,它应该是微不足道的使用Octave来运行的Matlab编写的代码。

F4S:该项目的开发使用的是什么语言和平台?

[Jordi]大多数是C + +和Octave自己的脚本语言,以及少许Fortran在一起。事实上,Octave开始是作为一个Fortran库的打包,它的确做到这一点。截至今 天,它的大约60万行C + +中,大约10万行的m文件(Octave自己编写的语言),和大约50,000行的Fortran。

F4S:请问GNU Octave有赞助商?

[Jordi]自由软件基金会曾捐款处理我们。在过去,曾有其他赞助商,但我们现在没有任何赞助商了。

F4S:赞助商如何支持该项目呢? [John]到目前为止,我们已经使用过自由软件基金会的资金,以帮助支付参加在蒙特利尔2012年7月举行的Octave开发者会议的旅行费。那次会议是相当富有成效,把许多最活跃的贡献者在一起,对项目有一定帮助。

我的导师在得克萨斯州大学和威斯康星大学,吉姆·罗林斯,确保大部分资金通过政府和工业研究补助金的组合来支付我在Octave的初始工作。自从离开威斯康星大学,我一直在做合同工作,支持我的项目工作。

随着越来越多的赞助商,我们也许能够支付一些开发者全职投入Octave。目前,在Octave报酬的工作是由个别开发者的合同进行,而不是通过Octave项目本身。

F4S:你估计GNU Octave有多少用户?

[Jordi]根据下载量,并从Ubuntu和Debian的受欢迎程度的排名报告,我估计从10,000到100,000个用户,也许笼统的数量级说明更好一些。

[John]我觉得有几十万下载Octave3.2.4为Windows。我不认为source-forge上面的当前用户是正确的。无论如何,我认为100,000可能是低的,但我真的不确定具体数字是多少。

F4S:你知道GNU Octave被用于什么领域?

[Jordi]我们有来自学术界和工业界用户的组合。正如我前面所说,我自己的工作场所也使用Octave。我们经常问这个问题,而这些都是我们得到的回应:

Who Uses Octave?

F4S:就这个项目有多少队员? [Jordi]目前有13人拥有主代码库的写权限,而且我们一共有296贡献者。此外,我们的姊妹项目Octave-Forge具有49用户具有写权限,其中去年38个用户承诺继续投入。

F4S:人们如何能参与到这个项目? [Jordi]我们有一个常见问题是:

How can I get involved in Octave development?

F4S:在路线图都有什么功能? [Jordi]有两个非常令人振奋的发展:本机GUI和JIT编译。图形用户界面已经采取用了很长的时间来开发,主要是因为核心Octave开发商从来没有真正认为这是必要的。我们最后倾听用户,了解到他们一直要求GUI界面,所以实现了这个功能。JIT编译是一项功能,将大大加快非向量化代码。

F4S:你们可以推荐哪些项目,博客或与开放科学源码软件的网站? [Jordi]我知道的不多,但我真的很喜欢这个博客上关于现在怎么做科学,以及它是如何做的:

http://marciovm.com/i-want-a-github-of-science/

这是有点不切实际,但我是一个梦想家。

F4S:为什么你认为在你的领域,开源软件是重要的? [Jordi]对于科学,能够“复现” 是绝对必要的。一个人多久才能发表的文章中,提到的软件,是从来没有见过,而只能给出粗略的算法用于查找结果? 我希望科学家对待的源代码与他们对待出版物和文章同样的尊重:因为他们的科学活动需要细心工作。

F4S:人们可以在那里与您联系并了解更多关于GNU Octave?

[Jordi] http://octave.org , http://planet.octave.org/ , http://identi.ca/octave ,我认为人们热衷于facebook和Twitter。我们开始将更多接触社交网络,因此一些刚刚开始。

F4S:非常感谢John和Jordi与我们分享更多关于你和GNU Octave。

译者注:原文链接

http://www.floss4science.com/gnu-octave-an-interview-with-john-w-eaton-and-jordi-gutierrez/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+FlossForScience+%28FLOSS+for+Science%29

]]>