SciPy 插值
2021-10-13
| 2023-8-6
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
  • 插值,是在离散数据的基础上补插连续函数,使得插值函数通过全部给定的离散数据点。 插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。简单地说,插值是求过一组已知点的近似函数。
  • 拟合,是用一个连续函数(曲线)靠近给定的离散数据,使其与给定的数据相吻合。拟合也是根据一组已知点求近似函数,但不要求过已知点。
因此,插值和拟合都是根据一组已知数据点,求变化规律和特征相似的近似曲线的过程。但是插值要求近似曲线完全经过所有的给定数据点,而拟合只要求近似曲线在整体上尽可能接近数据点,并反映数据的变化规律和发展趋势。
插值可以看作是一种特殊的拟合,是要求误差函数为 0 的拟合。由于数据点通常都带有误差,误差为 0 往往意味着过度拟合,过拟合模型对于训练集以外的数据的泛化能力往往是较差的。因此在实践中,插值多用于图像处理和缺失数据处理,拟合多用于实验数据处理。
此外,还有一个常用而且容易混淆的概念: 回归。回归是研究一组随机变量与另一组随机变量之间关系的统计分析方法,包括建立数学模型并估计模型参数,并检验数学模型的可信度,也包括利用建立的模型和估计的模型参数进行预测或控制。
回归是一种数据分析方法,拟合是一种具体的数据处理方法。拟合侧重于曲线参数寻优,使曲线与数据相符;而回归侧重于研究两个或多个变量之间的关系。

一维插值方法:内插值

Scipy.interpolate 中的 interp1d类是一种基于固定数据点创建函数的方法,可以使用函数插值在给定数据定义的域内的任何位置对其进行计算。注意 interp1d 是内插法,不能外推运算(外插值)
该类定义调用,允许使用 轴值调用对象,此时应计算插值函数,并返回插值的 轴值。具体地说,interp1d 类生成已知数据点集的插值函数 ,通过调用这个插值函数,可以在已知数据之间插值,得到指定 的函数值
class scipy.interpolate.interp1d(x, y, kind=‘linear’, axis=- 1, copy=True, bounds_error=None, fill_value=nan, assume_sorted=False)
主要参数:
  • x:一维数组,给定数据点集的 值。
  • y维数组,给定数据点集的 值,数组长度必须与 相等。
  • kind:字符串或整数,可选项,指定使用的样条曲线的种类或插值方法。
    • 可选的字符串:‘linear’, ‘nearest’, ‘nearest-up’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘previous’, ‘next’;
    • ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’ 分别表示零次、一次、二次、三次样条插值;
    • ‘previous’, ‘next’ 分别表示只前点插值或后点插值;
    • ‘nearest’ 表示向下舍入, ‘nearest-up’ 表示向上舍入;
    • 默认值为 ‘linear’,即线性插值。
interp1d 允许通过参数 bounds_error、fill_value 设置外推时的边界值,但这并不是进行外推插值。
返回值:
  • 类 interp1d() 返回一个函数,其调用方法使用插值来查找新点的值。
interp1d比Matlab的interp有些优势,因为返回的是函数,不需要在事先设定需要求解的点,而是在需要使用时调用函数
 
一维插值方法比较
notion image
结果分析:
  1. 线性插值是常用的插值方法,简单地说可以理解为将相邻的数据点用线段连接,算法简单、运算速度快。一阶样条曲线插值,等效于线性插值。
  1. 最近邻点插值、前点插值、后点插值和 0阶样条插值的结果都是阶梯形状曲线,只是选点方法不同。
  1. 样条插值是重要的插值方法,用光滑曲线连接数据点。每一个样条都是用一个多项式表达的,多项式的次数就是样条曲线的阶数,决定了样条曲线的形状和性质:
      • 0 阶样条曲线,在每一区间上样条函数为常数,样条曲线呈阶梯形状;
      • 1 阶样条曲线,在每一区间上样条函数为线性函数,样条曲线呈折线段形状;
      • 2 阶样条曲线,在每一区间上样条函数为二次函数,整体一阶连续可导;依次类推。
      • 由二阶开始,插值函数不再具有局域性,改变某一节点,函数整体都会改变。
      • 2 阶和 3阶样条插值最为常用,更高阶的样条插值过于复杂,通常结果的差异并不大。图中的 2阶和 3阶样条插值结果就已经近似是重合的。
 

