2009-12-11 286 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