C++,python,热爱算法和机器学习
全部博文(1214)
分类:
2011-04-14 22:41:57
文章来源:http://www.matrix67.com/blog/archives/4294
This is My Life | 2011-04-14 13:47| 44 Comments | 本文内容遵从CC版权协议 转载请注明出自matrix67.com
注:这篇文章里有很多个人观点,带有极强的主观色彩。其中一些思想不见得是正确的,有一些话也是我没有资格说的。我只是想和大家分享一下自己的一些想法。大家记得保留自己的见解。也请大家转载时保留这段话。
我不是一个数学家。我甚至连数学专业的人都不是。我是一个纯粹打酱油的数学爱好者,只是比一般的爱好者更加执着,更加疯狂罢了。初中、高中一路保送,大学不在数学专业,这让我可以不以考试为目的地学习自己感兴趣的数学知识,让我对数学有如此浓厚的兴趣。从 05 年建立这个 Blog 以来,每看到一个惊人的结论或者美妙的证明,我再忙都会花时间把它记录下来,生怕自己忘掉。不过,我深知,这些令人拍案叫绝的雕虫小技其实根本谈不上数学之美,数学真正博大精深的思想我恐怕还不曾有半点体会。
我多次跟人说起,我的人生理想就是,希望有一天能学完数学中的各个分支,然后站在一个至高点,俯瞰整个数学领域,真正体会到数学之美。但是,想要实现这一点是很困难的。最大的困难就是缺少一个学习数学的途径。看课本?这就是我今天想说的——课本极其不靠谱。
这个我深有体会。最近两年,我一直在做初中数学培训,有了一些自己的看法。数学教育大致分成三个阶段,看山是山看水是水,看山不是山看水不是水,看山是山看水是水。
最早数学教育就是,教你几个定理,告诉你它们是怎么证的,再让你证明一些新的定理。
后来的要求就变了:光学数学不够,还要用数学。数学教育已经上升了一个层次:大家要把数学用到生活中去,解释生活中的现象。一时间,课本也好,中考题也好,全是与生活实际紧密联系的数学应用题,仿佛放眼望去身边真的处处都是数学一样。商场卖货,书店卖书,农民耕地,工人铺砖,再一次涌现在了课本、教辅书和考试题里。其实,数学可以解释生活,只是我们并不会这样去做。生活的变量太多,再强大的数学模型也不可能考虑到一切。对于平常人来说,真正能用到数学的地方,也就只有算算帐了。
总有一天,数学教育会拔高到第三层:返朴归真,数学真正牛 B 的还是它本身。你会发现,那些伟大的数学思想,那些全新的数学理论,最初研究的动机并不是要急于解释我们身边的某某诡异现象,而是它本身的美妙。线性代数的出现,很大程度上要归功于神奇的Cramer 悖论;群论的诞生,也是 Galois 研究多项式的解的结构时的产物;Euler 创立图论,源于那个没有任何实用价值的 Königsberg 蛋疼问题;非欧几何的出现,则完全是由于这个问题本身的魅力。微积分呢?它确实有非常广泛的实用价值,物理学的各种定义都依赖于微积分;但很可惜,它不是一种具有颠覆性的数学思想。
初一课本讲负数时,反复说负数的实际意义,比如海拔、得分、温度、收支等等,把负数变成一种真实的存在。其实,这不是人们使用负数的主要动机。负数的价值在于,它可以把减去一个数变成加上一个负数,很多加加减减复杂到甚至需要分类讨论的东西都能够用一个式子统一在一起了。比如说小学的盈亏问题:如果每人分 3 个苹果还多 8 个,如果每人分 5 个苹果则还多 2 个,问有多少人多少苹果?解法是,两种分法多出来的苹果相差 6 个,这是每个人多分了两个苹果引起的,因此一共 3 个人,从而可以算出有 17 个苹果。但是,如果把问题改成“每人分 3 个就多 8 个,每人分 5 个就少 2 个”该怎么办?上面的公式就变了,8 不能减 2,要加 2 。因此,小学讲盈亏问题会分“盈亏”、“盈盈”、“亏亏”三种情况讨论。其实,如果把“少 2 个”理解成“多 -2 个”,问题是一模一样的,之前的公式同样适用。负数这一新思想立即把三种情况统一在了一起,它们的本质变得一模一样了。
这是我给初一学生讲负数时必讲的例子。这才是负数的意义。这才是课本里应该反复举例强调的。
某次看到论坛里有人问,群论有什么意思啊?某人回复,群论很有意思啊,只是课本把它写得没意思了,比方说,讲群论怎么能不讲魔方呢?我不赞同这个回复。数学吸引人的地方,不在于它在生活中的应用,而在于它本身的美。为什么不讲 Lagrange 定理?为什么不讲 Sylow 定理?对于我来说,最能吸引我学习一个数学课题的,莫过于一系列非平凡的结论以及它的精彩证明了。
科幻小说《伤心者》的末尾列举了很多长期以来未得到实际应用的数学理论,不过却没有说到一个更为极端的例子。数学中的皇冠——数论——2000 年来一直没有任何实际应用,是最纯粹的数学。直到计算机,尤其是现代密码学的出现,才让数论第一次走出数学,走进了人们的生活中。是什么在支持数论的研究呢?只能是数学本身了。
在我给初中孩子出几何题时,我都尝试着给出一般性的问题,求证三角形中两边的平均长度大于第三边上的中线长,求证三角形三条高的倒数和等于内切圆半径的倒数,等等。即使是纯代数问题和解析几何问题,我也总能编出题目描述简单并且极具挑战性的问题。两数的和与积相等共有多少个整数解?把直线 y=x 沿 y=2x 翻折后得到的直线方程是什么?在感受结论之美的同时,他们也会因自己独立解决了一个真正的数学问题而激动。
然而,这还不算教育的主要问题。某次与一个数学专业的同学聊到 Riemann 假设时,对方说她从没听说过 Riemann 假设。我大吃一惊,数学专业的人怎么可能不知道 Riemann 假设呢?随即明白,这也是拜数学教育所赐。翻开数学课本,总是成套的理论体系,先定义再证明,说得头头是道。可是,这些东西都是怎么来的呢?在得出这些东西的过程中,数学家们走了哪些弯路呢?课本上只字不提。课本里从来都只讲什么是对的,却从来不讲什么是错的。数学考试只会让你证明一个结论,从不会让你推翻一个结论。
2010 年江苏高考数学题因为“太难”备受争议。其中最后一道大题如下:已知 △ABC 的三边长都是有理数,(1) 求证 cos(A) 是有理数; (2) 求证对任意正整数 n , cos(nA) 是有理数。其实这道题是一个非常漂亮的好题,描述简单,问题普遍,结论有趣,证明巧妙,中考题就该这么出。不过我觉得,如果再补上这么一个小问,这道题就真的完美了:证明或推翻, sin(A) 一定是有理数。当然,问题本身并不难,等边三角形就是一个最简单的反例。关键在于,推翻一个结论,寻找一个反例,也是数学研究的一个基本能力,而这是中学数学教育中很少重视的。
于是,在教初中数学时,我布置的每道作业题都无一例外地以“证明或推翻”打头。偶尔,有些题目真的是需要学生们去推翻它。比方说,证明或推翻,周长和面积都相等的两个三角形全等。不同的人找到的反例不一样,有的简单有的复杂,有的深刻有的盲目。再用一整节课的时间逐一讲解并点评大家构造的反例,给孩子们带来的收获远比直接讲题要大得多。
但是,我还没有讲到数学教育中最主要的问题。前段时间去图灵的作译者交流会,期间和刘江老师简单地聊了几句。刘江老师提到一个网站叫做 Better Explained 。他说,其实大家没能理解数学之妙,是因为教的时候没教好,数学本来可以讲得更直观,更通俗的。
我非常同意刘江老师的说法。举个例子吧。如果有学生问,质数是什么?老师会说,质数就是除了 1 和自身以外,没有其它约数的数。不对,这不是学生想要的答案。学生真正想知道的是,质数究竟是什么?其实,质数就是不可再分的数,是组成一切自然数的基本元素。 12 是由两个 2 和一个 3 组成的,正如 H2O 是由两个 H 原子和一个 O 原子组成的一样。只是和化学世界不同,算术世界的元素有无穷多个。算术世界内的一切对象、定理和方法,都是由这些基本元素组成的,这才是质数为什么那么重要的原因。
高中学复数时,相信很多人会纳闷儿:虚数是什么?为什么要承认虚数?虚数怎么就表示旋转了?其实,人们建立复数理论,并不是因为人们有时需要处理根号里是负数的情况,而是因为下面这个不可抗拒的理由:如果承认虚数,那么 n 次多项式就会有恰好 n 个根,数系一下子就如同水晶球一般的完美了。但复数并不能形象地反映在数轴上,这不仅是因为实数在数轴上已经完备了,还有另外一个原因:没有什么几何操作连做两次就能实现取相反数。比如,“乘以 3”就代表数轴上的点离原点的距离扩大到原来的三倍,“3 的平方”,也就是“乘以 3 再乘以 3”,就是把上述操作连做两次,即扩大到 9 倍。同样地,“乘以 -1”表示把点翻折到数轴另一侧,“-1 的平方”就会把这个点又翻回来。但是,怎么在数轴上表示“乘以 i ”的操作?换句话说,什么操作连做两次能够把 1 变成 -1 ?一个颇具革命性的创意答案便是,把这个点绕着原点旋转 90 度。转 90 度转两次,自然就跑到数轴的另一侧了。没错,这就把数轴扩展到了整个平面,正好解决了复数没地方表示的问题。于是,复数的乘法可以解释为缩放加旋转,复数本身自然也就有了 z = r (cosθ + sinθi) 的表示方式。顺着这个道理推下去,一切都顺理成章了。复数不但有了几何解释,有时还能更便捷地处理几何问题。
一直对线性代数很感兴趣,于是大学选了线性代数这门课,结果收获几乎为零。原因很简单,本来期待着来一次大彻大悟,结果学了一个学期,我还是不知道矩阵究竟是什么,矩阵乘法为什么要这么定义,矩阵可逆又怎么了,行列式究竟表示什么。
直到今天看到这个网页,才看见有人一语道破线性代数的真谛(这也是我终于决定写成此文的直接原因)。我终于找到了我那一个学期企图寻找的东西。就好像把 x 变成 2 x 一样,我们经常需要把 (x, y) 变成 (2 x + y, x - 3 y) 之类的东西,这就叫做线性变换。于是才想到定义矩阵乘法,用于表示一切线性变换。几何上看,把平面上的每个点 (x, y) 都变到 (2 x + y, x - 3 y) 的位置上去,效果就相当于对这个平面进行了一个“线性的拉扯”。
矩阵的乘法,其实就是多个线性变换叠加的效果,它显然满足结合律,但不满足交换律。主对角线全是 1 的矩阵所对应的线性变换其实就是不变的意思,因此它叫做单位矩阵。矩阵 A 乘以矩阵 B 得单位矩阵,就是做完线性变换 A 后再做一次线性变换 B 就又变回去了的意思,难怪我们说矩阵 B 是矩阵 A 的逆矩阵。课本上对行列式的定义千奇百怪,又是什么递归,又是什么逆序对,还编写口诀帮助大家记忆。其实,行列式的真正定义就一句话:每个单位正方形在线性变换之后的面积。因此,单位矩阵的行列式当然就为 1,某行全为 0 的行列式显然为 0 (因为某一维度会被无视掉,线性变换会把整个平面压扁), |A·B| 显然等于 |A|·|B| 。行列式为 0 ,对应的矩阵当然不可逆,因为这样的线性变换已经把平面压成一条线了,什么都不能把它变回去了。当然,更高阶的矩阵就对应了更高维的空间。一瞬间,所有东西都解释清楚了。
难以置信的是,如此令人兴奋的东西,我们所用的课本上竟然一点都没有说到!那些开篇就讲行列式定义的课本,为什么不先把线性变换下的面积当作行列式的定义,再推导出行列式的计算方法,再来补充说明“其实从逻辑上说,我们应该先用这个计算公式来定义行列式,然后才说行列式可以用来表示面积”?为了严密性而牺牲了可读性,太不值得了。写到这里,我真想立即拾起线性代数课本,用全新的眼光重看所有的定义和定理,然后重新写一份真正的线性代数教材来。
高数课本同样荒唐。主流的高数课本都是先讲导数,再讲不定积分,再讲定积分,完全把顺序弄颠倒了。好多人学完微积分,虽然已经用得得心应手,但仍然没懂这是怎么回事。究其原因,还是数学教学的问题。
我理想中的微积分课本则应该是先讲定积分,再讲导数,再讲不定积分。先讲定积分,不过千万不能用现在的定积分符号,避免学生误认为定积分是由不定积分发展而来的。讲自古就有的积分思想,讲分割求和取极限的方法,自创一套定积分的符号。然后另起炉灶,开始讲微分,讲无穷小,讲变化量。最后才讲到,随着 x 一点一点的增加,曲线下方面积的变化量就是那一条条竖线的高度——不就是这个曲线本身的函数值吗?因此,反过来,为了求出一个函数对应的曲线下方的面积,只需要找到一个新函数,使得它的微分正好就是原来那个函数。啪,微积分诞生了。
光讲形式化的推导沒有用。这才是真正把微积分讲懂的方式。严格定义和严格证明应该放到直观理解之后。只可惜,我还没看到哪本课本是这样写的。
说了这么多,其实总结起来只有一句话:我们学习数学的过程,应该和人类认识数学的过程一样。我们应该按照数学发展历史的顺序学习数学。我们应该从古人计数开始学起,学到算术和几何,学到坐标系和微积分,了解每个数学分支创立的动机,以及这个分支曲折的发展历程。我们应该体会数学发展的每个瓶颈,体会每个全新理论的伟大之处,体会每一次数学危机让数学家们手忙脚乱的感觉,体会先有直观思维再给出形式化描述的艰难。
可惜,我没有找到任何用这种方式学习数学的途径。
不过也好。既然没有捷径,那就让我自己把那堆形式化的定义和证明通看一遍,然后自己去体会其中的道理吧。这样看来,我们的教育也没错:先用考试逼着大家把该学的东西都学了,尽管自己也不知道自己学的是啥;等将来的某一天达到一定高度时,回头看看过去学的东西,突然恍然大悟,明白了当初学的究竟是什么。这无疑是一件更有乐趣的事情。我希望有一天能像今天这样,能悟出高等代数究竟在讲什么,能悟出范畴论到底有什么用,能悟出 Riemann 假设为何如此牛 B,能悟出 Hilbert 空间是什么东西,然后把它们都写下来。
这恐怕得花我大半辈子的时间吧。