![Python人工智能](https://wfqqreader-1252317822.image.myqcloud.com/cover/801/40107801/b_40107801.jpg)
2.3 SciPy科学计算库
SciPy库在NumPy库的基础上增加了众多的数学、科学及工程计算中常用的库函数。
2.3.1 初识SciPy
SciPy库依赖NumPy库,提供了便捷且快速的n维数组操作。SciPy库与NumPy数组一起工作,并提供了许多友好和高效的处理方法。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵、常微分方差的求解等,功能十分强大。
由于SciPy也是Python的第三方库,需要另外安装:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-065-1.jpg?sign=1739288549-6ZtW6b13hlx4gXkHfDu8tqNmfni0NqH2-0-e01a3b28fc5fdf2fce86ae8d3ad18552)
安装完成后,我们来查看SciPy版本,代码如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-065-2.jpg?sign=1739288549-bWCNvdAvC0hQBMAksxr4YwIoh8YEPXWU-0-90a57bbcec9817d5b4a680b2a126746d)
SciPy被组织覆盖成不同科学计算领域的子包,其模块功能如表2-6所示。
表2-6 SciPy模块功能
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-065-3.jpg?sign=1739288549-YMLmTUxAKPwzDfjlxRsxUNnUWO9ruDmb-0-569dfa44d9c413fdfbe4436630041d67)
2.3.2 SciPy经典应用
SciPy功能强大,下面举例说明SciPy在各领域的应用,以便学习。
1. 积分
积分学不仅推动了数学的发展,而且也极大地推动了天文学、力学、物理学、化学、生物学、工程学、经济学等自然科学,以及社会科学及应用科学各个分支的发展,并在这些学科中有越来越广泛的应用。特别是计算机的出现,更有助于这些应用的不断发展。scipy.integration提供了多种积分模块,主要分为以下两类:一种是对给定的函数对象积分,如表2-7所示;另一种是对给定固定样本的函数积分。我们一般关注对数值积分的trapz函数和cumtrapz函数。trapz()使用复合梯形规则沿给定轴线进行积分,cumtrapz()使用复合梯形法则累计积分。
表2-7 积分函数(给定的函数对象)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-066-1.jpg?sign=1739288549-884nmCrqZHUz5Za6h6VCbP4tLu6pZWvh-0-335e1bdc77f2e0caed290c4ae1e34238)
下面通过例子演示利用SciPy求解积分问题。
【例2-14】 利用quad()计算定积分。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-066-3.jpg?sign=1739288549-SvMTa3nQt58ssK8RuhF4DG0xSLdhpfGb-0-c1173264dc263f23aab1c342e29a018b)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-066-4.jpg?sign=1739288549-4fnkQFNZkWcQ9YRxR3KYKuChzMfrv5Zr-0-90453f66189fae99ed12bb787aa4aca5)
四元函数返回两个值,其中第一个数值是积分值,第二个数值是积分值绝对误差的估计值。
注意:由于quad()需要函数作为第一个参数,因此不能直接将exp作为参数传递。quad函数接受正和负无穷作为限制。
【例2-15】 求解双重积分。
解析:使用lambda表达式定义函数f,g和h。请注意,即使g和h是常数,它们可能在很多情况下必须定义为函数。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-067-1.jpg?sign=1739288549-lWc0WTt33wXUNMcM88KbgCzsThpKXIPF-0-2a62bfb729cec28ef357d738e501ec64)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-067-2.jpg?sign=1739288549-eeph1FheDxuhXbS9MOmO53crSzkbpcTy-0-6d18960030a4036d96804106d0f061cd)
2. 插值
插值是在直线或曲线上的两点之间找到值的过程。这种插值工具不仅适用于统计学,而且在科学、商业或需要预测两个现有数据点内的值时也很有用。
在SciPy中可通过interp1d()来完成数据的插值,其语法格式为:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-067-3.jpg?sign=1739288549-UUPuOV2hNg3khzECVphtQpGyakTdm2Rj-0-ccb9f020a806b9aeb7890d0cae5d132c)
用x和y来逼近指定函数f:y=f(x)。interp1d()返回一个函数,调用该方法可使用插值来查找新点的值。
函数的参数含义如下。
• x:一维数组;
• y:插值函数中x对应值;
• kind:插值的类型,包含“linear”“nearest”“zero”“slinear”“quadratic”“cubic”“previous”“next”等。
【例2-16】 实现数据的插值。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-067-4.jpg?sign=1739288549-vDodhvrFCzKz2QfvjgryqU4Nf6LTkxD6-0-9d5afd96284560d4fe4a8af4527d8115)
运行程序,效果如图2-6所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-068-1.jpg?sign=1739288549-36j6hcZLnhNTQvSF7LRioVey5wQRdvG0-0-36bdd15bea9eec3c505ab0c0bb862e6c)
图2-6 插值效果
3. 峰度
峰度(Kurtosis)是指次数分布曲线顶峰的尖平程度,是次数分布的重要特征。在统计分析上,常以正态分布曲线为标准,观察比较某一次数分布曲线的顶端或平顶及尖平程度的大小。
峰度的测定,一般是采用统计动差方法,即以4阶中心动差V4为测定依据,将V4除以其标准差的4次方σ4,以消除单位量纲的影响,便于不同次数分布曲线的峰度比较,从而得到以无名数表示的相对数,即峰度的测定值(β)。计算公式为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-068-2.jpg?sign=1739288549-JhKCyCaFT1DkR2mV5zIsst3NnOzso9DH-0-d8dc94f54a0daee8f393c1649f5ccabb)
在SciPy中,通过stats.kurtosis()计算峰度。
【例2-17】 计算一随机数的峰度。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-068-3.jpg?sign=1739288549-bJGNgTKhSWZAEexMxfYQFHZgLIuI5bgw-0-eadbba763bd45d5150742c9f50a9ddaa)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-069-1.jpg?sign=1739288549-lTApxxKu659B1JeIHw6xfKvFMUtr8Thu-0-9002a853cef5f028f8894d3bec091ccc)
运行程序,输出如下,效果如图2-7所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-069-2.jpg?sign=1739288549-4t8t68NqG7yAt92SlpsQCvdvRXgYrRJO-0-2a727e6718c8a6a22a19ecb69f40ef24)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-069-3.jpg?sign=1739288549-JVHXwP4hzcBBVWvPaKmxOwQd0gCVofaH-0-f9c099a819eb4ea7ce3b8cf1e0aa5906)
图2-7 柱状图表示峰度效果
4. 最小二乘拟合
假设有一组实验数据,它们之间的函数关系为
,通过这些已知信息,需要确定函数中的一些参数项。例如,如果f是一个线性函数
,那么参数k和b就是我们需要确定的值。如果将这些参数用p表示,那么我们要找到一组p值,使得如下公式中的S函数最小:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-070-2.jpg?sign=1739288549-t2u96llha5gZQkrQsPQk6L76yL6Cxh85-0-8f59b54596e55f529d71a0c3b207fb55)
这种算法被称为最小二乘拟合(Least-square Fitting)。
在SciPy中的子函数库optimize已经提供了实现最小二乘拟合算法的函数leastsq。
【例2-18】 SciPy实现最小二乘拟合。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-070-3.jpg?sign=1739288549-cbbo0VUeaViRrVpyDcQCNiqC00Z91rGT-0-6b4ad52eb5c3cbf4a3b413aba19d8ea6)
运行程序,输出如下,效果如图2-8所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-071-1.jpg?sign=1739288549-P7p8yNtcL84DKTa80OA4mNpvydYb0NYZ-0-0cc601945b906cbc027fd7fd3403009a)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-071-2.jpg?sign=1739288549-mZvHUrEVji97qZ9PD6SDRveqp4dlskLF-0-a154a1cc24aafad00878f7296e87a792)
图2-8 最小二乘拟合效果
由结果可以看出,由于正弦函数的周期性,拟合参数规律走势和真实数据实际上是一致的。
5. 图像处理
图像识别是计算机对图像进行处理、分析和理解的过程,以识别各种不同模式的目标和对象。识别过程包括图像预处理、图像分割、特征提取和判断匹配。简单地说,图像识别就是要让计算机像人一样读懂图片的内容。借助图像识别技术,我们不仅可以通过图像搜索更快地获取信息,还可以产生一种新的与外部世界交互的方式,甚至会让外部世界更加智能地运行。
SciPy可实现对图像的基本操作,如裁剪、翻转、旋转、图像滤镜等,使用整个NumPy把图像处理成数组,如图2-9所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-071-3.jpg?sign=1739288549-M9SK0eMOUL35GMkBbmU3DwK8Hr9y9UuG-0-535043929a0974f8129717e70d9a71ed)
图2-9 图像处理成数组
【例2-19】 利用SciPy实现图像处理。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-071-4.jpg?sign=1739288549-JAifd4dw5uZdyVLCq7v7TPb8ttV6dpTi-0-050d1e6401e3885ce6d3aa76c72d33df)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-072-1.jpg?sign=1739288549-o415G4U1w7GH6stzAJ8zNthqvp2AxNjW-0-844bd12650ec4d4349a86fa246a779cf)
运行程序,图像处理效果如图2-10所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-072-2.jpg?sign=1739288549-HFhA71te2K3DBgmZdelZIjYF8T5wesSc-0-b2fbe91fd99bbed139a3814fbf46d3f2)
图2-10 图像处理效果