2009-12-11 284 views
1

我需要计算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 
+0

你不想使用统计工具箱太糟糕了......它有功能BINOPDF和BINOCDF。 ;) – gnovice 2009-12-11 20:49:31

+0

当Mathworks修正他们的draconian许可策略时,我将使用我们拥有的工具箱,这使得浮动网络许可证的价格与修复一样昂贵4倍,并且在关闭MATLAB之前不会将网络许可证返回到池中,提供了一种手动将网络许可证返回给池的机制。咆哮不好意思,但你在这里遇到了一些麻烦。 – 2009-12-11 21:17:06

回答

1

您可以使用函数NCHOOSEK来计算二项式系数。有了这一点,你可以创建一个计算概率密度函数的值对于给定Np一组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 ExchangeJohn D'Errico的提交Variable Precision Integer Arithmetic。通过将您的号码转换为他的vpi类型,可以避免精度损失。

+1

+1。 nchoosek有助于小N.对于大N来说这是一个问题。 – 2009-12-11 18:26:55

+0

@Jason:非常真实。为了防止它最终成为您的问题,我添加了一些指向John D'Errico提交的MathWorks提交的链接,它允许您执行可变精度整数运算。 – gnovice 2009-12-11 18:44:22

1

八度提供了一个很好的分布pdf,cdf,分位数集合;他们必须从八度音阶翻译,但这是相对平凡的(将endif转换为end,将!=转换为~=等)。 octave binocdf二项式cdf函数。

-1

对于PDF

x=1:15 
p=.45 

c=binopdf(x,15,p) 

plot(x,c) 

同样CDF

D=binocdf(x,15,p) 

plot(x,D) 
+1

但是,OP要求“原始MATLAB,没有工具箱”; 'binopdf'和'binocdf'是统计工具箱的一部分。 – zeeMonkeez 2016-03-11 04:47:39