一次性掌握微积分和线性代数两大神器,这本书做到了!

1638f1ea76086cb01c8fb5c484a1926c.png

数学拥有无穷的力量。它既帮助游戏开发工程师建模物理世界,也帮助量化金融分析师赚取利润,还帮助音频处理工程师制作音乐。在数据科学和机器学习领域,数学知识更是不可或缺的。

有人热爱数学,将它比作诗歌,为之着迷一生;有人很难领会数学的妙处,受困于“数学焦虑症”。本书正是为了帮助程序员消除这种焦虑,用自己熟悉的工具,即代码,重新发现数学之美。

本书以图文结合的方式帮助你用Python代码解决程序设计中的数学问题。通过边学边练,你会发现线性代数和微积分的重要概念跃然纸上、印在脑中。

来源 | 《程序员数学:用Python学透线性代数和微积分》

作者 | 保罗·奥兰德(Paul Orland)

译者 | 百度KFive

数学就像棒球、诗歌或者美酒。一些人为之着迷,以至于为它奉献终生;另一些人却难以领会其妙处。接受过十余年的数学教育,你应该已经属于这两个阵营之一了。

如果我们在学校里像学习数学一样学习关于美酒的知识呢?要是一周五天、每天听一小时的葡萄品类和发酵技术课程,我想我绝不会喜欢葡萄酒。也许在这样的世界里,我需要按照老师布置的作业每天喝上三四杯。这种体验听起来很美妙,但有时我可能并不愿意在放学后喝得醉醺醺的。我在数学课上的经历就是这样,这让我一度对这门学科望而却步。学习数学就像品葡萄酒一样,是后天才能培养的爱好,但是天天听课和写作业没办法让你长出一根善于品尝美酒的舌头。

判断自己是否具有学习数学的天赋似乎很容易。如果你相信自己,并且对开始学习数学感到兴奋,那就太好了!如果你不那么乐观,那么本章就是为你设计的。被数学吓退的现象很普遍,它有一个名字:数学焦虑症。我希望能消除你可能有的任何焦虑,并告诉你学习数学可以是一场激动人心的经历,并不可怕。你需要的只是合适的工具和端正的态度。

本书的主要学习工具是Python编程语言。我猜你在高中学习时,数学知识是写在黑板上而不是计算机代码里的。这真是太可惜了,因为高级编程语言远比黑板或任何昂贵的计算器更强大、用途更多。用代码学习数学的一个好处是,设计必须精确,以便计算机理解,而且永远不会让新符号产生歧义。

就像学习其他东西一样,成功的关键是你有学习的动机。动机多种多样:你可能被数学概念的美感所吸引,或者喜欢数学问题那种像“脑筋急转弯”一样的感觉,抑或有一个梦寐以求的应用程序或游戏,需要写一些数学相关的代码来使它工作。现在,我将专注于一种更实际的动机——用软件解决数学问题可以赚很多钱。

1

使用数学和软件解决商业问题

经常有人诟病高中数学课:“我什么时候才能在现实生活中用到这些知识?”老师告诉我们,数学会帮助我们在事业上取得成功并赚钱。我觉得他们说得没错,尽管举的例子并不准确。例如,我不会手动计算银行复利(银行也不会)。也许,如果我像三角学老师建议的那样成为建筑工地的测量员,就会每天用正弦公式和余弦公式来赚取工资。

看起来高中课本里所谓的“实际”应用并没那么有用,但是对数学的真实应用还是有的,而且有些应用带来的商业利润令人瞠目结舌。许多问题是通过将正确的数学思想转化为可用的软件来解决的。这里将分享一些我最喜欢的例子。

1) 预测金融市场走势

我们都听说过股票交易员通过在正确的时间买入和卖出正确的股票而赚取数百万美元的传奇故事。受所看电影的影响,我总是把他们想象成穿着西装的中年男子,一边开着跑车,一边用手机对着经纪人大喊大叫。也许这种刻板印象在某一时期是正确的,但今天的情况已经不同了。

