Python — подгонка данных с помощью экспоненциальной функции

Я знаю, что есть несколько вопросов по похожей теме, хотя я не смог найти правильного ответа.

Я хотел бы сопоставить некоторые данные с функцией (называемой Bastenaire) и получить значения параметров. Вот код:

import numpy as np
from matplotlib import pyplot as plt
from scipy import optimize

def bastenaire(s, A,B, C,sd):

    logNB=np.log(A)-C*(s-sd)-np.log(s-sd)

    return np.exp(logNB)-B

S=np.array([659,646,634,623,613,595,580,565,551,535,515,493,473,452,432,413,394,374,355,345])
N=np.array([46963,52934,59975,65522,74241,87237,101977,116751,133665,157067,189426,233260,281321,355558,428815,522582,630257,768067,902506,1017280])


fitmb,fitmob=optimize.curve_fit(bastenaire,S,N,p0=(30000,2000000000,0.2,250))


plt.scatter(N,S)
plt.plot(bastenaire(S,*fitmb),S,label='bastenaire')
plt.legend()

plt.show()

Однако подгонка кривой не может определить правильные параметры, и я получаю: OptimizeWarning: не удалось оценить ковариацию параметров. Те же результаты, когда я не даю значений входных параметров.

Рисунок

Есть ли способ что-то настроить и получить результаты? Должен ли мой набор данных охватывать более широкий диапазон и значения?

Благодарю вас!

Брок


person Broc    schedule 27.11.2018    source источник
comment
Где вы используете N в своей функции подгонки bastenaire?   -  person Sheldore    schedule 27.11.2018


Ответы (1)


Подгонка сложна, вам нужно ограничить пространство параметров с помощью bounds и (часто) немного проверить ваши начальные значения.

Чтобы заставить его работать, я ищу начальное значение, при котором функция имела правильный вид, а затем оценивал некоторые ограничения:

bounds = np.array([(1e4, 1e12), (-np.inf, np.inf), (1e-20, 1e-2), (-2000., 20000)]).T
fitmb, fitmob = optimize.curve_fit(bastenaire,S, N,p0=(1e7,-100.,1e-5,250.), bounds=bounds)

возвращается

(array([ 1.00000000e+10,  1.03174824e+04,  7.53169772e-03, -7.32901325e+01]), array([[ 2.24128391e-06,  6.17858390e+00, -1.44693602e-07,
        -5.72040842e-03],
       [ 6.17858390e+00,  1.70326029e+07, -3.98881486e-01,
        -1.57696515e+04],
       [-1.44693602e-07, -3.98881486e-01,  1.14650323e-08,
         4.68707940e-04],
       [-5.72040842e-03, -1.57696515e+04,  4.68707940e-04,
         1.93358414e+01]]))
person Silmathoron    schedule 27.11.2018
comment
Спасибо, это очень помогло :) - person Broc; 03.12.2018