专栏名称: 机器学习算法与Python实战
长期跟踪关注统计学、数据挖掘、机器学习算法、深度学习、人工智能技术与行业发展动态,分享Python、机器学习等技术文章。回复机器学习有惊喜资料。
目录
相关文章推荐
超级数学建模  ·  买书送螺蛳粉,精神粮食也可以有风味美食 ·  5 天前  
超级数学建模  ·  圆内接四边形对角互补的巧妙证明!你看懂了吗? ·  1 周前  
超级数学建模  ·  欺负我的人,你给我等着! ·  1 周前  
51好读  ›  专栏  ›  机器学习算法与Python实战

豆瓣9.2,能把数学和python完美结合的,推荐这本书!读者感叹“瘫痪式手把手教程”!

机器学习算法与Python实战  · 公众号  · 数学 科技媒体  · 2024-09-16 20:38

正文


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


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


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

来源 | 《程序员数学:用Python学透线性代数和微积分》 作者 | 保罗·奥兰德(Paul Orland) 译者 | 百度KFive

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

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

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

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

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

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

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

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

1) 预测金融市场走势

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

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

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

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

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

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

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

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

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

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

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

(2) 寻找优质交易

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

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

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

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

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

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

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

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

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

图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多亿美元。

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

图1-7 用三个数组成的向量在三维空间中定位一个点

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

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

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

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

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

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

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

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

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

(4) 对物理世界建模

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

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

图1-11 油田示意图

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

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

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

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

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

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

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

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

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

2
用上你训练有素的左脑

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

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

(1) 使用正式的语言

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

x = 5
5 = x

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

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

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

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

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

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

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

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

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



  推荐阅读

目录

向上滑动阅览目录 


第 1章 通过代码学数学  1

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

1.1.1 预测金融市场走势 2

1.1.2 寻找优质交易 4

1.1.3 构建三维图形和动画 6

1.1.4 对物理世界建模 8

1.2 如何高效学习数学 9

1.2.1 Jane想学习数学 9

1.2.2 在数学课本中苦苦挣扎 10

1.3 用上你训练有素的左脑 11

1.3.1 使用正式的语言 11

1.3.2 构建你自己的计算器 12

1.3.3 用函数建立抽象概念 13

1.4 小结 14

第 一部分 向量和图形

第 2章 二维向量绘图 16

2.1 二维向量绘图 16

2.1.1 如何表示二维向量 18

2.1.2 用Python绘制二维图形 20

2.1.3 练习 23

2.2 平面向量运算 25

2.2.1 向量的分量和长度 28

2.2.2 向量与数相乘 29

2.2.3 减法、位移和距离 31

2.2.4 练习 34

2.3 平面上的角度和三角学 41

2.3.1 从角度到分量 42

2.3.2 Python中的三角学和弧度 46

2.3.3 从分量到角度 47

2.3.4 练习 50

2.4 向量集合的变换 57

2.4.1 组合向量变换 59

2.4.2 练习 60

2.5 用Matplotlib绘图 61

2.6 小结 62

第3章 上升到三维世界 63

3.1 在三维空间中绘制向量 64

3.1.1 用坐标表示三维向量 66

3.1.2 用Python进行三维绘图 66

3.1.3 练习 68

3.2 三维空间中的向量运算 70

3.2.1 添加三维向量 70

3.2.2 三维空间中的标量乘法 72

3.2.3 三维向量减法 72

3.2.4 计算长度和距离 73

3.2.5 计算角度和方向 74

3.2.6 练习 75

3.3 点积:测量向量对齐 78

3.3.1 绘制点积 78

3.3.2 计算点积 80

3.3.3 点积的示例 82

3.3.4 用点积测量角度 83

3.3.5 练习 85

3.4 向量积:测量定向区域 88

3.4.1 在三维空间中确定自己的朝向 88

3.4.2 找到向量积的方向 89

3.4.3 求向量积的长度 91

3.4.4 计算三维向量的向量积 92

3.4.5 练习 93

3.5 在二维平面上渲染三维对象 96

3.5.1 使用向量定义三维对象 97

3.5.2 二维投影 98

3.5.3 确定面的朝向和阴影 99

3.5.4 练习 101

3.6 小结 102

第4章 变换向量和图形 103

4.1 变换三维对象 105

4.1.1 绘制变换后的对象 105

4.1.2 组合向量变换 107

4.1.3 绕轴旋转对象 110