在曼哈顿的摩天大楼里,隐藏着成千上万被称为量化金融分析师(quant)的人。量化金融分析师又称定量分析师,负责设计数学算法来自动交易股票并赚取利润。他们不穿西装,也不花时间对着手机大喊大叫,但我相信他们中的很多人拥有非常漂亮的跑车。

那么,量化金融分析师是如何写出自动赚钱的程序的呢?这个问题的最佳答案是被严密保护的商业秘密,但肯定涉及大量数学知识。我们可以看一个简单的例子来了解自动交易策略的工作原理。

股票是代表公司所有权的金融资产类型。当市场认为一家公司经营良好时,其股票价格就会上涨:买入股票的成本增加,卖出股票的回报也会增加。股票价格的变化是不稳定的、实时的。图1-1显示了在一天交易中的股票价格图。

2e27a1c1385b3fbe1586b27d0a852068.jpeg

图1-1 股价随时间变化的典型图形

对于这只股票,如果你在第100分钟左右以24美元买入1000股,并在第430分钟左右以38美元全部卖出,当天就可以赚14 000美元。这很棒!挑战在于,你必须提前知道这只股票会上涨,而且清楚第100分钟和第430分钟分别是买入和卖出的最佳时机。虽然你可能无法准确预测最低或最高价格,但也许能找到一天中相对较好的买卖时机。让我们来看看如何用数学方法来实现这个目标。

我们可以通过找到一条“最佳拟合”线来衡量股票价格会涨还是会跌,这条线大致遵循价格的变动方向。这个过程称为线性回归,本书的第三部分会介绍。因为数据是不断变化的,所以可以在“最佳拟合”线上下再计算出两条线,以显示价格上下浮动的区域。把它们叠加在价格图表上,可以看出这些线和趋势相符,如图1-2所示。

e6fe4c4c4ca524cb1bbdc0419e419582.jpeg

图1-2 利用线性回归确定股票价格的变化趋势

有了对股票价格走势的数学理解,我们就可以编写代码,在股票价格相对于其趋势开始低位波动时自动买入,并在价格回升时自动卖出。具体来说,我们的程序可以通过网络连接到证券交易所,在价格低于底线时买入100股,并在价格越过顶线时卖出100股。图1-3展示了一次这样的盈利交易:以27.80美元左右的价格买入,以32.60美元左右的价格卖出,在一小时内可以赚到约480美元。

cb19b27eb22decc6f9527c8464080143.jpeg

图1-3 使用我们基于规则的交易软件进行买卖,赚取利润

我不敢说这是一个完备的可执行策略,但重点是,只要有正确的数学模型,你就可以自动获利。此刻,不知有多少程序正在构建和更新对股票等金融工具进行趋势预测的模型。如果你编写出这样的程序,就能在享受闲暇时光的同时赚钱了!

(2) 寻找优质交易

或许你的本钱不够多,无法参与高风险的股票交易。尽管如此,数学仍然可以帮助你在其他交易中赚钱和省钱,比如在买二手车时。新车交易比较简单透明:如果两个经销商在卖同一款车,你显然想从成本最低的经销商那里买。但二手车有更多需要考虑的参数:除了价格,还有里程数和出厂日期。你甚至可以利用某辆二手车在市场上的停留时间来评估它的质量:停留时间越长,其质量可能就越值得怀疑。

在数学里,用有序的数字列表来描述的对象被称为向量(vector),有一个领域专门研究它,称为线性代数。例如,一辆二手车可能对应的是一个四维向量,也就是一个包含四个数的元组。例如:

1b43be91b8de2010af6396d3e77c2fca.png

