前一阵子有人和我吐槽过matlab内置的几个线性数据拟合工具满足不了需求,今天正好看到了一个关于使用scipy进行非线性回归的工具使用方法,写下来备忘。

Theory

Given pairs:{(ti,yi),i=1,...,n}\{(t_i,y_i), i=1,...,n\}{(ti​,yi​),i=1,...,n} estimate parameters x defining a nonlinear function ϕ(t;x)\phi(t;x)ϕ(t;x) estimate parameters xxx defining a nonlinear function phi(t;x)phi(t;x)phi(t;x), assuming the models:
yi=ϕ(ti;x)+ϵiy_i = \phi(t_i;x) + \epsilon_i yi​=ϕ(ti​;x)+ϵi​
where ϵi\epsilon_iϵi​ is the measurement errors. Then use the least-square estimation to search xxx as the solution of the optimization problem:
12∑i=1n(ϕ(ti;x)−yi)2→min(x)\frac{1}{2}\sum_{i = 1}^{n}(\phi(t_i;x)-y_i)^2 \rightarrow min(x) 21​i=1∑n​(ϕ(ti​;x)−yi​)2→min(x)
Then, we introduce a sublinear function ρ(z)\rho(z)ρ(z) and formulate a new least-square like optimization problem:
12∑i=1nρ((ϕ(ti;x)−yi)2)→min(x)\frac{1}{2}\sum_{i = 1}^{n}\rho((\phi(t_i;x)-y_i)^2) \rightarrow min(x) 21​i=1∑n​ρ((ϕ(ti​;x)−yi​)2)→min(x)

  1. Standard least-square method (linear) ρ(z)=z\rho(z) = zρ(z)=z.
  2. Huber loss:ρ(z)=z(z<=1)z(z>1)\rho(z) = z (z<=1) \sqrt{z} (z>1)ρ(z)=z(z<=1)z​(z>1).
  3. Smooth approximation to absolute value loss:ρ(z)=2(1+z−1)\rho(z) = 2(\sqrt{1+z}-1)ρ(z)=2(1+z​−1).
  4. Cauchy loss: ρ(z)=ln(1+z)\rho(z) = ln(1+z)ρ(z)=ln(1+z)
  5. Loss by arctan:ρ(z)=arctan(z)\rho(z) = arctan(z)ρ(z)=arctan(z)

Code

首先生成一些数据:
f(t;A,σ,ω)=Ae−σtsin⁡(ωt)f(t; A, \sigma, \omega) = A e^{-\sigma t} \sin (\omega t)f(t;A,σ,ω)=Ae−σtsin(ωt)

def generate_data(t, A, sigma, omega, noise=0, n_outliers=0, random_state=0):y = A * np.exp(-sigma * t) * np.sin(omega * t)rnd = np.random.RandomState(random_state)error = noise * rnd.randn(t.size)outliers = rnd.randint(0, t.size, n_outliers)error[outliers] *= 35return y + error
########model parameters
A = 2
sigma = 0.1
omega = 0.1 * 2 * np.pi
x_true = np.array([A, sigma, omega])
noise = 0.1
t_min = 0
t_max = 30
t_train = np.linspace(t_min, t_max, 30)
y_train = generate_data(t_train, A, sigma, omega, noise=noise, n_outliers=4)

定义残差

def fun(x, t, y):return x[0] * np.exp(-x[1] * t) * np.sin(x[2] * t) - y

开始进行回归:

x0 = np.ones(3)
#Run standard least squares:
from scipy.optimize import least_squares
res_lsq = least_squares(fun, x0, args=(t_train, y_train))
#Run robust least squares with loss='soft_l1', set f_scale to 0.1 which means that inlier residuals are approximately lower than 0.1.
res_robust = least_squares(fun, x0, loss='soft_l1', f_scale=0.1, args=(t_train, y_train))
#post
t_test = np.linspace(t_min, t_max, 300)
y_test = generate_data(t_test, A, sigma, omega)
y_lsq = generate_data(t_test, *res_lsq.x)
y_robust = generate_data(t_test, *res_robust.x)plt.plot(t_train, y_train, 'o', label='data')
plt.plot(t_test, y_test, label='true')
plt.plot(t_test, y_lsq, label='lsq')
plt.plot(t_test, y_robust, label='robust lsq')
plt.xlabel('$t$')
plt.ylabel('$y$')
plt.legend();


可以看到非线性回归的效果要好于标准最小二乘法