4.1.4 创造属于你自己的几何变换 113

4.2 线性变换 117

4.2.1 向量运算的不变性 117

4.2.2 图解线性变换 119

4.2.3 为什么要做线性变换 121

4.2.4 计算线性变换 124

4.2.5 练习 127

4.3 小结 132

第5章 使用矩阵计算变换 134

5.1 用矩阵表示线性变换 135

5.1.1 把向量和线性变换写成矩阵形式 135

5.1.2 矩阵与向量相乘 136

5.1.3 用矩阵乘法组合线性变换 138

5.1.4 实现矩阵乘法 140

5.1.5 用矩阵变换表示三维动画 141

5.1.6 练习 142

5.2 不同形状矩阵的含义 148

5.2.1 列向量组成的矩阵 149

5.2.2 哪些矩阵可以相乘 151

5.2.3 将方阵和非方阵视为向量函数 152

5.2.4 从三维到二维的线性映射投影 154

5.2.5 组合线性映射 156

5.2.6 练习 157

5.3 用矩阵平移向量 163

5.3.1 线性化平面平移 163

5.3.2 寻找做二维平移的三维矩阵 167

5.3.4 在四维世界里平移三维对象 170

5.4 小结 174

第6章 高维泛化 176

6.1 泛化向量的定义 177

6.1.1 为二维坐标向量创建一个类 178

6.1.3 使用同样的方法定义三维向量 179

6.1.4 构建向量基类 180

6.1.5 定义向量空间 182

6.1.6 对向量空间类进行单元测试 185

6.2 探索不同的向量空间 188

6.2.1 枚举所有坐标向量空间 188

6.2.2 识别现实中的向量 190

6.2.3 将函数作为向量处理 192

6.2.4 将矩阵作为向量处理 194

6.2.5 使用向量运算来操作图像 195

6.2.6 练习 198

6.3 寻找更小的向量空间 205

6.3.1 定义子空间 205

6.3.2 从单个向量开始 207

6.3.3 生成更大的空间 207

6.3.4 定义“维度”的概念 209

6.3.5 寻找函数向量空间的子空间 210

6.3.6 图像的子空间 212

6.3.7 练习 214

6.4 小结 220

第7章 求解线性方程组 222

7.1 设计一款街机游戏 223

7.1.1 游戏建模 223

7.1.2 渲染游戏 224

7.1.3 发射激光 225

7.1.4 练习 226

7.2 找到直线的交点 227

7.2.1 为直线选择正确的公式 227

7.2.2 直线的标准形式方程 229

7.2.3 线性方程组的矩阵形式 231

7.2.4 使用NumPy求解线性方程组 233

7.2.6 识别不可解方程组 234

7.2.7 练习 236

7.3 将线性方程泛化到更高维度 240

7.3.1 在三维空间中表示平面 240

7.3.2 在三维空间中求解线性方程组 243

7.3.4 计算维数、方程和解 245

7.3.5 练习 246

7.4 通过解线性方程来改变向量的基 253

7.4.1 在三维空间中求解 255

7.4.2 练习 256

7.5 小结 257

第二部分 微积分和物理仿真

第8章 理解变化率 261

8.1 根据体积计算平均流速 262

8.1.1 实现average_flow_rate函数 263

8.1.2 用割线描绘平均流速 264

8.1.3 负变化率 265

8.1.4 练习 266

8.2 绘制随时间变化的平均流速 266

8.2.1 计算不同时间段内的平均流速 267

8.2.2 绘制间隔流速图 268

8.2.3 练习 270

8.3 瞬时流速的近似值 271

8.3.1 计算小割线的斜率 272

8.3.2 构建瞬时流速函数 274

8.3.3 柯里化并绘制瞬时流速函数 277

8.4 体积变化的近似值 278

8.4.1 计算短时间间隔内的体积变化 279

8.4.2 将时间分割成更小的间隔 280

8.4.3 在流速图上绘制体积变化的图形 280

8.4.4 练习 283

8.5 绘制随时间变化的体积图 283

8.5.1 计算随时间变化的体积 283

8.5.2 绘制体积函数的黎曼和 285

8.5.3 提升近似结果的精确度 286

8.5.4 定积分和不定积分 288

8.6 小结 290

第9章 模拟运动的对象 291

9.1 模拟匀速运动 291

9.1.1 给小行星设置速度 292

9.1.2 更新游戏引擎,让小行星运动 292

