簡體   English   中英

Python LMFIT - 使用有界參數時獲得錯誤的最小化結果

[英]Python LMFIT - Get the wrong result for Minimization, when using bounded parameters

現在,我無法在 LMFIT 模塊中使用minimize 請看以下案例:

案例 1:沒有約束的參數

import numpy as np
import matplotlib.pyplot as plt
from lmfit import Model, minimize, Parameters, Parameter, report_fit

noise = np.random.randn(100)

def func_model(para, x, data):
    ''' Model: y = a*sin(2*k*pi*x+theta)'''
    a = para['a']
    k = para['k']
    theta = para['theta']
    model= a*np.sin(2*k*np.pi*x+theta)
    return model-data  # thas's what I want to minimize

def func_noise(x, para):
    a, k, theta = para
    return a*np.sin(2*k*np.pi*x+theta) + noise

x_steps = np.linspace(-2*np.pi, 0, 100)
para_true = [10, 0.34, np.pi/6]
datas = func_noise(x_steps, para_true)

params = Parameters()

params.add('a', value=7)
params.add('k', value=0.2)
params.add('theta', value=0)

result = minimize(func_model, params, args=(x_steps, datas))
report_fit(result)

得到結果:

a:      10.0054134 +/- 0.14334401 (1.43%) (init = 7)
k:      0.33954301 +/- 0.00110337 (0.32%) (init = 0.2)
theta:  0.52071533 +/- 0.02546636 (4.89%) (init = 0)

與事實參數[10, 0.34, pi/6] ,結果是正確的。

案例 2:帶有約束的參數

只需更改為:

params.add('a', value=7, min=5, max=15)    #   should be 10
params.add('k', value=0.2, min=0, max=1)   #   should be 0.34
params.add('theta', value=0)

並保持其他代碼相同,然后得到錯誤的結果:

a:      14.9999918 +/- 51.0737691 (340.49%) (init = 7)
k:      0.01305462 +/- 0.58283692 (4464.60%) (init = 0.2)
theta: -2.90461833 +/- 10.5723936 (363.99%) (init = 0)

怎么會發生?

我認為主要問題是k在這里接近於 0,這使得擬合過程很難確定其他參數。 當參數達到極限時,算法很難擺脫它。 在這里,它看起來像是嘗試a ~15 的 a,然后將k推向零,結果離得很遠,它不知道如何解開。

通常,最好根據物理限制設置邊界,或者了解擬合將如何響應邊界附近的值。 也就是說,我真的不知道為什么這個案子這么糟糕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM