首页 > 解决方案 > 使用matlab计算n次(或更少)次伯努利试验中成功的概率

问题描述

我正在尝试计算 100 次伯努利试验中 70 次(或更少)的成功概率。我用 Matlab 编写了它。但是,我得到的概率是 1(它不可能是 1,因为它在所有 100 次试验中都没有成功)。

我的功能正常吗?

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 这显然不是真的..

编辑2:在我在这里给出的示例中,我需要在 100 次试验中有 70 次成功的概率。

在此处输入图像描述

标签: matlabperformancestatisticsprobabilitybinomial-cdf

解决方案


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

在您发布的公式中,您将 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。然而,我们知道它必须略小于 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

推荐阅读