使用Matlab计算出n项中的k项(或更少)伯努利试验成功的概率

时间:2019-11-11 12:32:39

标签: matlab performance statistics probability binomial-cdf

我正在尝试计算100项试验中有70项(或更少)伯努利试验成功的可能性。我是用Matlab编写的。但是,我得到的概率为1(由于在所有100次试验中均未成功,所以不可能为1)。

我的功能还可以吗?

syms k
f = nchoosek(100,k)*0.5^k*0.5^(100-k);
F = double(symsum(nchoosek(100,k)*0.5^k*0.5^(100-k),k,0,70));

如果是的话,我该如何在Matlab中获得更准确的冲销?

谢谢

修改: 我有一个二进制矢量,表示n次试验中的成功/失败(例如掷硬币100次)。我需要样本错误(统计信息的方式..但我不知道统计信息)。因此,我认为也许我将尝试计算“我在所有试验中都离正确有多远”,在我的代码中应为1-F。但是,那么100中有70次成功给了我error = 0,这显然是不正确的。

edit2 :在我给的示例中,我需要100次试验中有70次成功的可能性。

enter image description here

1 个答案:

答案 0 :(得分:1)

您确实拥有回答此问题所需的一切。

在您发布的公式中,您将概率总计为0到70,即它将计算出0或1或2 ..或70成功的概率,这意味着70或更少的成功。

没有总和,您将获得完全k个成功的概率。准确获得70次成功的概率是:

k = 70;
f = nchoosek(100,k)*0.5^k*0.5^(100-k)
Warning: Result may not be exact. Coefficient is greater than 9.007199e+15 and is only
accurate to 15 digits 
> In nchoosek (line 92) 

f =

   2.3171e-05

您会收到一条警告,提示nchoosek(100,70)的计算不正确(请参见下文,这是一种更好的方法)。

要计算获得70个或更少成功的概率,请对获得0或1或.. 70个成功的概率求和:

>> f = 0;
>> for k=0:70;
f = f + nchoosek(100,k)*.5^k*.5^(100-k);
end

您会收到很多警告,但可以看看f

>> f

f =

    1.0000

如您所见,如果四舍五入到四位数,则概率为1。但是,我们知道,它一定要比一个小。如果我们要求Matlab显示更多数字:

>> format long

我们看到它不完全是1:

>> f

f =

   0.999983919992352

如果您计算1-f,您将看到结果不是0(我转回显示较少的数字):

>> format short
>> 1-f

ans =

   1.6080e-05

为了摆脱警告并简化计算概率的代码,Matlab提供了一些函数来处理二项式分布。要获得70次成功的概率,请使用

>> binopdf(70,100,.5)

ans =

   2.3171e-05

并获得70或更少的成功:

>> format long
>> binocdf(70,100,.5)

ans =

   0.999983919992352