Saturday, May 28, 2011

Data fitting using fmin

We have seen already how to find the minimum of a function using fmin, in this example we will see how use it to fit a set of data with a curve minimizing an error function:
from pylab import *
from numpy import *
from numpy.random import normal
from scipy.optimize import fmin

# parametric function, x is the independent variable
# and c are the parameters.
# it's a polynomial of degree 2
fp = lambda c, x: c[0]+c[1]*x+c[2]*x*x
real_p = rand(3)

# error function to minimize
e = lambda p, x, y: (abs((fp(p,x)-y))).sum()

# generating data with noise
n = 30
x = linspace(0,1,n)
y = fp(real_p,x) + normal(0,0.05,n)

# fitting the data with fmin
p0 = rand(3) # initial parameter value
p = fmin(e, p0, args=(x,y))

print 'estimater parameters: ', p
print 'real parameters: ', real_p

xx = linspace(0,1,n*3)
plot(x,y,'bo', xx,fp(real_p,xx),'g', xx, fp(p,xx),'r')

show()
The following figure will be showed, in green the original curve used to generate the noisy data, in blue the noisy data and in red the curve found in the minimization process:
Image

The parameters will be printed also:
Optimization terminated successfully.
         Current function value: 0.861885
         Iterations: 77
         Function evaluations: 146
estimater parameters:  [ 0.92504602  0.87328979  0.64051926]
real parameters:  [ 0.86284356  0.95994753  0.67643758]

5 comments:

  1. Image

    Thanks this was helpful. I've seen some pretty bad tutorials on how to use fmin so this makes me pretty happy.

    ReplyDelete
    Replies
    1. Image

      fmin does return intermediate values, you might want to have a look at the documentation https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin.html

      Delete
  2. Image

    Hi this is very helpful and I have put some variation of it to good use, but I wanted to ask, is it possible to modify it so that it works when we deal with 2 or more independent variables, or should I stick to the 1-variable version?

    Thanks in advance.

    ReplyDelete
    Replies
    1. Image

      Of course, check out this post: http://glowingpython.blogspot.com/2013/06/shape-matching-experiments.html

      Here I used the fmin to minimize a function of 4 variables.

      Delete
  3. Image

    is there a way to get the errors for the parameters in the fit from fmin?

    ReplyDelete

Note: Only a member of this blog may post a comment.