![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=1739086964-O0sELqD7ttYHXVko1z2BPj6qtnTl20x0-0-6d13bf2d772f91a5282694f5f4e7086a)
安装完成后,我们来查看SciPy版本,代码如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-065-2.jpg?sign=1739086964-aTTU8enxezKIihqYTsbEw793DQOq5dLm-0-718e695569f3e46b63d73da3919badb4)
SciPy被组织覆盖成不同科学计算领域的子包,其模块功能如表2-6所示。
表2-6 SciPy模块功能
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-065-3.jpg?sign=1739086964-e851ltSIPYXCr6nxjmpckuGOfwVO7tSQ-0-dea6de0b7fa0e34e8546d2420d6109bc)
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=1739086964-wNDvvQeP8XWKkkPIR9Nd9n8r2NGTBDYw-0-4af165b83a7e89ad375aee31607db2d7)
下面通过例子演示利用SciPy求解积分问题。
【例2-14】 利用quad()计算定积分。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-066-3.jpg?sign=1739086964-tWlgebf29Sgeh0GTB9fibU7DMj1Sndof-0-944da5d4899d0d85a95f3bd2c51aac04)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-066-4.jpg?sign=1739086964-AN2owC0gphmO1hCyq7bU12cklPM0nCBa-0-f70787efd1b62cbad13658e7648e4e0c)
四元函数返回两个值,其中第一个数值是积分值,第二个数值是积分值绝对误差的估计值。
注意:由于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=1739086964-J2nwFdrfsIxU7bsfpc0gCrQ9jYHcCvb0-0-0bee9d13748513fa5d9c1b719f8f9a12)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-067-2.jpg?sign=1739086964-gnJIbFUQ9hnIVTgxGjttnFYTf3gmrcup-0-f5a624a627660a59b68b6078f8907f76)
2. 插值
插值是在直线或曲线上的两点之间找到值的过程。这种插值工具不仅适用于统计学,而且在科学、商业或需要预测两个现有数据点内的值时也很有用。
在SciPy中可通过interp1d()来完成数据的插值,其语法格式为:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-067-3.jpg?sign=1739086964-Nl1UvZW0MDdGzikbQ0CQSnwEvUD8eNXJ-0-08e7a390e2d710f95a54b6ac55692904)
用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=1739086964-f5lnnX65OdheU96yaAYcDurhkQVxRpL3-0-a46c3dcf61acc3e14ca17c4280deb2c8)
运行程序,效果如图2-6所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-068-1.jpg?sign=1739086964-iUx9gL139OjE5SoI4qiVRrLJhOvYDiAy-0-c8497b496742949c739dde1602534300)
图2-6 插值效果
3. 峰度
峰度(Kurtosis)是指次数分布曲线顶峰的尖平程度,是次数分布的重要特征。在统计分析上,常以正态分布曲线为标准,观察比较某一次数分布曲线的顶端或平顶及尖平程度的大小。
峰度的测定,一般是采用统计动差方法,即以4阶中心动差V4为测定依据,将V4除以其标准差的4次方σ4,以消除单位量纲的影响,便于不同次数分布曲线的峰度比较,从而得到以无名数表示的相对数,即峰度的测定值(β)。计算公式为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-068-2.jpg?sign=1739086964-yHXFGEgvf804b9ABmm0DSmDjkbSz1bIG-0-28ae2187d75938ff3edb9f14ce235b4e)
在SciPy中,通过stats.kurtosis()计算峰度。
【例2-17】 计算一随机数的峰度。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-068-3.jpg?sign=1739086964-gZilDDyVetCX4tiYwY7v4A7IQ8Wvc6rt-0-75efaf11da91dbceaa8f315bf08b11e9)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-069-1.jpg?sign=1739086964-5RQUzSb8Ir7hHVwzpyVxDTtmDEj5B4tt-0-6e8100db5507b00b6a9cf75dbfbfcb45)
运行程序,输出如下,效果如图2-7所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-069-2.jpg?sign=1739086964-no5dqXOO9jIMjHNWJbzYeqdi0lDHQceN-0-9d5bd101b63c9186e67023a1501b9d9c)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-069-3.jpg?sign=1739086964-u3ADG5y6q8Apm3S5m3kb4slq870XkqAX-0-4722d6040e418954d1403cf9fc5dec1b)
图2-7 柱状图表示峰度效果
4. 最小二乘拟合
假设有一组实验数据,它们之间的函数关系为
,通过这些已知信息,需要确定函数中的一些参数项。例如,如果f是一个线性函数
,那么参数k和b就是我们需要确定的值。如果将这些参数用p表示,那么我们要找到一组p值,使得如下公式中的S函数最小:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-070-2.jpg?sign=1739086964-LLn9XMMCdhRNt2LDFyww5gRlnVnTdOgG-0-88a3da07191e006dff26971ae80be346)
这种算法被称为最小二乘拟合(Least-square Fitting)。
在SciPy中的子函数库optimize已经提供了实现最小二乘拟合算法的函数leastsq。
【例2-18】 SciPy实现最小二乘拟合。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-070-3.jpg?sign=1739086964-ca0fvBe0pb09hGIgXexcwCcpuOLergfA-0-4f9bbd42a730b2e317ca2e612167c337)
运行程序,输出如下,效果如图2-8所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-071-1.jpg?sign=1739086964-P7vbc1b0wY7q5efOF0VVGLXHuTyrmmwG-0-2c0f048f323da653fa72638f7ac0e750)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-071-2.jpg?sign=1739086964-C9sdtyW8290dXoosQkWG8YSe4n449ATP-0-a5108a6dd6bffe5bace7bf8f15b92b79)
图2-8 最小二乘拟合效果
由结果可以看出,由于正弦函数的周期性,拟合参数规律走势和真实数据实际上是一致的。
5. 图像处理
图像识别是计算机对图像进行处理、分析和理解的过程,以识别各种不同模式的目标和对象。识别过程包括图像预处理、图像分割、特征提取和判断匹配。简单地说,图像识别就是要让计算机像人一样读懂图片的内容。借助图像识别技术,我们不仅可以通过图像搜索更快地获取信息,还可以产生一种新的与外部世界交互的方式,甚至会让外部世界更加智能地运行。
SciPy可实现对图像的基本操作,如裁剪、翻转、旋转、图像滤镜等,使用整个NumPy把图像处理成数组,如图2-9所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-071-3.jpg?sign=1739086964-nMckAqN7c0jNZ3hspeoMZxnWofo1HNMV-0-e687d9604ec0fbe4d848077174e015f2)
图2-9 图像处理成数组
【例2-19】 利用SciPy实现图像处理。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-071-4.jpg?sign=1739086964-T6tfBoR1CTdP3VSkMBriR1UfpNVL4U8J-0-a55feaf3bb0723fc853096cf2af17944)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-072-1.jpg?sign=1739086964-H748XT37bakI8Kkmw8noKV8NJXDeuJUy-0-a611ff9183386f377fc0423deefbf761)
运行程序,图像处理效果如图2-10所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-072-2.jpg?sign=1739086964-QhRa80sCu0XsOYv1Ew2Iszd99AuhUHQa-0-2fb3a4077d35315f0629437bfab6b8f4)
图2-10 图像处理效果