Karina Marques
Karina Marques

Reputation: 15

Gaussian fit failure in python

I have been trying to fit a gaussian curve to my data

data

I have used the following code:

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

def gaus(x, y0, a, b, c):
    return y0 + a*np.exp(-np.power(x - b, 2)/(2*np.power(c, 2)))

popt, pcov = curve_fit(gaus, x, y)

plt.figure()
plt.scatter(x, y, c='grey', marker = 'o', label = "Measured values", s = 2)
plt.plot(x, gaus(x, *popt), c='grey', linestyle = '-')

And that's what I am getting: result

I have the x/y data available here in case you want to try it by yourself.

Any idea on how can I get a fit? This data is obviously gaussian shaped, so it seems weird I cannot fit a gaussian curve.

Upvotes: 1

Views: 606

Answers (1)

piterbarg
piterbarg

Reputation: 8219

The fit needs a decent starting point. Per the docs if you do not specify the starting point all parameters are set to 1 which is clearly not appropriate, and the fit gets stuck in some wrong local minima. Try this, where I chose the starting point by eyeballing the data

popt, pcov = curve_fit(gaus, x, y, p0 = (1500,2000,20, 1))

you would get something like this: fit

and the solution found by the solver is

popt
array([1559.13138798, 2128.64718985,   21.50092272,    0.16298357])

Even just getting the mean (parameter b) roughly right is enough for the solver to find the solution, eg try this

popt, pcov = curve_fit(gaus, x, y, p0 = (1,1,20, 1))

you should see the same (good) result

Upvotes: 1

Related Questions