9.1.3 保持小行星在屏幕上 293

9.1.4 练习 295

9.2 模拟加速 295

9.3 深入研究欧拉方法 296

9.3.1 手动计算欧拉方法 297

9.3.2 使用 Python 实现算法 298

9.4 用更小的时间步执行欧拉方法 300

9.5 小结 305

第 10章 使用符号表达式 306

10.1 用计算机代数系统计算精确的导数 309

10.2.1 将表达式拆分成若干部分 310

10.2.3 使用Python语言实现表达式树 311

10.2.4 练习 313

10.3 符号表达式的应用 315

10.3.1 寻找表达式中的所有变量 317

10.3.3 表达式展开 319

10.3.4 练习 321

10.4 求函数的导数 323

10.4.1 幂的导数 324

10.4.2 变换后函数的导数 324

10.4.3 一些特殊函数的导数 326

10.4.4 乘积与组合的导数 327

10.4.5 练习 328

10.5 自动计算导数 330

10.5.1 实现表达式的导数方法 330

10.5.2 实现乘积法则和链式法则 332

10.5.4 练习 334

10.6 符号化积分函数 335

10.6.1 积分作为反导数 335

10.6.2 SymPy库介绍 336

10.6.3 练习 337

10.7 小结 338

第 11章 模拟力场 339

11.1 用向量场对引力建模 339

11.2 引力场建模 342

11.2.1 定义一个向量场 343

11.2.2 定义一个简单的力场 344

11.3 把引力加入小行星游戏 345

11.3.1 让游戏中的对象感受到引力 346

11.3.2 练习 349

11.4 引入势能 350

11.4.1 定义势能标量场 351

11.4.2 将标量场绘制成热图 352

11.4.3 将标量场绘制成等高线图 354

11.5.1 用横截面测量陡度 354

11.5.2 计算偏导数 356

11.5.3 用梯度求图形的陡度 357

11.5.4 用势能的梯度计算力场 359

11.5.5 练习 361

11.6 小结 364

第 12章 优化物理系统 365

12.1 测试炮弹模拟器 367

12.1.1 用欧拉方法建立模拟器 368

12.1.2 测量弹道的属性 369

12.1.3 探索不同的发射角度 370

12.1.4 练习 371

12.2 计算射程 373

12.2.1 求炮弹射程关于发射角的函数 373

12.2.2 求射程 376

12.2.3 确定值和小值 378

12.2.4 练习 379

12.3 增强模拟器 381

12.3.1 添加另一个维度 381

12.3.2 在炮弹周围建立地形模型 383

12.3.4 练习 386

12.4 利用梯度上升优化范围 388

12.4.1 绘制射程与发射参数的关系图 388

12.4.2 射程函数的梯度 389

12.4.3 利用梯度寻找上坡方向 390

12.4.4 实现梯度上升 392

12.4.5 练习 395

12.5 小结 399

第 13章 用傅里叶级数分析声波 400

13.1 声波的组合和分解 401

13.2 用Python播放声波 402

13.2.1 产生第 一个声音 402

13.2.2 演奏音符 405

13.2.3 练习 406

13.3 把正弦波转化为声音 406

13.3.1 用正弦函数制作音频 406

13.3.2 改变正弦函数的频率 408

13.3.3 对声波进行采样和播放 409

13.3.4 练习 411

13.4 组合声波得到新的声波 412

13.4.1 叠加声波的样本来构造和弦 412

13.4.2 两个声波叠加后的图形 413

13.4.3 构造正弦波的线性组合 414

13.4.4 用正弦波构造一个熟悉的函数 416

13.4.5 练习 419

13.5 将声波分解为傅里叶级数 419

13.5.1 用内积确定向量分量 420

13.5.2 定义周期函数的内积 421

13.5.3 实现一个函数来计算傅里叶系数 423

13.5.4 求方波的傅里叶系数 424

13.5.5 其他波形的傅里叶系数 424

13.5.6 练习 426

13.6 小结 428

第三部分 机器学习的应用

第 14章 数据的函数拟合 431

14.1 衡量函数的拟合质量 433

14.1.1 计算数据与函数的距离 434

14.1.2 计算误差的平方和 436

14.1.3 计算汽车价格函数的代价 440

14.2 探索函数空间 441

14.2.1 绘制通过原点的直线的代价 442

14.2.2 所有线性函数的空间 443

14.2.3 练习 445

