碰撞与相交 碰撞检测这个词通常有两种含义,一种是物理意义上的碰撞检测,另一种是数学意义上的碰撞检测。本章讨论的是纯数学的碰撞检测,即判断物体之间是否相交(或包含、重合)、计算交点、预测相交时刻等。“物理引擎”则是在碰撞检测的基础上又增加了“物理”因素,模拟力与力之间的相互作用,这个内容将在下一章讨论。 显而易见,数学碰撞检测比物理碰撞检测的速度要快,而且消耗的内存也更少,因为压根就不用考虑质量、能
虽然我们已经在使用部分 Python 面向对象的特性,前两个章节中的程序并不是真正面向对象的, 因为它们没有呈现出程序员自定义类型与对其进行操作的函数(functions)之间的关系。 下一步,我们将会把这些函数转换成明显突出这一关系的方法(methods)。 本章代码可以从http://thinkpython2.com/code/Time2.py 获取, 练习题的答案位于http://think
目前你已经知道如何使用函数来组织你的代码,同时用内置的类型来管理数据。 下一步我们将学习“面向对象编程”,即使用 程序员定义的类来组织代码和数据。 面向对象编程是一个很大的话题,讲完需要一些章节。 本章的示例代码可以在http://thinkpython2.com/code/Point1.py 获取; 练习题的答案可以在http://thinkpython2.com/code/Point1_sol
麦卡锡的非确定运算符amb几乎和Lisp一样古老,尽管现在它已经从Lisp中消失了。amb接受一个或多个表达式,并在它们中进行一次“非确定”(或者叫“模糊”)选择,这个选择会让程序趋向于有意义。现在我们来探索一下Scheme内置的amb过程,该过程会对模糊的选项进行深度优先选择,并使用Scheme的控制操作符call/cc来回溯其他的选项。结果是一个优雅的回溯机制,该机制可用于在Scheme中对问
类是描述了一组有共同行为的对象。由类描述的对象称为类的一个实例。类指定了其实例拥有的属性(原文为slot卡槽)的名称,而这些属性的值由实例自身来进行填充。类同样也指定了可以应用于其实例的方法(method)。属性值可以是任何形式,但方法的值必须是过程。 类具有继承性。因此,一个类可以是另一个类的子类,我们称另一个类为它的父类。一个子类不仅有它自己“直接的”属性和方法,也会继承它的父类的所有属性和方
一个有用的Scheme程序经常需要与底层操作系统进行交互。 11.1 检查和删除文件 file-exists?会检查它的参数字符串是否是一个文件。delete-file接受一个文件名字符串作为参数并删除相应的文件。这些程序并不是Scheme标准的一部分,但是在大多数Scheme实现中都能找到它们。用这些过程操作目录(而不是文件)并不是很可靠。(用它们操作目录的结果与具体的Scheme实现有关。)
在本章里,我们将使用 Lisp 来自己实现面向对象语言。这样子的程序称为嵌入式语言 (embedded language)。嵌入一个面向对象语言到 Lisp 里是一个绝佳的例子。同時作为一个 Lisp 的典型用途,並演示了面向对象的抽象是如何多自然地在 Lisp 基本的抽象上构建出来。 17.1 继承 (Inheritance) 11.10 小节解释过通用函数与消息传递的差别。 在消息传递模型里,
接下来三章提供了大量的 Lisp 程序例子。选择这些例子来说明那些较长的程序所采取的形式,和 Lisp 所擅长解决的问题类型。 在这一章中我们将要写一个基于一组 if-then 规则的推论程序。这是一个经典的例子 —— 不仅在于其经常出现在教科书上,还因为它反映了 Lisp 作为一个“符号计算”语言的本意。这个例子散发着很多早期 Lisp 程序的气息。 15.1 目标 (The Aim) 在这个程
你可以认为OCaml分成了两部分:一个是核心语言,聚焦于值和类型,一个是模块语言,聚焦于模块和模块签名。这些子语言是分层的,模块中可以包含类型和值,但是普通的值不能包含模块或模块类型。这意味着你不能定义一个值为模块的变量,或一个接收一个模块作为参数的函数。 围绕这种层次,OCaml以 第一类模块的形式提供一种方法。第一类模块是普通的值,可以从普通模块创建,也可以转回普通模块。 第一类模块是一种复杂
我们经常收集许多可能与监督预测任务相关的特征,但我们不知道它们中的哪一个实际上是预测性的。 为了提高可解释性,有时还提高泛化表现,我们可以使用自动特征选择来选择原始特征的子集。 有几种可用的特征选择方法,我们将按照复杂性的升序来解释。 对于给定的监督模型,最佳特征选择策略是尝试每个可能的特征子集,并使用该子集评估泛化表现。 但是,特征子集是指数级,因此这种详尽的搜索通常是不可行的。 下面讨论的策略
线性模型在可用的数据很少时非常有用,或者对于文本分类中的非常大的特征空间很有用。 此外,它们是正则化的良好研究案例。 用于回归的线性模型 用于回归的所有线性模型学习系数参数coef_和偏移intercept_,来使用线性特征组合做出预测: y_pred = x_test[0] * coef_[0] + ... + x_test[n_features-1] * coef_[n_features-1]
在本节中,我们将研究如何链接不同的估计器。 简单示例:估计器之前的特征提取和选择 特征提取:向量化器 对于某些类型的数据,例如文本数据,必须应用特征提取步骤将其转换为数值特征。 为了说明,我们加载我们之前使用的 SMS 垃圾邮件数据集。 import os with open(os.path.join("datasets", "smsspam", "SMSSpamCollection")) as
在许多任务中,例如在经典的垃圾邮件检测中,你的输入数据是文本。 长度变化的自由文本与我们需要使用 scikit-learn 来做机器学习所需的,长度固定的数值表示相差甚远。 但是,有一种简单有效的方法,使用所谓的词袋模型将文本数据转换为数字表示,该模型提供了与 scikit-learn 中的机器学习算法兼容的数据结构。 假设数据集中的每个样本都表示为一个字符串,可以只是句子,电子邮件或整篇新闻文章
问题内容: 我被要求测试第三方提供的图书馆。该库已知可精确到 n个 有效数字。任何不太重要的错误都可以安全地忽略。我想编写一个函数来帮助我比较结果: 此函数的目的是确定两个浮点数(a和b)是否近似相等。如果a == b(完全匹配),或者当a和b具有十进制值的 sigfig 有效数字舍 入时, 该函数将返回True 。 有人可以建议一个好的实施方案吗?我写了一个迷你单元测试。除非您在测试中看到错误,
例如,使用 IEEE-754 32 位二进制浮点数,让我们表示 。它不能完全完成,但产生最接近的值。您可能希望以十进制写入值,并让编译器将十进制文本转换为二进制浮点数。 您可以看到,8 个(有效)十进制数字足以表示尽可能正确的值(最接近实际值)。 我用π和e(自然对数的基础)进行了测试,两者都需要8位小数才能正确测试。 但是,似乎需要9位数字。 https://godbolt.org/z/W5vE