F. Piza
F. Piza

Reputation: 7

Matlab. Poisson fit. Factorial

I have a histogram that seems to fit a poisson distribution. In order to fit it, I declare the function myself as follows

xdata; ydata; % Arrays in which I have stored the data. 
%Ydata tell us how many times the xdata is repeated in the set.

fun= @(x,xdata) (exp(-x(1))*(x(1).^(xdata)) )/(factorial(xdata)) %Function I 
% want to use in the fit. It is a poisson distribution.

x0=[1]; %Approximated value of the parameter lambda to help the fit

p=lsqcurvefit(fun,x0,xdata,ydata); % Fit in the least square sense

I find an error. It probably has to do with the "factorial". Any ideas?

Upvotes: 0

Views: 596

Answers (2)

Pooya
Pooya

Reputation: 51

You need to use gamma(xdata+1) function instead of factorial(xdata) function. Gamma function is a generalized form of factorial function which can be used for real and complex numbers. Thus, your code would be:

fun = @(x,xdata) exp(-x(1))*x(1).^xdata./gamma(xdata+1);
x = lsqcurvefit(fun,1,xdata,ydata);

Alternatively, you can MATLAB fitdist function which is already optimized and you might get better results:

pd = fitdist(xdata,'Poisson','Frequency',ydata);
pd.lambda

Upvotes: 0

vahvero
vahvero

Reputation: 663

Factorial outputs a vector from vector xdata. Why are you using .xdata in factorial?

For example:

data = [1 2 3];

factorial(data) is then [1! 2! 3!].

Try ./factorial(xdata) (I cannot recall if the dot is even necessary at this case.)

Upvotes: 1

Related Questions