python的几种非线性回归相关推荐

  1. python中内置的四种数值类型为_浅谈python语言四种数值类型

    Python语言支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下.希望对 ...

  2. python属于哪种类型的语言_Python是什么类型的编程语言,有什么特性

    由于近几年人工智能的不断发展,Python也跟着火了,因为Python是深度学习技术的主流应用编程语言.同时它的应用场景很多,被称为"胶水语言".下面给大家科普一下Python这门 ...

  3. Python的 5 种高级用法,效率提升没毛病!

    (给视学算法加星标,提升Python技能) 转自:机器之心(ID:almosthuman2014) 任何编程语言的高级特征通常都是通过大量的使用经验才发现的.比如你在编写一个复杂的项目,并在 stac ...

  4. python是一种面向对象、直译式的脚本编程语言_什么是python编程语言

    编程语言是一组用来定义计算机程序的语法规则:它是一种被标准化的交流技巧,用来向计算机发出指令.Python就是一种编程语言,一种面向对象的动态类型语言.一种用处广泛的解释型脚本语言.下面简单介绍一下p ...

  5. python是高级动态编程语言-python是一种跨平台、开源、免费的高级动态编程语言,对么...

    python是一种跨平台.开源.免费的高级动态编程语言,对.python具有简单.易学.速度快.免费.开源.可移植性.可扩展性.丰富的库等优点.python语言极其容易上手,它是一种代表简单主义思想的 ...

  6. python编程语言是什么-Python是一种什么样的编程语言?解释?编译?汇编?机械?...

    作为一名技术专家和软件工程师,新技术和语言地持续探索必不可少,笔者将从现在带大家开启"Python"的世界.如果你刚好从事面向对象开发,那么不妨给Python一个机会.在循序渐进地 ...

  7. python是动态编程语言吗-python是一种跨平台、开源、免费的高级动态编程语言,对么...

    python是一种跨平台.开源.免费的高级动态编程语言,对.python具有简单.易学.速度快.免费.开源.可移植性.可扩展性.丰富的库等优点.python语言极其容易上手,它是一种代表简单主义思想的 ...

  8. python是一种语言吗-Python是一种什么样的编程语言?解释?编译?汇编?机械?...

    作为一名技术专家和软件工程师,新技术和语言地持续探索必不可少,笔者将从现在带大家开启"Python"的世界.如果你刚好从事面向对象开发,那么不妨给Python一个机会.在循序渐进地 ...

  9. 已知x=python是一种非常好的编程语言-为什么用Python,高级的Python是一种高级编程语言...

    Python特性 如果有人问我Python最大的特点是什么,我会毫不犹豫地告诉他:它简单易学,功能强大.作为一个纯自由软件,Python有许多优点: 很简单.基于"优雅".&quo ...

最新文章

  1. 2020考研 管理类联考综合能力-写作
  2. Eclipse高效率开发技巧
  3. 变量作用域函数作用域
  4. HDOJ1216 Assistance Required 打表
  5. datetime类型保存的时间比实际时间少8小时
  6. Veeam ONE v10.0.2.1094 安装教程+许可证
  7. U盘安装服务器2008系统蓝屏,U盘安装系统造成蓝屏如何解决
  8. BZOJ1119[POI2009]SLO BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序
  9. 连接虚机中的mysql服务
  10. 微软最有价值专家(MVP)四连任
  11. 【数据结构 严蔚敏版】 顺序表基本操作
  12. netty面试题及答案
  13. 中国海洋科技发展迅速 海洋重器世界领先
  14. 迁移UBuntu 16.04到全新硬盘
  15. python南宁培训
  16. 机器学习实战|决策树
  17. Fildder拦截请求并修改请求参数
  18. java设置打印机默认纸张_java 打印设置打印A4 A5纸
  19. 一种可以复制钟表零件的石膏模具
  20. 华硕 N53S 拆机换屏

热门文章

  1. Rancher简介和部署
  2. 假期之不务正业—— Qt+FFmpeg+百度api进行视频的语音识别
  3. 使用wcf编写坐标字符串生成shapefile文件,在iis发布供前端调用
  4. 由IRR看超越方程求解
  5. 心流体验:与挑战颉颃的乐趣
  6. Windows重装电脑系统教程(制作启动U盘+重装系统)建议收藏
  7. vue项目使用LODOP打印小票功能
  8. 树莓派控制超声波传感器
  9. props的动态传值 以及 v-for列表渲染
  10. 如何从后面截取字符串 String.slice()