14.3 使用梯度下降法寻找拟合线 445

14.3.1 缩放数据 445

14.3.2 找到并绘制拟合线 446

14.3.3 练习 447

14.4 非线性函数拟合 448

14.4.1 理解指数函数的行为 448

14.4.2 寻找拟合的指数函数 451

14.5 小结 453

第 15章 使用logistic回归对数据分类 455

15.1 用真实数据测试分类函数 456

15.1.1 加载汽车数据 457

15.1.2 测试分类函数 458

15.1.3 练习 458

15.2 绘制决策边界 460

15.2.1 绘制汽车的向量空间 460

15.2.2 绘制更好的决策边界 461

15.2.3 实现分类函数 462

15.2.4 练习 463

15.3 将分类问题构造为回归问题 464

15.3.1 缩放原始汽车数据 464

15.3.2 衡量汽车的“宝马性” 465

15.3.3 sigmoid函数 467

15.3.4 将sigmoid函数与其他函数组合 468

15.3.5 练习 470

15.4 探索可能的logistic函数 471

15.4.1 参数化logistic函数 472

15.4.2 衡量logistic函数的拟合质量 472

15.4.3 测试不同的logistic函数 474

15.4.4 练习 475

15.5 寻找logistic函数 477

15.5.1 三维中的梯度下降法 477

15.5.2 使用梯度下降法寻找拟合 478

15.5.3 测试和理解logistic分类器 479

15.5.4 练习 481

15.6 小结 483

第 16章 训练神经网络 484

16.1 用神经网络对数据进行分类 485

16.2 手写数字图像分类 486

16.2.1 构建64维图像向量 487

16.2.2 构建随机数字分类器 488

16.2.3 测试数字分类器的表现 489

16.2.4 练习 490

16.3 设计神经网络 491

16.3.1 组织神经元和连接 492

16.3.2 神经网络数据流 492

16.3.3 计算激活值 495

16.3.4 用矩阵表示法计算激活值 498

16.4 用Python构建神经网络 499

16.4.1 用Python实现MLP类 500

16.4.2 评估MLP 502

16.4.3 测试MLP的分类效果 503

16.4.4 练习 504

16.5 使用梯度下降法训练神经网络 504

16.5.1 将训练构造为小化问题 505

16.5.3 使用scikit-learn自动训练 507

16.6 使用反向传播计算梯度 509

16.6.1 根据后一层的权重计算代价 509

16.6.2 利用链式法则计算后一层权重的偏导数 510

16.6.3 练习 512

16.7 小结 513

附录A 准备Python(图灵社区下载)

附录B Python技巧和窍门(图灵社区下载)

附录C 使用OpenGL和PyGame加载和渲染三维模型(图灵社区下载)

附录D 数学符号参考(图灵社区下载)

极简世界神话

人类文明伊始,我们的祖先就对世间万物给出了自己的解释。于是,各个文化中托生出属于自己的神话故事。他们用这些故事解释天空、大地的形成,为人们的道德树立标准,为帝王的尊贵背书。这是人类最早的“科学”。

这本书讲述了历史上重要文明或文化中流传下来的神话故事,包括埃及神话、希腊神话、罗马神话、中国神话、北欧神话等。你会看到为何很多文化中都会出现“全视之眼”,比如《指环王》中的索伦之眼,基督教中的上帝之眼;你会了解为什么玛雅文化会预言2012年12月21日为世界末日;你还会知道为什么艺术家都喜欢把能给自己带来灵感的人称为“缪斯女神”。

读神话,也是读文化,读历史……

极简哲学史

在开始这段哲学之旅前,让我们来聊聊“桌子”吧。

没错,就是我们生活中再熟悉不过的桌子。按照哲学家柏拉图的看法,世界上有三张桌子:一张是画家画的桌子,一张现实中的桌子,还有一张是作为桌子的概念的桌子。

在柏拉图眼中,画家所画的桌子是对现实中桌子的摹仿,最不可靠,现实中的桌子无法会破损,也无法永存,只有桌子的概念,才是真正真实的存在。但是,经验主义者不会同意这个观点,在他们眼中,只有现实存在、能被我们感觉到的具体的桌子才是实在的。而海德格尔会说,这两种看法我都不同意。

你看,从一张桌子出发,我们几乎可以问出所有的哲学问题来,也可以看到各种哲学流派的不同思考。

