【scipy】Python调用非线性最小二乘法

这篇具有很好参考价值的文章主要介绍了【scipy】Python调用非线性最小二乘法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介与构造函数

在scipy中,非线性最小二乘法的目的是找到一组函数,使得误差函数的平方和最小,可以表示为如下公式

arg min ⁡ f i F ( x ) = 0.5 ∑ i = 0 m − 1 ρ ( f i ( x ) 2 ) , x ∈ [ L , R ] \argmin_{f_i} F(x) = 0.5\sum_{i=0}^{m-1}\rho(f_i(x)^2),\quad x\in[L,R] fiargminF(x)=0.5i=0m1ρ(fi(x)2),x[L,R]

其中 ρ \rho ρ表示损失函数,可以理解为对 f i ( x ) f_i(x) fi(x)的一次预处理。

scipy.optimize中封装了非线性最小二乘法函数least_squares,其定义为

least_squares(fun, x0, jac, bounds, method, ftol, xtol, gtol, x_scale, f_scale, loss, jac_sparsity, max_nfev, verbose, args, kwargs)

其中,funcx0为必选参数,func为待求解函数,x0为函数输入的初值,这两者无默认值,为必须输入的参数。

bound为求解区间,默认 ( − ∞ , ∞ ) (-\infty,\infty) (,)verbose为1时,会有终止输出,为2时会print更多的运算过程中的信息。此外下面几个参数用于控制误差,比较简单。

默认值 备注
ftol 1 0 − 8 10^{-8} 108 函数容忍度
xtol 1 0 − 8 10^{-8} 108 自变量容忍度
gtol 1 0 − 8 10^{-8} 108 梯度容忍度
x_scale 1.0 变量的特征尺度
f_scale 1.0 残差边际值

loss为损失函数,就是上面公式中的 ρ \rho ρ,默认为linear,可选值包括

  • linear ρ ( z ) = z \rho(z)=z ρ(z)=z,此为标准非线性最小二乘法
  • soft_l1 ρ ( z ) = 2 ( 1 + z − 1 ) \rho(z)=2(\sqrt{1 + z}-1) ρ(z)=2(1+z 1), 相当于L1损失的平滑
  • huber: 当 z ⩽ 1 z\leqslant1 z1时, ρ ( z ) = z \rho(z)=z ρ(z)=z,否则 ρ ( z ) = 2 z − 1 \rho(z)=2\sqrt{z}-1 ρ(z)=2z 1, 表现与soft_l1相似
  • cauchy ρ ( z ) = ln ⁡ ( 1 + z ) \rho(z) = \ln(1 + z) ρ(z)=ln(1+z)
  • arctan ρ ( z ) = arctan ⁡ ( z ) \rho(z) = \arctan(z) ρ(z)=arctan(z)

迭代策略

上面的公式仅给出了算法的目的,但并未暴露其细节。关于如何找到最小值,则需要确定搜索最小值的方法,method为最小值搜索的方案,共有三种选项,默认为trf

  • trf:即Trust Region Reflective,信赖域反射算法
  • dogbox:信赖域狗腿算法
  • lm:Levenberg-Marquardt算法

这三种方法都是信赖域方法的延申,信赖域的优化思想其实就是从单点的迭代变成了区间的迭代,由于本文的目的是介绍scipy中所封装好的非线性最小二乘函数,故而仅对其原理做简略的介绍。

对于优化问题 min ⁡ x ∈ R n f ( x ) \min_{x\in R^n} f(x) minxRnf(x)而言,定义当前点的邻域

Ω k = { x ∈ R n ∣ ∥ x − x k ∥ ⩽ r } \Omega_k=\{x\in R^n\big\vert \Vert x-x_k\Vert\leqslant r\} Ωk={xRn xxkr}

其中 r r r为置信半径,假设在这个邻域内,目标函数可以近似为线性或二次函数,则可通过二次模型得到区间中的极小值点 s k s_k sk。然后以这个极小值点为中心,继续优化信赖域所对应的区间。

s = x − x k s=x-x_k s=xxk, 表示步长; g k = ∇ f ( x k ) , B k ≈ ∇ 2 f ( x k ) g_k=\nabla f(x_k), B_k\approx\nabla^2 f(x_k) gk=f(xk),Bk2f(xk)分别是函数的一阶导数和黑塞矩阵的近似,则对上述问题进行Taylor展开,可以得到一个二阶的近似模型

arg min ⁡ q k ( s ) = f ( x k ) + g k T s + 1 2 s T B k s , ∥ s ∥ ⩽ r \argmin q^{k}(s)=f(x_k)+g_k^Ts+\frac{1}{2}s^TB_ks, \Vert s\Vert\leqslant r argminqk(s)=f(xk)+gkTs+21sTBks,sr

B k B_k Bk被定义为黑塞矩阵的近似,当其表示为雅可比矩阵 J k T J k J_k^TJ_k JkTJk时,所得到的迭代方案便是著名的高斯牛顿法,而LM算法在在高斯牛顿的基础上,添加了一个阻尼因子,可记作 J k T J k + μ I J_k^TJ_k+\mu I JkTJk+μI

狗腿法的鲍威尔提出的一种迭代方案,特点是新定义了下降比,即随着 s s s的不断前进,目标函数和模型函数都会发生变化,则可定义二者的变化率 r k = f ( x k ) − f ( x k + s ) q k ( 0 ) − q k ( s ) r_k=\frac{f(x_k)-f(x_k+s)}{q^k(0)-q^k(s)} rk=qk(0)qk(s)f(xk)f(xk+s),根据这个值的变化,来调整信赖域半径 r r r的值。

