python - Scipy's Optimize Curve Fit Limits -


is there way can provide limits scipy's optimize curve fit?

my example:

    def optimized_formula(x, m_1, m_2, y_1, y_2, ratio_2):         return (log(x[0]) * m_1 + m_2)*((1 - x[1]/max_age)*(1-ratio_2)) + ((log(x[1]) * y_1 + y_2)*(x[1]/max_age)*ratio_2)      popt, pcov = optimize.curve_fit(optimized_formula, usage_and_age, prices) 

x[0] age , max_age constant. in mind, x[0] approaches maximum, x[1]/max_age approaches 1.

is possible provide constraint/limit whereby x[1]/max_age > 0.3 , x[1]/max_age < 0.7 , other constraints such m_1 < 0, m_2 > 0, , on.

as suggested in answer, use lmfit these kind of problems. therefore, add example on how use in case interested in topic, too.

let's have dataset follows:

xdata = np.array([177.,180.,183.,187.,189.,190.,196.,197.,201.,202.,203.,204.,206.,218.,225.,231.,234.,           252.,262.,266.,267.,268.,277.,286.,303.])  ydata = np.array([0.81,0.74,0.78,0.75,0.77,0.81,0.73,0.76,0.71,0.74,0.81,0.71,0.74,0.71,       0.72,0.69,0.75,0.59,0.61,0.63,0.64,0.63,0.35,0.27,0.26]) 

and want fit model data looks this:

model = n1 + (n2 * x + n3) * 1./ (1. + np.exp(n4 * (n5 - x))) 

with constraints

0.2 < n1 < 0.8 -0.3 < n2 < 0 

using lmfit (version 0.8.3) obtain following output:

n1:   0.26564921 +/- 0.024765 (9.32%) (init= 0.2) n2:  -0.00195398 +/- 0.000311 (15.93%) (init=-0.005) n3:   0.87261892 +/- 0.068601 (7.86%) (init= 1.0766) n4:  -1.43507072 +/- 1.223086 (85.23%) (init=-0.36379) n5:   277.684530 +/- 3.768676 (1.36%) (init= 274) 

enter image description here

as can see, fit reproduces data , parameters in requested ranges.

here entire code reproduces plot few additional comments:

from lmfit import minimize, parameters, parameter, report_fit import numpy np  xdata = np.array([177.,180.,183.,187.,189.,190.,196.,197.,201.,202.,203.,204.,206.,218.,225.,231.,234.,       252.,262.,266.,267.,268.,277.,286.,303.])  ydata = np.array([0.81,0.74,0.78,0.75,0.77,0.81,0.73,0.76,0.71,0.74,0.81,0.71,0.74,0.71,       0.72,0.69,0.75,0.59,0.61,0.63,0.64,0.63,0.35,0.27,0.26])  def fit_fc(params, x, data):      n1 = params['n1'].value     n2 = params['n2'].value     n3 = params['n3'].value     n4 = params['n4'].value     n5 = params['n5'].value      model = n1 + (n2 * x + n3) * 1./ (1. + np.exp(n4 * (n5 - x)))      return model - data #that's want minimize  # create set of parameters # 'value' initial condition # 'min' , 'max' define boundaries params = parameters() params.add('n1', value= 0.2, min=0.2, max=0.8) params.add('n2', value= -0.005, min=-0.3, max=10**(-10)) params.add('n3', value= 1.0766, min=-1000., max=1000.) params.add('n4', value= -0.36379, min=-1000., max=1000.) params.add('n5', value= 274.0, min=0., max=1000.)  # fit, here leastsq model result = minimize(fit_fc, params, args=(xdata, ydata))  # write error report report_fit(params)  xplot = np.linspace(min(xdata), max(xdata), 1000) yplot = result.values['n1'] + (result.values['n2'] * xplot + result.values['n3']) * \                               1./ (1. + np.exp(result.values['n4'] * (result.values['n5'] - xplot))) #plot results try:     import pylab     pylab.plot(xdata, ydata, 'k+')     pylab.plot(xplot, yplot, 'r')     pylab.show() except:     pass 

edit:

if use version 0.9.x need adjust code accordingly; check here changes have been made 0.8.3 0.9.x.


Comments

Popular posts from this blog

PHPMotion implementation - URL based videos (Hosted on separate location) -

javascript - Using Windows Media Player as video fallback for video tag -

c# - Unity IoC Lifetime per HttpRequest for UserStore -