我的首个python的合集啊~~ 完全给自己看啊 不喜喷了也不里你
一、一维插值
对现有数据进行拟合或插值是数学分析中常见的方式。
- 通过分析现有数据,得到一个连续的函数(也就是曲线);或者更密集的离散方程与已知数据互相吻合,这个过程叫做拟合。
- 通过已知的、离散的数据点,在范围内推求新数据点的过程或方法则叫做插值
简单来说,插值与拟合最大的区别就是,插值所获得的曲线一定要通过数据点,而拟合需要的是总体上最接近的结果。
所以说要实现插值算法,我们的目标是通过给定的x值和y值,创建一个函数y=f(x),可以在该函数中插入想要的任何值a并获得相应的值y=f(a)。
例如给定x=[0:5:5],y=x^2,在python中画出散点图为
假如我们想获取x=2的值,可以看到图中没有对应的数据点,因此无法直接获得,所以需要用到插值,而最简单的插值方式为线性插值,就是通过直线连接数据点。
这样通过scipy.interpolate.interp1d()的函数即可进行一维插值。
通过上述代码使用线性插值,运行代码后求出x=2时y的值为4.375,由于线性插值是通过相邻两点的连线来进行插值,无法考虑到其他数据点,我们都知道x=2时y=x^2的值为4,这里的插值结果明显有问题。
于是使用2次多项式的方式进行插值,可以得到y(2)=4
上述案例的数据较为简单,我们可以轻易地判断插值后的数据是否准确,但是对于复杂的数据,选择合适的插值方式就变得十分重要。
二、二维插值
一维插值就是一维插值就是给出y=f(x)上的点(x1,y1),(x2,y2),…,(xn,yn),由此求出y=f(x)在点xa处的值ya的值。
在此基础上进行扩展,二维插值就是给出z=f(x,y)上的点(x1,y1,z1),…,(xn,yn,zn),由此求出在(xa,ya)处求出za的值。
使用Scipy中的interpolate.interp2d函数可以实现二维插值。
定义数据点坐标的数组。如果这些点位于规则网格上,x 可以指定列坐标,y 可以指定行坐标,例如:
否则,x 和 y 必须指定每个点的完整坐标,例如:
如果 x 和 y 是多维的数组,则会在使用前将它们展平。
我们使用以下代码绘图进行示例:
可以通过图片对比各插值方式的区别。
三、几种一维插值方式对比
使用python的scipy库可进行一维插值,并且对比了线性(linear)和二次多项式(quadratic)两种方法,这里主要来介绍一下scipy.interpolate.interp1d函数的其他插值选项。
首先,interp1d函数由以下部分所组成
- x为一维数组
- y可以是N维数组,但y 沿插值轴的长度必须等于 x 的长度
- kind表示插值的方式(默认为‘linear’),包括 ‘linear’, ‘nearest’, ‘nearest-up’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘previous’, or ‘next’.
“zero”、“linear”、“quadratic”和“cubic”是指零、一、二或三阶的样条插值;
‘previous’ 和 ‘next’ 只是返回该点的上一个或下一个值
'nearest-up' 和 'nearest' 在对半整数(例如 0.5、1.5)进行插值时有所不同,“nearest-up”向上取整,“nearest”向下取整。 - axis用于指定沿其进行插值的 y 轴。默认为最后一个y轴。
- copy(布尔类型)如果为 True,则该类函数创建 x 和 y 的内部副本。如果为 False,则使用对 x 和 y 的引用。默认是True。
- bounds_error(布尔类型)如果为 True,则在任何时候尝试对 x 范围之外的值进行插值时都会引发 ValueError(需要外插)。如果为 False,则为越界值分配 fill_value。默认情况下会报错,除非fill_value="extrapolate"。
- fill_value,如果是 ndarray(或浮点数),则此值将用于填充数据范围之外的请求点。如果未提供,则默认值为 NaN。类数组必须正确广播到非插值轴的尺寸。如果是双元素元组,则第一个元素用作 x_new < x[0] 的填充值,第二个元素用于 x_new > x[-1]。任何不是 2 元素元组的东西(例如,列表或 ndarray,无论形状如何)都被视为一个类似数组的参数,用于两个边界,如下所示,上面 = fill_value,fill_value。使用二元素元组或 ndarray 需要 bounds_error=False。
我们使用下述代码绘图进行对比
可以通过上图对比各插值方式与原函数(exact)的曲线区别。
四、曲线拟合
在处理数据时经常需要进行曲线拟合,在拟合过程中我们采用了插值的思想。
对于给定的数据x=[...]和y=[...],插值的目的是找到参数β的最优集合,使函数
能够与原数据最为相似。
- 其中一种方法是通过调整β使:
- 能够最小化,这种方法称之为最小二乘法。
- 如果yi的值有相应的误差,那么使下式最小化
- 称之为β的最大似然估计。在给定xi与yi的情况下,这样得到的β值最为准确。
我们给定以下随机数据点并绘制散点图:
我们使用下式的模型进行拟合:
我们需要求解出符合上述数据点的最优的a、b、c的值,需要在python中:
(1)需要定义模型方程;
(2)使用scipy库中的curve_fit函数,使用该函数时需要定义一个β的初始值,对于一些复杂的模型,初始值决定了函数能否顺利运算。
下面定义函数并进行拟合
其中:
popt为我们定义的函数fitfun的最佳参数。
pcov为协方差矩阵,用于给定误差。
接下来我们就可以绘制出拟合好的曲线