Python曲线拟合
curve fitting
最近接触了曲线拟合(curve fitting),在此简单整理一波Python的实现方式
依稀记得高中数学课本有提到这个,$x$、$y$ 二维坐标。大致是两种方式:一种是看着像啥样或基于先验知识给出常见函数的关系式,通过数据拟合得到相应的系数;第二种是直接从数据出发,采用“基函数”拟合,和泰勒展开、级数有关系,函数越复杂拟合的越完美,但泛化能力就有待考究了,即复杂度越高越容易出现过拟合
「插播」这两种又让我想起了统计里的“参数估计”和“非参数估计”
备注:以下分类名称仅从个人理解出发
自定义函数拟合
“自定义函数拟合”即我们可以自行编写定义各种函数(如幂函数、指数函数等)关系,基于此对现有数据进行拟合。往往需要一些领域内的知识🤔
具体实现可参考 scipy.optimize.curve_fit
官方示例
|
|
curve_fit()
的参数方面:
-
p0
系数初始值
-
bounds
各系数的取值范围
-
method
最优化算法,’lm’, ’trf’, ‘dogbox’
MARK-log
此外还要 MARK 的一点是关于 $log$ 的问题,Python中 numpy
和 math
都可以计算对数($log$)
首先 math.log
和 numpy.log
都是以自然常数 $e$ 为底的自然对数,针对底数不同各自都有以2、10为底的函数,分别为log2()
, log10()
。其中,math.log2(x)
, math.log10(x)
计算的准确性高于 math.log(x,2)
, math.log(x,10)
但是 math.log()
支持自选底数,比如计算 $log_{12}{10}$ :math.log(10,12)
其实结合“换底公式”, 这个就等价于 math.log(10)/math.log(12)
$$
log_ab=\frac{log_ca}{log_cb}
$$
但但但但是,numpy.log
是支持数组、列表等形式的,享受 broadcasting带来的快感;而 math.log
只支持单个数字的计算,若传入数组等 array_like
则会报错:TypeError: only size-1 arrays can be converted to Python scalars
若一定要用 math.log
也是可以的: [math.log(i) for i in [1,2,3,4,5]]
基函数拟合
关于这部分,目前记录的 “基函数” 更多是多项式(polynomials)形式,numpy
提供了 sub-package: numpy.polynomial
(NumPy 1.4 版本,2009-12-28,引入的)
Name | Provides |
---|---|
Polynomial |
Power series |
Chebyshev |
Chebyshev series |
Legendre |
Legendre series |
Laguerre |
Laguerre series |
Hermite |
Hermite series |
HermiteE |
HermiteE series |
Power series(Polynomial
)就是我们常见的 $y=1+2x+3x^2$ 这种
|
|
MARK
在官方文档会看到 Polynomial
这个类前面套了好几层numpy.polynomial.polynomial.Polynomial
实则关系是 numpy.polynomial
下面有个 polynomial.py
文件,文件里有个类是 Polynomial
。同理,剩下五种多项式也是如此,chebyshev.py
有个 Chebyshev
类
在实际使用的时候可以严格遵守这种关系
|
|
Reference
- https://numpy.org/doc/stable/reference/generated/numpy.log.html
- https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html
- https://docs.python.org/3.7/library/math.html
- https://numpy.org/doc/stable/reference/routines.polynomials.html
- https://numpy.org/doc/stable/reference/routines.polynomials.package.html#module-numpy.polynomial
- https://numpy.org/doc/stable/reference/generated/numpy.polynomial.polynomial.polyfit.html#numpy.polynomial.polynomial.polyfit
- https://numpy.org/doc/stable/reference/routines.polynomials.html
- https://www.jianshu.com/p/44baeed131df