2017-07-15 100 views
0

我試圖將直方圖數據擬合,似乎遵循泊松分佈。我聲明函數如下,並嘗試使用最小二乘法來擬合它。估算泊松PDF參數用曲線在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 

然而,我遇到了一個問題

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

我已經在網上看到,它有時不得不通過零例如有一個部門的事。這可以通過在分母中加入少量來解決,以便不確定這種不確定性。但是,那不是我的情況。那麼問題是什麼?

回答

0

我實現了這兩種方法(最大似然和PDF曲線擬合)。

你可以看到在我Stack Overflow Q45118312 Github Repository代碼。

結果:

enter image description here

正如你所看到的,最大似然更簡單,更好的(MSE WISE)。
所以你沒有理由使用PDF曲線擬合方法。這確實繁重的代碼

部分是:

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

這是錯誤的做法。
你有你認爲根據Poisson Distribution行事的數據。
由於Poisson Distribution由單一的參數(波長),那麼你需要做的是運用參數估計參數。

經典的方式這樣做是Maximum Likelihood Estimation

對於這種情況,Poisson Distribution,您需要按照MLE of Poisson Distribution
即,只需計算可在poissfit()中看到的數據樣本均值即可。

+0

我不知道這是不是這樣做的正確方法。感謝您的評論!無論如何,lsqcurvefit應該能夠給我一個參數的結果。我嘗試了一個已知的poisson pdf,它給了我一個結果。那麼問題是什麼? –

+0

我沒有理解你的評論。你爲什麼不使用我的建議? – Royi

+0

我現在看到MLE方法更好。但是,我仍然想知道爲什麼最小二乘法不起作用。 –