我需要計算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