2017-07-15 1 views
0

J'essaie d'ajuster les données d'histogramme qui semblent suivre une distribution poisson. Je déclare la fonction comme suit et essaie de l'ajuster en utilisant la méthode des moindres carrés.Estimation des paramètres PDF de Poisson à l'aide de l'ajustement de courbe dans MATLAB

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=[60]; %Approximated value of the parameter lambda to help the fit 

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

je rencontre cependant le problème suivant

Error using snls (line 48) 
Objective function is returning undefined values at initial point. 
lsqcurvefit cannot continue. 

Je l'ai vu en ligne qu'il avait parfois de le faire avec une division par zéro par exemple. Cela peut être résolu en ajoutant une petite quantité dans le dénominateur afin que cette indétermination n'arrive jamais. Cependant, ce n'est pas mon cas. Quel est le problème alors?

Répondre

0

J'ai implémenté les deux méthodes (maximum de vraisemblance et ajustement de courbe PDF). Vous pouvez voir le code dans mon Stack Overflow Q45118312 Github Repository.

Résultats:

enter image description here

Comme vous pouvez le voir, le maximum de vraisemblance est plus simple et mieux (MSE Wise).
Vous n'avez donc aucune raison d'utiliser la méthode PDF Fitting.

Une partie du code qui fait le levage de charges lourdes est:

%% Simulation Parameters 

numTests   = 50; 
numSamples   = 1000; 
paramLambdaBound = 10; 
epsVal    = 1e-6; 

hPoissonPmf = @(paramLambda, vParamK) ((paramLambda .^ vParamK) * exp(-paramLambda)) ./ factorial(vParamK); 


for ii = 1:ceil(1000 * paramLambdaBound) 
    if(hPoissonPmf(paramLambdaBound, ii) <= epsVal) 
     break; 
    end 
end 

vValGrid = [0:ii]; 
vValGrid = vValGrid(:); 

vParamLambda = zeros([numTests, 1]); 
vParamLambdaMl = zeros([numTests, 1]); %<! Maximum Likelihood 
vParamLambdaCf = zeros([numTests, 1]); %<! Curve Fitting 


%% Generate Data and Samples 

for ii = 1:numTests 

    paramLambda = paramLambdaBound * rand([1, 1]); 

    vDataSamples = poissrnd(paramLambda, [numSamples, 1]); 
    vDataHist  = histcounts(vDataSamples, [vValGrid - 0.5; vValGrid(end) + 0.5])/numSamples; 
    vDataHist  = vDataHist(:); 

    vParamLambda(ii) = paramLambda; 
    vParamLambdaMl(ii) = mean(vDataSamples); %<! Maximum Likelihood 
    vParamLambdaCf(ii) = lsqcurvefit(hPoissonPmf, 2, vValGrid, vDataHist, 0, inf); %<! Curve Fitting 
end 
0

C'est la mauvaise façon de le faire. Vous avez des données que vous croyez agir selon Poisson Distribution.
Étant donné que le Poisson Distribution est paramétré par paramètre unique (Lambda), vous devez appliquer l'estimation de paramètre. La manière classique de le faire est Maximum Likelihood Estimation. Pour ce cas, Poisson Distribution, vous devez suivre le MLE of Poisson Distribution.
À savoir, il suffit de calculer la moyenne des données de l'échantillon comme on peut le voir dans poissfit().

+0

Je ne savais pas que c'était pas la bonne façon de le faire. Merci pour le commentaire! Quoi qu'il en soit, lsqcurvefit devrait être capable de me donner un résultat pour le paramètre. J'ai essayé avec un pdf poisson connu et ça m'a donné un résultat. Quel est le problème alors? –

+0

Je n'ai pas compris votre commentaire. Pourquoi n'utilisez-vous pas ce que j'ai suggéré? – Royi

+0

Je vois maintenant que la méthode MLE est meilleure. Cependant, je me demandais encore pourquoi la méthode des moindres carrés ne fonctionnait pas. –