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

Calculating the probability of success in k (or less) Bernoulli trials out of n using matlab

我正在尝试计算 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 次试验中的 success/failure(比如抛硬币 100 次)。我需要我的样本的错误(统计数据的方式......但我不知道统计数据)。所以我想也许我会尝试计算 "how far am I from being correct in all trials" ,这在我的代码中应该是 1-F 。但是 100 次中有 70 次成功给我 error = 0 这显然不是真的..

edit2:在我给出的例子中,我需要在 100 次试验中有 70 次成功的概率。

您已具备回答此问题所需的一切条件。

在您发布的公式中,您对从 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