这些数分别代表出厂日期、里程数、停留天数和价格。我的一个朋友经营着一个叫作CarGraph的网站,上面汇总了二手车销售的数据。在写作本书时,这个网站提供了101辆丰田普锐斯的销售数据,包含每辆车的这四项数据(部分或全部)。该网站名副其实,将数据以图表的形式直观地呈现出来(见图1-4)。四维对象很难可视化,但如果选择其中的两个维度,比如价格和里程数,就可以把描述它们关系的散点图绘制出来。

2818ec11750339efb9cebf2af730afbf.jpeg

图1-4 来自CarGraph的二手普锐斯价格与里程数关系图1

11英里 ≈ 1.6千米。——编者注

我们也想在这里画一条趋势线。图中的每个点都代表了某个人心中的合理价格,趋势线会把这些心理预期价格汇总到一起,形成在任何里程数下都比较可靠的价格。在图1-5中,我决定拟合一条指数下降曲线,而不是一条直线,并且忽略了一些以低于零售价销售的次新车。

9425b28e12fe64d5926336eeb862cd52.jpeg

图1-5 根据二手普锐斯的价格与里程数拟合出的指数下降曲线

为了更容易管理数据,我在计算时将里程数单位换成了万英里,所以里程数为5代表5万英里。令611bfae406fd786e6ec7d5e90953eb00.png为价格,23c8a2aec4c56cf4a167462b465c535a.png为里程数,最佳拟合曲线的公式如下:

a7e3cbdd20a21761ff4ed89c3bd243e1.png

根据式(1.1),最合适的价格是26 500美元乘以0.905的4c84b3148499699d46b434e25e3c4a0b.png次幂。将这些数值代入方程,我们发现,如果预算是10 000美元,那么应该购买一辆行驶里程约为97 000英里的普锐斯(见图1-6)。如果曲线表示的是合理的价格,那么低于该线的汽车通常应该是划算的。

223c0845659960937ee6c261d477203a.jpeg

图1-6 以10 000美元的预算为例,找出一辆二手普锐斯的预期里程数

除了可以寻找性价比最高的交易,我们还能从式(1.1)中学到更多东西。它讲述了一个关于汽车如何贬值的故事。式中的第一个数是$26 500,是指数函数对里程为零时价格的理解。这与一辆新普锐斯的零售价非常接近。如果我们使用最佳拟合线,它意味着普锐斯每行驶一英里就会损失固定的价值。这个指数函数则表示,每行驶一英里,普锐斯的价值就会损失一个固定的百分比。在行驶10 000英里后,根据这个公式,一辆普锐斯的价格会跌到原价的0.905(90.5%)。在行驶50 000英里后,我们将其价格乘以系数(0.905)5 ≈ 0.607。这告诉我们,它的价格约为新车的61%。

我用Python实现了一个price(mileage)函数,用来制作像图1-6那样的图。它将里程数作为输入(单位为万英里),并输出最适合的价格。通过计算price(0) - price(5)和price(5) - price(10),我知道了第一个和第二个50 000英里的行驶成本分别为10 000美元和6300美元。

如果使用最佳拟合直线而不是指数曲线,这意味着汽车的固定折旧率为每英里0.10美元。换言之,每行驶50 000英里,就一定会损失5000美元。传统观念认为,新车行驶的头几英里掉价最快,因此指数函数(式(1.1))与此相符,而线性模型则不够准确。

请记住,这只是一个二维分析。我们只建立了一个数学模型,将描述每辆车的四个数值维度中的两个维度联系起来。在本书第一部分中,你将详细学习各种维度的向量以及如何使用高维数据。第二部分将介绍不同类型的函数,如线性函数和指数函数,并通过分析其变化率来进行比较。最后,第三部分将探讨如何建立数学模型,将数据集的所有维度纳入其中,从而获得更准确的图形。

(3) 构建三维图形和动画

许多在商业上大获成功的著名软件项目与多维数据打交道,特别是三维数据。这里我想到的是三维动画电影和三维视频游戏,它们的总收入高达数十亿美元。例如,皮克斯的三维动画软件帮助其获得了超过130亿美元的票房收入,Activision的《使命召唤》系列三维动作游戏赚了160多亿美元,而Rockstar仅凭《侠盗猎车手5》就赚了60多亿美元。