以上就是信赖域方法的基本原理。

雅可比矩阵

在了解了信赖域方法之后,就会明白雅可比矩阵在数值求解时的重要作用,而如何计算雅可比矩阵,则是接下来需要考虑的问题。jac参数为计算雅可比矩阵的方法,主要提供了三种方案,分别是基于两点的2-point;基于三点的3-point;以及基于复数步长的cs。一般来说,三点的精度高于两点,但速度也慢一倍。

此外,可以输入自定义函数来计算雅可比矩阵。

测试

最后,测试一下非线性最小二乘法文章来源地址https://www.toymoban.com/news/detail-699787.html

import numpy as np
from scipy.optimize import least_squares

def test(xs):
    _sum = 0.0
    for i in range(len(xs)):
        _sum = _sum + (1-np.cos((xs[i]*i)/5)*(i+1))
    return _sum

x0 = np.random.rand(5)
ret = least_squares(test, x0)
msg = f"最小值" + ", ".join([f"{x:.4f}" for x in ret.x])
msg += f"\nf(x)={ret.fun[0]:.4f}"
print(msg)
'''
最小值0.9557, 0.5371, 1.5714, 1.6931, 5.2294
f(x)=0.0000
'''

到了这里,关于【scipy】Python调用非线性最小二乘法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数学模型:Python实现非线性规划

    上篇文章:整数规划 文章摘要:非线性规划的Python实现。 参考书籍:数学建模算法与应用(第3版)司守奎 孙玺菁。 PS:只涉及了具体实现并不涉及底层理论。学习底层理论以及底层理论实现:可以参考1.最优化模型与算法——基于Python实现 渐令 粱锡军2.算法导论(原书第3版)

    2024年02月08日
    浏览(47)
  • 【算法系列】非线性最小二乘求解-梯度下降法

    ·【算法系列】卡尔曼滤波算法 ·【算法系列】非线性最小二乘求解-直接求解法 ·【算法系列】非线性最小二乘求解-梯度下降法 ·【算法系列】非线性最小二乘-高斯牛顿法  ·【算法系列】非线性最小二乘-列文伯格马夸尔和狗腿算法  文章目录 系列文章 文章目录 前言 一、

    2024年02月16日
    浏览(33)
  • 数学建模__非线性规划Python实现

    线性规划指的是目标模型均为线性,除此以外的都是非线性规划,使用scipy提供的方法对该类问题进行求解。

    2024年02月07日
    浏览(40)
  • 【数学建模】Python+Gurobi求解非线性规划模型

    目录 1 概述 2 算例  2.1 算例 2.2 参数设置 2.3 Python代码实现 2.4 求解结果 如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。 参考:(非线性规划Python)计及动态约束及节能减排环保要求的经济调度 2.1 算例 2.2 参数设置 求解NLP/非凸问题时,

    2024年02月09日
    浏览(35)
  • python机器学习(五)逻辑回归、决策边界、代价函数、梯度下降法实现线性和非线性逻辑回归

    线性回归所解决的问题是把数据集的特征传入到模型中,预测一个值使得误差最小,预测值无限接近于真实值。比如把房子的其他特征传入到模型中,预测出房价, 房价是一系列连续的数值,线性回归解决的是有监督的学习。有很多场景预测出来的结果不一定是连续的,我们

    2024年02月15日
    浏览(73)
  • Open3D 非线性最小二乘拟合二维多项式曲线

      多项式曲线表示为: p ( x ) = p 1 x n + p 2 x

    2024年02月07日
    浏览(36)
  • 线性方程组AX=b,AX=0以及非线性方程组的最小二乘解(解方程组->优化问题)

    超定方程组无解是因为方程组包含了过多的约束条件,无法满足所有的约束条件,在这种情况下,方程组的某些方程必然是矛盾的,也就是说,他们描述的条件是不兼容的,无法同时满足。 所以求解超定方程组其实是一个拟合问题,其基本思想是最小化所有方程的误差平方和

    2024年02月08日
    浏览(37)
  • 【Python机器学习】SVM解决非线性问题和信用卡欺诈检测实战(附源码和数据集)

    需要全部源码和数据集请点赞关注收藏后评论区留言私信~~~ 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的 间隔最大的线性分类器 ,间隔最大使它有别于感知机;SVM还包括 核技巧 ,这使它成为实质上的非线性分类器。SVM的的学

    2024年02月06日
    浏览(36)
  • 【Matlab算法】L-M法求解非线性最小二乘优化问题(附L-M法MATLAB代码)

    博主 一头小山猪 目前已开放所有文章:小山猪——经典算法专栏 活动地址:CSDN21天学习挑战赛 L-M法 (Levenberg-Marquardt法)原理 当矩阵 ( J k ) T J k left(J_{k}right)^{T} J_{k} ( J k ​ ) T J k ​ 为病态矩阵时,用G-N算法可能得不到正确的解,甚至当 ( J k ) T J k left(J_{k}right)^{T} J_{k} ( J

    2024年02月02日
    浏览(31)
  • Python调用最小二乘法

    所谓线性最小二乘法,可以理解为是解方程的延续,区别在于,当未知量远小于方程数的时候,将得到一个无解的问题。最小二乘法的实质,是保证误差最小的情况下对未知数进行赋值。 最小二乘法是非常经典的算法,而且这个名字我们在高中的时候就已经接触了,属于极其

    2024年02月01日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包