Scipy.optimize - 使用固定参数进行曲线拟合

2024-01-06

我正在执行曲线拟合scipy.optimize.leastsq。例如。对于高斯:

def fitGaussian(x, y, init=[1.0,0.0,4.0,0.1]):
    fitfunc = lambda p, x: p[0]*np.exp(-(x-p[1])**2/(2*p[2]**2))+p[3] # Target function
    errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function
    final, success = scipy.optimize.leastsq(errfunc, init[:], args=(x, y))
    return fitfunc, final

现在,我想选择性地修复拟合中某些参数的值。我发现建议是使用不同的包lmfit https://lmfit.github.io/lmfit-py/intro.html,我想避免,或者非常笼统,比如here http://scipy-user.10969.n7.nabble.com/curve-fitting-with-fixed-parameters-td3310.html。 因为我需要一个解决方案

  1. 与 numpy/scipy 一起使用(没有更多的包等)
  2. 与参数本身无关,
  3. 是灵活的,参数可以固定也可以不固定,

我对每个参数使用一个条件,得出以下结论:

def fitGaussian2(x, y, init=[1.0,0.0,4.0,0.1], fix = [False, False, False, False]):
    fitfunc = lambda p, x: (p[0] if not fix[0] else init[0])*np.exp(-(x-(p[1] if not fix[1] else init[1]))**2/(2*(p[2] if not fix[2] else init[2])**2))+(p[3] if not fix[3] else init[3]) 
    errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function
    final, success = scipy.optimize.leastsq(errfunc, init[:], args=(x, y))
    return fitfunc, final

虽然这工作得很好,但它既不实用,也不美观。 所以我的问题是:对于固定参数,是否有更好的方法在 scipy 中执行曲线拟合?或者是否有包装器已经包含此类参数修复?


Using scipy,据我所知没有内置选项。您将始终需要像您已经做过的那样进行变通。

如果您愿意使用包装包装,我可以推荐我自己的包装吗symfit http://symfit.readthedocs.io/en/latest/tutorial.html#simple-example?这是一个包装器scipy以可读性和更少的样板代码作为其核心原则。在symfit http://symfit.readthedocs.io/en/latest/tutorial.html#simple-example,您的问题将解决为:

from symfit import parameters, variables, exp, Fit, Parameter

a, b, c, d = parameters('a, b, c, d')
x, y = variables('x, y')

model_dict = {y: a * exp(-(x - b)**2 / (2 * c**2)) + d}

fit = Fit(model_dict, x=xdata, y=ydata)
fit_result = fit.execute()

线路a, b, c, d = parameters('a, b, c, d')做四个Parameter对象。修复例如参数c为其初始值,在调用之前在任何地方执行以下操作fit.execute():

c.value = 4.0
c.fixed = True

所以可能的最终结果可能是:

from symfit import parameters, variables, exp, Fit, Parameter

a, b, c, d = parameters('a, b, c, d')
x, y = variables('x, y')

c.value = 4.0
c.fixed = True

model_dict = {y: a * exp(-(x - b)**2 / (2 * c**2)) + d}

fit = Fit(model_dict, x=xdata, y=ydata)
fit_result = fit.execute()

如果你想让你的代码更加动态,你可以使Parameter立即使用以下对象:

c = Parameter(4.0, fixed=True)

