Parametrin sovitus

160 days ago by dx27

Lähtökohtana on mittausaineisto (x_j, y_j), johon halutaan sovittaa muotoa y=f(x, \lambda) oleva "malli", missä \lambda=(\lambda_1, ..., \lambda_p).

Olkoon

s(\lambda)=\sum_{j=1}^m (y_j-f(x_j, \lambda))^2.

Tavoitteena on kohdefunktion s(\lambda) minimointi, mikä on epätriviaali tehtävä. Ohjelmassa minimointi suoritetaan Nelder-Mead Simplex -nimisen heuristisen menetelmän avulla.

Olkoon   \lambda=(\lambda_1, \lambda_2, \lambda_3). Esimerkkikoodissa tarkastellaan funktiota

f(x, \lambda) = \lambda_1 e^{-x}+\lambda_2 e^{-\lambda_3 x}.

from numpy import * def fmodel(lam, x): return lam[0]*exp(-x) + lam[1]*exp(-lam[2]*x) def fobj(lam, xdata, ydata): return linalg.norm(fmodel(lam, xdata) - ydata) xdata = arange(0, 1.15, 0.05) lam = [0.2, 1.5, 0.7] y = fmodel(lam, xdata) # Mittausaineisto generoidaan satunnaisesti poikkeuttamalla funktion f arvoja. ydata = y*(0.97+0.05*random.rand(y.size)) lam0 = [1, 1, 1] y0 = fobj(lam0, xdata, ydata) # Nelder-Mead Simplex algorithm (scipy.optimize.fmin) lam = minimize(fobj, lam0, args=(xdata, ydata), algorithm='simplex') yfinal = fobj(lam, xdata, ydata) # Kuvat fit = plot(fmodel(lam, x), (x, 0, 1.5), legend_label="Fitted curve") datapoints = list_plot(zip(xdata, ydata), size=20, legend_label="Data points") html("\n\n$\\text{Object function values: start = %s, final = %s}$\n" %( n(y0, digits=5), n(yfinal, digits=5) )) show(fit + datapoints, figsize=5, gridlines=True, axes_labels=("xdata", "ydata")) 
       
Optimization terminated successfully.
         Current function value: 0.075524
         Iterations: 134
         Function evaluations: 235


\text{Object function values: start = 0.64789, final = 0.075524}

Optimization terminated successfully.
         Current function value: 0.075524
         Iterations: 134
         Function evaluations: 235


\text{Object function values: start = 0.64789, final = 0.075524}