所有这些成功的项目都基于三维向量(形式为54976460f728496d02c4077baa45e77f.png)运算。通过三个数就可以在三维空间中相对于参考点定位一个点,这个参考点就是所谓的原点。由图1-7可知,这三个数表示在各个方向上到原点的垂直距离。

805752e4c5682dc4453609cb12bf692e.jpeg

图1-7 用三个数8f68d52c6e712c1d903c4518ed341601.pnge90bf357a6eba46d70e4201f16943f70.png8a680785eca7550ebab7663e4e35bf09.png组成的向量在三维空间中定位一个点

从《海底总动员》中的小丑鱼到《使命召唤》中的航空母舰,任何三维对象都可以在计算机中用三维向量的集合来定义。在代码中,每个对象看起来都像由float值组成的三元数对(triple)列表。有三个三元浮点数对,我们就有了空间中的三个点,这样就可以定义一个三角形(见图1-8)。例如:

triangle = [(2.3,1.1,0.9), (4.5,3.3,2.0), (1.0,3.5,3.9)]

b8c765be54f5b2545f0aff15da220901.jpeg

图1-8 使用由三元数对定义的三个顶点构建一个三维三角形

组合多个三角形,就可以生成一个三维对象的表面。使用更多、更小的三角形,还可以让结果看起来很平滑。图1-9显示了使用越来越多的更小三角形对一个三维球体进行的六次渲染。

ddb4424e70e7aca675c8d8dde0e766c3.jpeg

图1-9 由指定数量的三角形构建的三维球体

你将学习使用三维向量数学将三维模型转换成类似于图1-9中的带阴影的二维图像。你还需要使三维模型更为平滑,让它们在游戏或电影中显得更加逼真,并且让它们逼真地移动和变化。这意味着你设计的对象应该遵守物理定律,而这些定律也可以用三维向量来表示。

假设你是《侠盗猎车手5》的程序员,想实现一个基础用例,比如向直升机发射火箭炮。从主角的位置开始发射炮弹后,炮弹的位置会随着时间的推移而改变。可以使用数值下标来标注炮弹在飞行过程中的各个位置,从4402198b694023b2f47fa2f9810191fc.png开始。随着时间的推移,炮弹到达新的位置,用向量70ea79735ea593ea72b62e8a8797c0f5.png2eea9cb0bf023c292ee9d3a56f21b274.png等来标记。7611cfd77eaa310ca11ecdf8a7a07c5d.png8c218aed55ecd5bd3dbaad2c33935d42.png8747f1db8aa926eaeb88a283a4b26678.png值的变化率是由火箭炮的方向和炮弹速度决定的。此外,由于重力作用,随着炮弹26bbe8a7c07ee745258b6f26354fa97b.png值的增加,变化率会随着时间的推移而减小(见图1-10)。

06b8c26424bfbb14049d809c4d534c92.jpeg

图1-10 炮弹的位置向量因其初始速度和重力的影响而随时间变化

有经验的动作游戏玩家都知道,想击中直升机,需要瞄准稍微高于直升机的位置!要模拟物理学,必须知道力是如何影响物体并随着时间的推移引起物体连续变化的。研究连续变化的数学被称为微积分,物理定律通常用微积分中的微分方程来表示。在第4章和第5章中,你会学到如何制作三维物体的动画,然后在第二部分中学习如何利用微积分的思想模拟物理世界。

(4) 对物理世界建模

之前“数学软件能产生真正的商业价值”的说法并非虚言,我在自己的职业生涯中已经看到了这种价值。2013年,我成立了一家名为Tachyus的公司,编写软件以优化石油和天然气的生产。我们的软件利用数学模型来了解地下油气的流动情况,帮助生产商更高效地开采同时获利更多。在软件的帮助下,我们的客户每年节约了数百万美元的成本并提高了产量。

