【问题标题】:getting Jacobian from lmfit minimizer从 lmfit 最小化器获取雅可比行列式
【发布时间】:2020-03-31 14:32:42
【问题描述】:

lmfit Minimizer 建立在 scipy.optimize 之上。所以,

import lmfit
params = lmfit.Parameters()
params.add('param', ...)
result = lmfit.minimize(fcn, params, method="least_squares")

调用 scipy.optimize.least_squares。除其他外,后者输出 OptimizeResult.jac 中的雅可比行列式。但是,我也可以在使用 lmfit 时访问雅可比矩阵吗?还是该信息丢失了?

【问题讨论】:

    标签: python scipy-optimize lmfit


    【解决方案1】:

    ModelResult 类有一个可选的可调用函数jacfcn。你可以在你的result 上调用它来计算雅可比数组according to the documentation.

    【讨论】:

    • 我遗漏了一些东西:lmfit.minimize 返回类 MinimizerResult 的实例,但 jacfcn 是 ModelResult 的属性。那么,如何从结果中访问 jacfcn?谢谢。
    • 对不起,我误读了这个问题。如果你从你的函数中创建一个模型(参见https://lmfit.github.io/lmfit-py/model.html?highlight=jacobian#the-model-class),你可以使用返回一个 ModelResult 对象的 Model.fit() (然后你可以使用它来访问 jacfcn)
    • 我正在从其他已知位置对一个点进行三角测量。不是真正的曲线拟合问题。
    【解决方案2】:

    对于lmfit.least_squares,雅可比目前没有被保留。

    请问你为什么认为你想要这个,你希望能用它做什么?协方差矩阵已计算并包含在返回的 MinimizerResult (result.covar) 中,所有参数之间的不确定性和相关性也已计算完毕。

    【讨论】:

    • 反转有一个空空间。所以,我已经把它分成连续的,现在想通过添加先验信息来修改反演结果,沿着 Tarantola, Inverse Problems, 3.2.1: (Jacobian^T * data covariance ^ -1 * data residual + model covariance ^ -1 * 模型更新)/归一化。这样,先验信息应该可以稳定反演。或者,我将先验因素烘焙到成本函数中。
    • 我认为您在每次函数评估时都要求在拟合期间访问雅可比行列式。据我了解,除非您自己计算雅可比行列式,否则任何方法都无法做到这一点。基本上,您希望有另一个合适的 method 来添加此类先验信息。以最佳解决方案(least_squares 将返回的内容)评估雅可比可能不会有帮助。
    • 哦,是的,带有先验的最小二乘拟合方法会很棒!相反,除了编写我自己的雅可比行列式之外,我认为我可以在第一次迭代后通过 iter_cb 打破优化,但是,我现在看到,在每次 fcn 评估之后调用 iter_cb,而不是在每次迭代之后调用,正如您之前解释的那样。相反,我是否可以将 ftol 设置为无穷大,以便 lmfit 在第一次迭代后优雅退出,如上所述修改更新,并将两个步骤包装成一个循环?
    • 顺便说一下,lmfit 使用“least_squares”方法确实返回 MinimizerResult.jac 中的雅可比行列式。无证,也许不是故意的,但它就在那里。
    • "iteration" 定义不明确,调用者无法可靠确定。 “功能评价”一目了然。如果我理解正确,您正在寻找的是一个不同的成本函数,它不仅取决于当前残差,还取决于雅可比(该残差的导数)。据我所知,没有一种可用的方法在评估成本时使用雅可比行列式,我真的不明白为什么这会有用。我认为您正在寻找一种不同的拟合方法,但也许我根本不明白您要做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2019-11-29
    • 2022-11-14
    相关资源
    最近更新 更多