【问题标题】:Putting conditions on parameters in lmfit.minimize对 lmfit.minimize 中的参数设置条件
【发布时间】:2021-11-15 15:51:58
【问题描述】:

使用lmfit.minimize时如何对参数设置条件?

from lmfit import Parameters,minimize, fit_report
import numpy as np

x = np.linspace(0,10,100)
y = 2.39645 * x**2 + np.random.normal(0, 2, 100)

def fun1(params,x,y):
    k1 = params['k1']
    k2 = params['k2']
    k3 = params['k3']
    y_fit = k1*x**2 + k2*x + k3
    return y_fit-y 

# Defining the various parameters
params = Parameters()
params.add('k1', value = 1)
params.add('k2', value = 1)
params.add('k3', value = 1)

fitted_params = minimize(fun1, params, args=(x,y,), method='least_squares')

这给出了最优的 k1、k2 和 k3

name    value   standard error  relative error  initial value   min max vary
k1  2.42637846  0.02748469  (1.13%) 1   -inf    inf True
k2  -0.43530957 0.28403716  (65.25%)    1   -inf    inf True
k3  1.02895856  0.61456597  (59.73%)    1   -inf    inf True

我想对 k1、k2 和 k3 施加约束,使得:k1>k2>k3。我该怎么做?

编辑

我已经介绍了两个参数delta1delta2如下-


# Defining the various parameters
params = Parameters()
params.add('k1', value = 1)
params.add('delta1', value = 1, min = 0)
params.add('k2', value = 1, expr = "k1 - delta1")
params.add('k2', value = 1)
params.add('delta2', value = 1, min = 0)
params.add('k3', value = 1, expr = "k2 - delta2")

#fitting function
fitted_params = minimize(fun1, params, args=(x,y,), method='least_squares')

#Printing parameters
fitted_params.params.pretty_print()

新的参数如下-

Name       Value      Min      Max   Stderr     Vary     Expr Brute_Step
delta1     1.726        0      inf     None     True     None     None
delta2  2.833e-11        0      inf     None     True     None     None
k1         2.398     -inf      inf     None     True     None     None
k2      -0.01788     -inf      inf     None     True     None     None
k3      -0.01788     -inf      inf     None    False k2 - delta2     None

我们在新参数中有 k1>k2>k3,但 k2 和 k2 几乎相同。是否可以采取一些措施来避免这种情况,或者这些是基于给定约束的最佳解决方案?

【问题讨论】:

    标签: python optimization curve-fitting lmfit


    【解决方案1】:

    使用 ref 尝试以下操作。 https://lmfit.github.io/lmfit-py/constraints.html

    ...
    
    # Defining the various parameters
    params = Parameters()
    params.add('k3', value=1)
    params.add('delta1', value=1, vary=False)
    params.add('k2', expr='delta1+k3')
    params.add('delta2', value=1, vary=False)
    params.add('k1', expr='delta2+k2')
    
    fitted_params = minimize(fun1, params, args=(x,y,), method='least_squares')
    print(fitted_params.params.pretty_print())
    

    典型输出

    Name       Value      Min      Max   Stderr     Vary     Expr Brute_Step
    delta1         1     -inf      inf        0    False     None     None
    delta2         1     -inf      inf        0    False     None     None
    k1         2.241     -inf      inf        0    False delta2+k2     None
    k2         1.241     -inf      inf 0.005612    False delta1+k3     None
    k3         0.241     -inf      inf 0.005612     True     None     None
    

    改变 delta2

    # Defining the various parameters
    params = Parameters()
    params.add('k3', value=1)
    params.add('delta1', value=1, vary=False)
    params.add('k2', expr='delta1+k3')
    params.add('delta2', value=0, vary=True)
    params.add('k1', expr='delta2+k2')
    

    输出

    Name       Value      Min      Max   Stderr     Vary     Expr Brute_Step
    delta1         1     -inf      inf        0    False     None     None
    delta2     2.051     -inf      inf   0.1028     True     None     None
    k1         2.363     -inf      inf   0.1028    False delta2+k2     None
    k2        0.3113     -inf      inf  0.09006    False delta1+k3     None
    k3       -0.6887     -inf      inf  0.09006     True     None     None
    

    【讨论】:

    • 可能 delta1 的最小值应该设置为零,并且应该会有所不同。您的解决方案使 k2-k3=1。
    • 我首先关心的是已经满足的指定约束k1>k2>k3
    • 但是你的解决方案限制k2+k3为1,k1+k2为0,可能会忽略其他可能的解决方案?
    • 这个k2 + k3 to be 1, and k1+k2 to be 0 来自哪里?请参阅我的示例输出。
    • 在这种情况下,您的解决方案有效,但如果您将 y 更改为 y = 0.2 * x**2 + 108*np.random.normal(0, 2, 100),则约束将不成立。为了使您的解决方案通用,您应该将 delta1 和 delta2 的最小值固定为 0,并且两者都可以变化。
    猜你喜欢
    • 2014-11-11
    • 2019-07-31
    • 2022-10-08
    • 2016-02-08
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多