【问题标题】:Matlab. Poisson fit. FactorialMATLAB。泊松拟合。阶乘
【发布时间】:2018-03-15 23:35:37
【问题描述】:

我有一个似乎符合泊松分布的直方图。 为了适应它,我自己声明函数如下

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

我发现一个错误。它可能与“阶乘”有关。有什么想法吗?

【问题讨论】:

  • 为什么factorial(.xdata))中有.
  • 我正在处理一个向量。也许是“。”放置错误。不过应该有吧?
  • 没有。 .** 不同。 * 是点积,.* 是元素乘法。但是阶乘只适用于向量和标量。
  • 我明白了。但是,如果我不放任何“。”无论如何,我在“lsqcurvefit”步骤中发现了一个错误。它说“使用 lsqcurvefit 时出错(第 248 行)函数值和 YDATA 大小不相等”

标签: matlab curve-fitting factorial poisson


【解决方案1】:

阶乘从向量 xdata 输出一个向量。为什么要在阶乘中使用 .xdata?

例如:

data = [1 2 3];

factorial(data) 则为 [1! 2! 3!].

试试./factorial(xdata)(我不记得在这种情况下是否需要点。)

【讨论】:

    【解决方案2】:

    您需要使用 gamma(xdata+1) 函数而不是 factorial(xdata) 函数。 Gamma 函数是阶乘函数的广义形式,可用于实数和复数。因此,您的代码将是:

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

    或者,您可以使用已经优化的 MATLAB fitdist 函数,您可能会得到更好的结果:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多