听上去高深莫测的哲学,是通过一代又一代哲学家不断地追问和求索展开的。真正的哲学问题没有终极答案,也永远不会过时,永远是自由而敞开的。哲学王国充满了对话乃至争论,哲学家们的思想碰撞不仅跨域空间,更是跨越文明与时间的,摇曳着独属爱智者的魅力之光。

在这本小书里,你会看到两千多年来的哲学家们的思想结晶。作者以简洁晓畅的语言,带我们走近一个又一个哲学史上闪闪发光的名字,见证他们的故事,聆听回响在历史长河中的智慧之声。

极简地理学

本书是“极简通识系列”中的一本,这是一套从不同角度认识世界的普及读本。每本都讲述了本学科中最重要的发现或成就,是了解学科的速读口袋书。

内容浅显易读,绝佳的学科入门读物。

特邀著名科普作家马志飞审校并作序推荐。

这本书全面而详细地介绍了地理学的入门知识。全书为自然与社会两大主题,自然部分包括河流、海岸、地壳板块、气候和天气等分支,而社会部分则探讨了人口、城市、工业、经济等话题。你会了解天气和气候是如何形成的;你会认识到城市化将带来怎样的影响;你更能学会把缠绕在复杂问题四周的线索梳理整合,使重点清晰。

这里不仅有知识,还包含着一种独特而宝贵的思维方式,非常适合学生及对地理感兴趣的读者。


极简天文学

作为一本天文学科普读物,这是献给每一颗好奇心的一场星际之旅、时空之旅。

从我们仰头就可以看到的太阳、星星与月亮,到更远的星系乃至宇宙边缘,这段旅程将覆盖930亿光年的空间,横跨近140亿年的时间。

从熟悉的太阳、月亮讲起,直到恒星、星系,再到黑洞、暗物质、大爆炸理论……作者精心编排了一条富有趣味的路线,带我们领略到那些我们好奇的关于宇宙的一切,同时体验一段人类探索星空和宇宙奥秘的“浓缩版”认知历程。

本书是“极简通识系列”中的一本,这是一套从不同角度认识世界的普及读本。每本都讲述了本学科中最重要的发现或成就,是了解学科的速读口袋书。

内容浅显易读,绝佳的学科入门读物。

特邀著名科普作家马志飞审校并作序推荐。

这本书全面而详细地介绍了地理学的入门知识。全书为自然与社会两大主题,自然部分包括河流、海岸、地壳板块、气候和天气等分支,而社会部分则探讨了人口、城市、工业、经济等话题。你会了解天气和气候是如何形成的;你会认识到城市化将带来怎样的影响;你更能学会把缠绕在复杂问题四周的线索梳理整合,使重点清晰。

这里不仅有知识,还包含着一种独特而宝贵的思维方式,非常适合学生及对地理感兴趣的读者。

极简20世纪历史

作为一本天文学科普读物,这是献给每一颗好奇心的一场星际之旅、时空之旅。

从我们仰头就可以看到的太阳、星星与月亮,到更远的星系乃至宇宙边缘,这段旅程将覆盖930亿光年的空间,横跨近140亿年的时间。

从熟悉的太阳、月亮讲起,直到恒星、星系,再到黑洞、暗物质、大爆炸理论……作者精心编排了一条富有趣味的路线,带我们领略到那些我们好奇的关于宇宙的一切,同时体验一段人类探索星空和宇宙奥秘的“浓缩版”认知历程。



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

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

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


《用Python学数学》

作者:[美]彼得·法雷尔(Peter Farrell) 译者:严开

1.用Python体验“全新”的数学不为解题,不记公式,彻底摆脱枯燥——纯粹好玩,自由发挥想象,自己动手制作趣味数学 

2.用Python让数学活起来看得见动起来充满立体感的“活”数学,像魔法一样解决常见数学问题 

3.涵盖中学数学重要主题,如代数学、几何学、三角学和微积分 

4.各种让人欲罢不能的案例,编程与数学强强联合本书以趣味探险路线展示案例,让你真正领略数学的实用性与编程的趣味性 

5.Python 3案例,充分展示Python特色与Python可视化的强大

ChatGPT 、大模型系列研究报告(50+ 个 PDF) 
108页PDF小册子:搭建机器学习开发环境及Python基础 
116页PDF小册子:机器学习中的概率论、统计学、线性代数 
《全网最全 Python、机器学习、AI、LLM 速查表(100 余张)》