有关更多信息,请查看文档:http://symfit.readthedocs.io/en/latest/tutorial.html#simple-example http://symfit.readthedocs.io/en/latest/tutorial.html#simple-example

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scipy.optimize - 使用固定参数进行曲线拟合 的相关文章

  • pandas Series.tolist() 中的 NaN 与 list 中的 NaN 的行为不同

    Why does gt gt import pandas as pd gt gt import numpy as np gt gt list pd Series np nan np nan 2 np nan 2 np nan np nan
  • Python/Numpy - 屏蔽数组非常慢

    我可以做些什么来加速 numpy 中的屏蔽数组吗 我有一个效率非常低的函数 我重新编写了它来使用屏蔽数组 我可以只屏蔽行 而不是像我所做的那样进行复制和删除行 然而 我惊讶地发现 masked 函数慢了 10 倍 因为 masked 数组慢
  • 为什么在 numpy 数组上使用 *= 会修改原始数组?

    下面的代码演示了使用a 3修改原始数据集 而a a 3才不是 data np array 1 0 3 4 a data 0 b data 1 a 3 b b 3 print data gives 3 0 3 4 the a 3语句修改了矩阵
  • 非常大的数据集的余弦相似度

    我在计算大量 100 维向量之间的余弦相似度时遇到问题 当我使用from sklearn metrics pairwise import cosine similarity I get MemoryError在我的 16 GB 机器上 每个
  • Python:安装 numpy 时出现损坏的工具链错误

    我正在使用 Python 2 7 3 并尝试在 Windows 计算机上安装 numpy 包 但收到运行时错误 提示 工具链损坏 无法链接到简单的 C 程序 我读了解决方案here https stackoverflow com quest
  • polyfit numpy 的反向输出

    我使用了 numpy 的 polyfit 并获得了两个数组 x 和 y 的非常好的拟合 使用七阶多项式 我的关系是这样的 y x p 0 x 7 p 1 x 6 p 2 x 5 p 3 x 4 p 4 x 3 p 5 x 2 p 6 x 1
  • numpy 1.8.0 与 py2exe 打包时出现 OMP 警告

    import numpy 当我将上面一行脚本打包为使用 py2exe 的单个可执行窗口应用程序 http www py2exe org index cgi SingleFileExecutable 我在启动时收到以下警告 OMP Warni
  • 每个 id 创建 n 行 |熊猫

    我有一个数据框df如下 id lob addr addr2 a1 001 1234 0 a1 001 1233 0 a3 003 1221 0 a4 009 1234 0 我想生成n 让我们每个 id 取 4 行 其他列是null na n
  • NumPy 数组中负数和正数岛的计数

    我有一个包含负元素块和正元素块的数组 一个更简单的例子是一个数组a看起来像 array 3 2 1 1 2 3 4 5 6 5 4 a lt 0 sum and a gt 0 sum 给我消极和积极元素的总数 但我如何按顺序计算它们 我的意
  • 如何使用 np.newaxis?

    What is numpy newaxis https numpy org doc stable reference constants html numpy newaxis我什么时候应该使用它 在一维数组上使用它x产生 gt gt gt
  • Python 中的随机优化

    我正在尝试结合cvxopt http cvxopt org 优化求解器 和PyMC https github com pymc devs pymc 采样器 解决凸问题随机优化问题 作为参考 安装这两个软件包pip很简单 pip instal
  • 我知道 scipy curve_fit 可以做得更好

    我使用 python numpy scipy 来实现此算法 用于根据地形坡向和坡度对齐两个数字高程模型 DEM 用于量化冰川厚度变化的卫星高程数据集的联合配准和偏差校正 C Nuth 和 A K b doi 10 5194 tc 5 271
  • 使用 nditer 进行浅层迭代

    我有这样一个数组 gt gt gt y np random randint 0 255 2 2 3 gt gt gt array 242 14 211 198 7 0 235 60 81 164 64 236 我必须迭代每个triplet元
  • 填充 MultiIndex Pandas Dataframe 中的日期空白

    我想修改 pandas MultiIndex DataFrame 以便每个索引组都包含指定范围内的日期 我希望每个组都用值 0 或NaN Group A Group B Date Value loc a group a 2013 06 11
  • 使用 None 值从 Python int 列表初始化 numpy 掩码数组

    正如问题的答案所示将具有 None 值的 python 列表转换为具有 nan 值的 numpy 数组 https stackoverflow com questions 19456239 convert python list with
  • 解释 scipy.stats.entropy 值

    我正在尝试使用scipy stats 熵来估计库尔巴克 莱布勒 KL 两个分布之间的散度 更具体地说 我想使用 KL 作为衡量标准来确定两个分布的一致性 但是 我无法解释 KL 值 例如 t1 numpy random normal 2 5
  • numpy 中的分层抽样

    在 numpy 中我有一个这样的数据集 前两列是索引 我可以通过索引将数据集分成多个块 即第一个块是 0 0 第二个块是 0 1 第三个块 0 2 然后是 1 0 1 1 1 2 等等 每个块至少有两个元素 索引列中的数字可能会有所不同 我
  • 使用文件处理程序时 numpy savetxt 失败

    在Windows 7上 使用最新的numpy 1 13 3和PYTHON 3 5 如果我有一个名为points的数组 其形状为m x 6 dtype为float32 我可以将数组保存到 foo txt 文件中 如下所示 np savetxt
  • 带有指针数组的 cython

    我在 python 中有一个 numpy ndarrays 列表 具有不同的长度 并且需要非常快速地访问 python 中的列表 我认为指针数组就可以解决问题 我试过 float type t list of arrays no of ar
  • 向量化 numpy bincount

    我有一个 2d numpy 数组 A我要申请np bincount 到矩阵的每一列A生成另一个二维数组B由原始矩阵每列的 bincounts 组成A 我的问题是 np bincount 是一个采用一维数组的函数 它不是像这样的数组方法B A

随机推荐