2017-07-15 4 views
0

Ich versuche, Histogrammdaten anzupassen, die einer Poisson-Verteilung zu folgen scheinen. Ich erkläre die Funktion wie folgt und versuche sie mit der Methode der kleinsten Quadrate anzupassen.Poisson-PDF-Parameter mit Kurvenanpassung in MATLAB schätzen

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 

begegne mir aber das nächste Problem

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

ich online gesehen habe, dass es manchmal mit einer Division durch Null zum Beispiel zu tun hatte. Dies kann durch Hinzufügen eines kleinen Betrags im Nenner gelöst werden, so dass diese Indetermination niemals stattfindet. Das ist jedoch nicht mein Fall. Was ist das Problem?

Antwort

0

Ich habe beide Methoden implementiert (Maximum Likelihood und PDF Curve Fitting).

Sie können den Code in meinem Stack Overflow Q45118312 Github Repository sehen.

Ergebnisse:

enter image description here

Wie Sie das Maximum Likelihood einfacher und besser ist (MSE Wise) sehen können.
Sie haben also keinen Grund, die PDF-Kurvenanpassungsmethode zu verwenden.

Teil des Codes, der die schwere Arbeit tut, ist:

%% 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

Dies ist der falsche Weg.
Sie haben Daten, von denen Sie glauben, dass sie nach Poisson Distribution handeln.
Da die Poisson Distribution durch einen einzelnen Parameter (Lambda) parametriert wird, müssen Sie Parameter Estimation anwenden.

Der klassische Weg dazu ist Maximum Likelihood Estimation.

Für diesen Fall, Poisson Distribution, müssen Sie die MLE of Poisson Distribution folgen.
Nämlich berechnen Sie einfach den Stichprobenmittelwert der Daten, wie in poissfit() gesehen werden kann.

+0

ich nicht weiß, dass es nicht der richtige Weg war, es zu tun. Danke für den Kommentar! Wie auch immer, lsqcurvefit sollte in der Lage sein, mir ein Ergebnis für den Parameter zu geben. Ich habe versucht, mit einem bekannten Poisson pdf und es gab mir ein Ergebnis. Was ist das Problem? –

+0

Ich habe deinen Kommentar nicht verstanden. Warum benutzt du nicht, was ich vorgeschlagen habe? – Royi

+0

Ich sehe jetzt die MLE-Methode ist besser. Ich fragte mich jedoch immer noch, warum die Methode der kleinsten Quadrate nicht funktionierte. –