Python LMFIT - получить неверный результат для минимизации при использовании ограниченных параметров - PullRequest
0 голосов
/ 18 мая 2018

Теперь у меня проблемы с использованием minimize в LMFIT-модуле.Пожалуйста, смотрите случай ниже:

Случай 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, пи / 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)

Как это могло произойти?Заранее спасибо

1 Ответ

0 голосов
/ 18 мая 2018

Я думаю, что основная проблема заключается в том, что k достигает почти 0 здесь, что затрудняет процесс подгонки для определения других параметров.Когда параметры достигают своих границ, алгоритму может быть трудно отойти от него.Здесь он выглядит так, как будто он пытается a из ~ 15, тогда это толкает k к нулю и заканчивается так далеко, что он не знает, как отклеиться.

В общем, это хорошая идеяустановить границы на основе физических ограничений или узнать, как подгонка будет реагировать на значения вблизи границ.Тем не менее, я не знаю, почему это дело так плохо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...