我需要计算binomial distribution的概率质量函数和累积分布函数。我想用MATLAB来做到这一点(原始MATLAB,没有工具箱)。我可以自己计算这些,但希望使用预定义的函数并找不到任何。那里有东西吗?如何在MATLAB中为二项分布计算PMF和CDF?
function x = homebrew_binomial_pmf(N,p)
x = [1];
for i = 1:N
x = [0 x]*p + [x 0]*(1-p);
end
我需要计算binomial distribution的概率质量函数和累积分布函数。我想用MATLAB来做到这一点(原始MATLAB,没有工具箱)。我可以自己计算这些,但希望使用预定义的函数并找不到任何。那里有东西吗?如何在MATLAB中为二项分布计算PMF和CDF?
function x = homebrew_binomial_pmf(N,p)
x = [1];
for i = 1:N
x = [0 x]*p + [x 0]*(1-p);
end
您可以使用函数NCHOOSEK来计算二项式系数。有了这一点,你可以创建一个计算概率密度函数的值对于给定N
和p
一组k
值的函数:
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返回的二项式系数很大时,最终可能会失去精度。一个非常好的选择是使用MathWorks File Exchange上John D'Errico的提交Variable Precision Integer Arithmetic。通过将您的号码转换为他的vpi
类型,可以避免精度损失。
+1。 nchoosek有助于小N.对于大N来说这是一个问题。 – 2009-12-11 18:26:55
@Jason:非常真实。为了防止它最终成为您的问题,我添加了一些指向John D'Errico提交的MathWorks提交的链接,它允许您执行可变精度整数运算。 – gnovice 2009-12-11 18:44:22
八度提供了一个很好的分布pdf,cdf,分位数集合;他们必须从八度音阶翻译,但这是相对平凡的(将endif
转换为end
,将!=
转换为~=
等)。 octave binocdf二项式cdf函数。
对于PDF
x=1:15
p=.45
c=binopdf(x,15,p)
plot(x,c)
同样CDF
D=binocdf(x,15,p)
plot(x,D)
但是,OP要求“原始MATLAB,没有工具箱”; 'binopdf'和'binocdf'是统计工具箱的一部分。 – zeeMonkeez 2016-03-11 04:47:39
你不想使用统计工具箱太糟糕了......它有功能BINOPDF和BINOCDF。 ;) – gnovice 2009-12-11 20:49:31
当Mathworks修正他们的draconian许可策略时,我将使用我们拥有的工具箱,这使得浮动网络许可证的价格与修复一样昂贵4倍,并且在关闭MATLAB之前不会将网络许可证返回到池中,提供了一种手动将网络许可证返回给池的机制。咆哮不好意思,但你在这里遇到了一些麻烦。 – 2009-12-11 21:17:06