【问题标题】:Non linear Least Squares: Reproducing Matlabs lsqnonlin with Scipy.optimize.least_squares using Levenberg-Marquardt非线性最小二乘:使用 Levenberg-Marquardt 使用 Scipy.optimize.least_squares 重现 Matlabs lsqnonlin
【发布时间】:2020-02-14 12:08:12
【问题描述】:

我正在尝试最小化一个函数,该函数采用长度为 N 的 1darray 并通过 Levenberg-Marquardt (:= LM) 返回一个标量。

它在 Matlab 中工作:

beta_initial = [-0.7823, -0.1441, -0.7669]; 

% substitution for my long, convoluted function
% but it also works with the proper function
F = @(beta) sum(exp(beta))+3; 

options = optimset('Algorithm','Levenberg-Marquardt');

beta_arma = lsqnonlin(F,beta_initial,[],[],options) % -21.7814  -15.9156  -21.5420

F(beta_arma) % 3

当我在 Python 中尝试时,我得到了一个值错误:

ValueError:当残差数小于变量数时,方法“lm”不起作用。

import numpy as np
from scipy.optimize import least_squares as lsq

# substitution for my long, convoluted function
F = lambda beta: np.sum(np.exp(beta))+3 

beta_initial = [-0.7823, -0.1441, -0.7669]

beta_arma = lsq(F, beta_initial,method='lm')['x']

我理解错误 scipy 的方式要求

out = F(in),这样 len(out) >= len(in) ,但是 matlab 没有

我查看了文档,scipymatlab

来自 scipy 文档:

方法‘lm’ (Levenberg-Marquardt) 调用一个封装在MINPACK (lmder, lmdif) 中实现的最小二乘算法。它运行被表述为信任域类型算法的 Levenberg-Marquardt 算法。该实现基于论文 [JJMore],它非常健壮且高效,并带有许多智能技巧。它应该是无约束问题的首选。请注意,它不支持边界。 当m 时它也不起作用。

看起来当 m>=n

时没有有效的 LM 实现

我的问题是:

如何在 Python 中像 Matlab 一样使用 LM 获得非线性最小二乘最小化?

【问题讨论】:

    标签: python matlab optimization scipy


    【解决方案1】:

    我找到了一种解决方法,方法是将我的函数分成两部分:

    • 第一个函数接受一个数组并返回一个数组
    • 第二个函数从第一个函数中获取处理后的数组并返回标量输出

    然后我让优化器在第一个函数上运行。

    在上面的最小示例的上下文中:

    import numpy as np
    from scipy.optimize import least_squares as lsq
    
    F1 = lambda beta: np.exp(beta)
    F2 = lambda processed_beta: np.sum(np.exp(processed_beta))+3
    
    
    beta_initial = [-0.7823, -0.1441, -0.7669]
    
    # parameters that minimze F1
    beta_arma = lsq(F1, beta_initial,method='lm')['x'] 
    
    F2(beta_arma) # 3.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      相关资源
      最近更新 更多