我需要计算二项分布的概率质量函数和累积分布函数。我想使用 MATLAB 来做到这一点(原始 MATLAB,没有工具箱)。我可以自己计算这些,但希望使用预定义的函数并且找不到任何函数。外面有东西吗?
function x = homebrew_binomial_pmf(N,p)
x = [1];
for i = 1:N
x = [0 x]*p + [x 0]*(1-p);
end
我需要计算二项分布的概率质量函数和累积分布函数。我想使用 MATLAB 来做到这一点(原始 MATLAB,没有工具箱)。我可以自己计算这些,但希望使用预定义的函数并且找不到任何函数。外面有东西吗?
function x = homebrew_binomial_pmf(N,p)
x = [1];
for i = 1:N
x = [0 x]*p + [x 0]*(1-p);
end
octave 提供了很好的分布 pdf、cdf、quantile 集合;它们必须从 octave 转换,但这是相对微不足道的(转换endif
为end
、转换!=
为~=
等;)参见例如octave binocdf以了解二项式 cdf 函数。
您可以使用函数NCHOOSEK来计算二项式系数。这样,您可以创建一个函数,计算k
给定N
和的一组值的概率质量函数值p
:
function pmf = binom_dist(N,p,k)
nValues = numel(k);
pmf = zeros(1,nValues);
for i = 1:nValues
pmf(i) = nchoosek(N,k(i))*p^k(i)*(1-p)^(N-k(i));
end
end
要绘制概率质量函数,您将执行以下操作:
k = 0:40;
pmf = binom_dist(40,0.5,k);
plot(k,pmf,'r.');
并且可以使用CUMSUM从概率质量函数中找到累积分布函数:
cummDist = cumsum(pmf);
plot(k,cummDist,'r.');
注意:当NCHOOSEK返回的二项式系数很大时,您最终可能会丢失精度。一个非常好的替代方法是使用来自John D'Errico在MathWorks File Exchange上提交的Variable Precision Integer Arithmetic。通过将您的数字转换为他的类型,您可以避免精度损失。vpi
看起来对于二项分布的 CDF,我最好的选择是不完全 beta 函数 betainc。
对于 PDF
x=1:15
p=.45
c=binopdf(x,15,p)
plot(x,c)
同样CDF
D=binocdf(x,15,p)
plot(x,D)