一维插值方法:外插值

Scipy.interpolate 中的 UnivariateSpline 类是一种基于固定数据点创建函数的方法,使用一维样条曲线拟合到给定的数据点集。interp1d不能外推运算(外插值),UnivariateSpline可以外插值
该类定义调用,允许使用 x 轴值调用对象,此时应计算样条曲线,并返回插值的 y 轴值。具体地说,UnivariateSpline 类生成已知数据点集的样条插值函数 y=spl(x),通过调用样条插值函数,可以计算指定 x 的函数值 f(x)。
class scipy.interpolate.UnivariateSpline(x, y, w=None, bbox=[None, None], k=3, s=None, ext=0, check_finite=False)
主要参数:
  • x:一维数组,数值必须递增。
  • y:一维数组,数组长度必须与 x 相等。
  • w:一维数组,正数,可选项。每个数据点的权重,默认所有点的权重相等。
  • k:整数,可选项。样条函数的阶数,1≤k≤5,默认值为 3。
  • s:实数,可选项,平滑参数:
    • s=0,数据插值,样条曲线必须通过所有数据点;
    • s>0,数据拟合,满足
    • 默认不设置 s,则 s=len(w)。
  • ext:整数或字符串,可选项。用于控制外推插值的方案:
    • ext= 0 或 “extrapolate”,返回外推值,默认值;
    • ext= 1 或 “zeros”,返回 0;
    • ext= 2 或 “raise”,抛出异常值 ValueError;
    • ext= 3 或 “const”,返回边界值。
返回值:
  • 类 UnivariateSpline() 返回一个函数,其调用方法使用插值来查找新点的值。
UnivariateSpline 可以外插值,允许通过设置参数 ext= 0 或 “extrapolate” 外推插值,但不能外推范围过大
 

s=0强制通过所有数据点的外插值

notion image
也就插值到(0,12),范围再大就不行了,毕竟插值的专长不在于预测
 

s>0:不强制通过所有点

notion image
 
 
notion image
图中绿色曲线是三次样条数据拟合的结果,蓝色曲线对拟合曲线作了进一步的平滑处理
 
 
 
 

二维插值类 interp2d

Scipy.interpolate 中的 interp2d 类是一种基于固定数据点集创建函数的二维插值方法,经常用于二维图像处理。
类 interp2d 的定义和使用方法与一维插值 interp1d 类似。该类定义调用,允许使用 值调用对象,此时计算插值函数,并返回插值的 z轴值。具体地说,interp2d 类生成已知数据点集的插值函数 ,通过调用这个插值函数,可以在已知数据之间插值,得到指定 的函数值
class scipy.interpolate.interp2d(x,y,z,kind=‘linear’,copy=True,bounds_error=False,fill_value=None))
主要参数:
  • x,y:一维数组,给定数据点集的 x,y 值。
  • z:一维数组,给定数据点集对应的函数值 z。
  • kind:字符串或整数,可选项,指定使用的样条曲线的种类或插值方法:‘linear’ 表示线性插值,‘cubic’ 表示三次插值,‘quintic’ 表示五次插值。默认值为 ‘linear’,即线性插值。
返回值:
  • 类 interp2d() 返回一个函数,其调用方法使用插值来查找新点的值。
注意:给定数据点集 有两种方式:
  1. 以一维数组 定义给定网络点集的列坐标和行坐标序列,一维数组 的长度 不一定相等,二维数组 的形状为 是数据网格点 的函数值。
  1. 以一维数组 定义给定网络点集的列坐标和行坐标序列,网络点集中每个点的坐标分别由二维数组 表示, 二维数组 是与 对应的网格中每一个数据点的函数值,
 
notion image
 
 
notion image
 
 
维插值方法比较
notion image
 
 
 

二维插值Rbf()

Rbf的优点是,排列可以无序,可以不是等距的网格
notion image
  • Scipy
  • 传染病模型Scipy 拟合
    目录