Code covered by the BSD License

### Highlights from gaussian curve fit

4.09524
4.1 | 22 ratings Rate this file 108 Downloads (last 30 days) File Size: 1.71 KB File ID: #11733 Version: 1.0

# gaussian curve fit

### Yohanan Sivan (view profile)

19 Jul 2006 (Updated )

gaussian curve fit

File Information
Description

[sigma,mu,A]=mygaussfit(x,y)
[sigma,mu,A]=mygaussfit(x,y,h)

this function is doing fit to the function
y=A * exp( -(x-mu)^2 / (2*sigma^2) )

the fitting is been done by a polyfit
the lan of the data.

h is the threshold which is the fraction
from the maximum y height that the data
is been taken from.
h should be a number between 0-1.
if h have not been taken it is set to be 0.2
as default.

Acknowledgements

This file inspired Slant Edge Script.

MATLAB release MATLAB 7.2 (R2006a)
29 Sep 2014 Dan

### Dan (view profile)

12 Aug 2014 Felipe Santibañez

### Felipe Santibañez (view profile)

05 Jun 2014 Achut

### Achut (view profile)

18 Jul 2013 Georges

### Georges (view profile)

This file poorly fits a gaussian (and has a much higher average rating) as compared to others here...
The test main file is wrong: the "rand" noise on the gaussian biases the measurements by 0.5, randn should be used instead.

Same main file used for comparison with another gaussian fit (gaussfit.m):

%% data
x=1:100;
sigma=15; mu=40; A=3;
plot(normpdf(x,mu,sigma))
y=A*exp(-(x-mu).^2/(2*sigma^2))+randn(size(x))*0.5;
hold all;
plot(x,y/(sum(y)),'.');

%% fitting
[sigmaNew,muNew,Anew]=mygaussfit(x,y);
y2=Anew*exp(-(x-muNew).^2/(2*sigmaNew^2));
plot(x,y2/(sum(y2)));

%% bis
[sigmaNew2,muNew2]=gaussfit(x,y/sum(y));
plot(normpdf(x,muNew2,sigmaNew2));
legend('truth','measurements','mygaussfit','gaussianfit')

08 Jul 2013 Qing

### Qing (view profile)

11 Feb 2013 chile1987

### chile1987 (view profile)

Great idea,

though I wonder when you do the retransformation from second order polynomial (a0 + a1*x + a2*x^2)to logarithmic gaussian (log(A) - x^2/2*sigma^2 + x*mu/2*sigma^2 - mu^2/2*sigma^2)(line 46 in mygaussfit) shouldn't you calculate the mean from p(2) via mu = A1/-A2 or equivalently mu = A1*2*sqrt(-1/2*A2) instead of mu = A1*2*sigma^2 ?

I might be totally wrong or missed sth, just a quick idea.

05 Feb 2013 Manuel Diaz

27 Aug 2012 Omer

### Omer (view profile)

01 Jan 2012 Namra Aftab

### Namra Aftab (view profile)

hi...i have a sequence of 40 frames and i want to plot gaussian distribution of, say, first pixel of all 40 frames.the result does not look like a gaussian at all.what should i correct?

Comment only

hello every one any one can tell me about gussian curve fitting back groung why we use this instead of other curve fitting method what is the benift of this from other curve fitting method.If any one have some good data regarding gussian curve fitting kindly inform me.

Comment only
05 Oct 2010 Avi

### Avi (view profile)

GREAT

12 Feb 2010 Kiran

### Kiran (view profile)

hello...could someone please explain to me how the approximation from polynomial back to gaussian is done in the code? why are the coefficients equated in the way that they are below :

sigma=sqrt(-1/(2*A2));
mu=A1*sigma^2;
A=exp(A0+mu^2/(2*sigma^2));

Thank you very much

Comment only
11 Feb 2010 Jan

### Jan (view profile)

Where do you get he formulas from? and where do you use h for? Can it also without h?

Comment only
01 Jan 2010 David Holz

### David Holz (view profile)

Bob Marley is absolutely correct. The use of a for loop is unnecessary and slows the function down by ~20%.

If you are confident in your inputs you can also remove the warning lines #74-85 of polyfit to knock out 87% of the total previous computation time.

30 Sep 2009 Ryan

### Ryan (view profile)

I disagree with Matheca. The function is intended to fit a general gaussian, not necessarily a probability distribution function. The equation is correct.

However, the user should be aware that removing data points in a deterministic manner (i.e. by thresholding) definitely skews the resulting fit.

Rather than fitting to the whole series with negatives removed, try finding the largest contiguous positive subset of the original data series and fitting to that. This method won't work when the noise amplitude is greater than the distribution amplitude, but in most cases it will give you a better fit.

Even better yet: if accuracy is more important than computation speed, use fmincon with a least-squares difference cost function:

p = fmincon(@(p) sum((y-(p(1)*exp(-(x-p(2)).^2/2/p(3)^2))).^2),...
[max(y) mean(x) 1],[],[],[],[],[0 -inf 0],[2*max(y) inf inf])
A=p(1);
mu=p(2);
sigma=p(3);

30 Sep 2009 Ryan

### Ryan (view profile)

23 Jan 2009 Michael Jordan

### Michael Jordan (view profile)

21 Dec 2008 an ‰Ê

### an ‰Ê (view profile)

thanks a lot

08 Aug 2008 Matheca ProbStock

The formula used for a Gaussian pdf is wrong. pdf(x)=(A/sqrt(2*sigma)) * exp( -(x-mu)^2 / (2*sigma^2) )...should be used.

Comment only
05 Aug 2008 Changlong Jin

The value of parameter h severely influence the result, in last comment, I use the default value, the fitting result is not correct, it looks more better when h = 0.1, how to solve this automatically?

Comment only
05 Aug 2008 Changlong Jin

there is a problem,
When I fit a data, for example,
y = [0.0651 0.0548 0.0461 0.0686 0.1268 0.2266 0.2292 0.1187 0.0299 0.0146 0.0092 0.0048 0.0032 0.0024];
it gives out a result like this:
yout = [0.0470 0.0594 0.0743 0.0918 0.1120 0.1352 0.1611 0.1897 0.2208 0.2538 0.2884 0.3238 0.3592 0.3937];
it is not a good fitting, how to solve this problem?

29 Jul 2008 David last name

great, thanks!

09 Jul 2008 Marie-Eve Gagne

Thank you very much!
This is exactly what I was looking for!

12 Dec 2007 Dinh Vo
16 Nov 2007 Bob Marley

The code could be written in a more efficient manner -- i.e., using matlab syntax instead of the 'for' loop. Something like:

%% threshold
if nargin==2, h=0.2; end

%% cutting
indx = (y > max(y)*h);

%% fitting
p=polyfit(x(indx), log(y(indx)), 2);
sigma=sqrt(-1/(2*p(1)));
mu=p(2)*sigma^2;
A=exp(p(3)+mu^2/(2*sigma^2));

Comment only
25 Sep 2007 Marinna M

Thanks, this was a great help.

24 Jul 2007 ll ss

very helpful but I don't think you should use logx for calculation and you should just do the polyfit with ylog and x.

22 Jun 2007 Gustavo P

Very smart idea

Comment only
21 Mar 2007 m m