为了解释软件的工作原理,这里介绍一些石油术语。将称为井的钻孔钻到地下,直到到达含有石油的多孔(海绵状)岩石。这层富含石油的岩石称为储油层。石油被抽到地面并卖给炼油厂,然后炼油厂将石油转化为我们日常使用的产品。图1-11为油田示意图(未按比例显示)。

0b93289360907f4be62faef3c3d13e89.jpeg

图1-11 油田示意图

过去几年中,石油价格变化很大,但我们假设它的价值是每桶50美元,其中桶是一个容积单位,相当于42加仑或约159升。如果通过钻井和有效地抽油,一家公司每天能够开采1000桶石油(相当于几个后院游泳池的容积),那么它的年收入将达到数千万美元。即使效率只提高几个百分点,也是一笔可观的收入。

根本的问题是地下的情况:石油现在在哪里,如何流动?这是一个复杂的问题,但是可以通过解微分方程来回答。这里的变量不是炮弹的位置,而是地下流体的位置、压力和流速。流体流速用一种特殊的函数来表示,这种函数返回一个向量,称为向量场。这意味着流体可以在任意三维方向上以任意速度流动,而且这个方向和速度在储油层内的不同位置各不相同。

有了对一些参数的最佳预测,我们可以用一个叫作达西定律(Darcy's law)的微分方程来预测流体通过多孔岩石介质(如砂岩)的流速。图1-12说明了达西定律,即使有些符号不熟悉也不要担心!代表流速的函数名为238ae064d1f4ad4773d11396047d8a78.png,用粗体表示它返回的是一个向量值。

7a47b948373a9681af07d530b5ad821f.jpeg

图1-12 达西定律对应的物理方程,决定流体在多孔岩石中的流动方式

这个方程中最重要的部分是一个看起来像倒三角形的符号,它代表了向量微积分中的梯度算子(gradient operator)。压力函数1b4d52400e44ac11c50e412e56ea7bbc.png在给定空间点dc2f14aa1fe94c168e045fe2ab1e7c7d.png的梯度是三维向量90558d51fa9458061cf0c04edee9c56c.png,表示该点压力增加的方向和速度。这里的负号表明,流速的三维向量指向相反的方向。这个方程用数学术语说明了,流体从高压区流向低压区。

负梯度在物理定律中很常见。可以这样理解,自然界倾向于向低势能状态变化。一个球在山丘上的势能取决于山丘在任何横向点6c229d1918e58bae63e29c1080affbc5.png的高度78f894b34b34ddb1933f3ef2abcd86c1.png。如果山丘的高度由函数1024af6fbc80b91abad0509f904965f4.png给出,则梯度指向上坡的方向,而球的滚动方向正好相反(见图 1-13)。

034139150f19cc2c00beeabde5d1e17e.jpeg

图1-13 正梯度指向上坡,而负梯度指向下坡

我会介绍如何应用梯度来模拟物理世界,以及解决其他数学问题。梯度恰好也是机器学习中最重要的数学概念之一。

希望这些例子比你在高中数学课上听到的实际应用更有说服力和现实意义。也许此刻你已经愿意去学习这些数学概念了,但是又担心太难。学习数学的确很难,尤其是自学。为了让你尽可能顺利地学习,我们来谈谈作为数学学生可能面临的一些陷阱,以及本书如何帮助你避免踏入这些陷阱。

2

用上你训练有素的左脑

本书是为有经验的程序员或在工作中热衷于学习编程的人设计的。为程序员读者写关于数学的内容是极好的,因为如果你会写代码,就已经训练了你的分析性左脑。我认为学习数学的最好方法是借助高级编程语言,并且预测在不远的将来,这将是数学课堂的常态。

对于像你这样的程序员,可以用几种具体的方法来很好地学习数学。我在这里将其列举出来不仅是为了奉承你,也是为了提醒你已经具备了哪些技能,可以在数学学习中利用起来。

(1) 使用正式的语言

当学习编程时,第一个痛苦的教训就是,不能像写简单的英文一样编写代码。如果你给朋友写的纸条有少许拼写或语法错误,他们可能还能理解你想说的内容,但代码中的任何语法错误或拼写错误都会导致程序运行失败。在某些语言中,即使在原本正确的语句末尾漏掉一个分号,也会导致程序无法运行。作为另一个例子,看一下下面这两个语句。

x = 5
5 = x

可以把二者都解读为符号1595217ac213b1a1a5130aab9b27dbb8.png的值是5。但这在Python中并不准确,事实上,只有第一条可以如此解读。Python语句x = 5是一个指令,会把变量d9981bb22d3e24cc4ccd96e6d7289872.png的值设置为5。但是,不能将数字5设置为具有6cdfb2e6f6e347ff10f59fb8df0a1533.png的值。这可能看起来有些咬文嚼字,但你需要知道这一点才能写出正确的程序。

另一个困扰新手程序员(有经验的程序员也一样)的问题是引用相等。如果定义了一个新的Python类,并创建了它的两个相同的实例,那么它们是不相等的。

>>> class A(): pass
...
>>> A() == A()
False

你可能希望两个相同的表达式是相等的,但这显然不符合Python的规则。因为这两个表达式是A类的不同实例,所以它们是不相等的。

留意新的数学对象,它们看起来像你所熟知的对象,但行为方式却不一样。例如,如果字母618a0f20beca7c594f1419aa8fb79a5e.png4951705529982d51e075ceb448907d42.png代表数,那么2be6db2e36592cca3ac95c49f8b79571.png。但是,正如你将在第5章中学到的,如果3b598ce1068f7cf28a4faeafe0102dad.png10529f9a8b431f19cbf03a7781247ecd.png不是数,情况就不一定是这样。如果1647663bf3d094598a4c4cd95d6762e5.png7c36941e57cee502f58cc4be1d2d4b59.png是矩阵,那么积908363e6815c422a2b4eb4316b83267f.pngc940062293d98c3d218e1f33bdddd285.png就是不同的。事实上,它们之中甚至有可能只有一个是合法的,或者两者都不正确。

写代码的时候,仅仅写出语法正确的语句是不够的。语句所代表的思想需要是有意义的、合法的。如果写数学语句时也同样谨慎,你会更快发现错误。更棒的是,如果用代码写数学语句,计算机会帮你做辅助检查。

当你厌倦了重复计数时,就可以创建针对加法的抽象;当你厌倦了做重复的加法时,就可以创建针对乘法的抽象;以此类推。

数学的抽象性会让人望而生畏。但是,就像在任何优秀软件中一样,引入抽象是有原因的:它可以帮助你组织和交流更宏大、更强有力的思想。当你掌握了这些思想并将其转化为代码时,就会开启更多令人兴奋的可能性。

如果你还没有做到这一点,我希望你已经相信,软件开发中有许多令人兴奋的数学应用。

  推荐阅读

f2fe9e0d50fc0c6317fa4d1b78baf8d3.jpeg

《程序员数学 用Python学透线性代数和微积分》

作者:保罗·奥兰德(Paul Orland)

译者:百度KFive

代码和数学是相知相惜的好伙伴,它们基于共同的理性思维,数学公式的推导可以自然地在编写代码的过程中展开。

500余幅图片,本书以图文结合的方式帮助你用Python代码解决程序设计中的数学问题。

300余个练习,通过边学边练,你会发现线性代数和微积分的重要概念跃然纸上、印在脑中。

abcad40efb34c02e4d776d03018b1b98.jpegd799fe097e0733b1b0f46173c81f11b8.png

猜你喜欢

转载自blog.csdn.net/turingbooks/article/details/132784235