[英]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.