matlab - 使用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 次成功的概率。
解决方案
您确实拥有回答这个问题所需的一切。
在您发布的公式中,您将 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
推荐阅读
- angular - angular-cli 无法正常工作
- node.js - 不同机器之间的节点js同步
- ffmpeg - 如何使用 Google 的 Cloud Speech-to-Text REST API 转录视频
- javascript - 如何选择“.on show.bs.modal”内的触发按钮[Bootstrap modal]
- python - 将除以零解释为 nan
- python - 获取 3D 对象网格上的像素坐标(python)
- ios - 故事板中的安全区域错位
- angular - 重新加载部署在 tomcat 服务器上的 Angular 应用程序时出现 404 错误
- ios - 无法在 swift iOS 中处理 http 代码?
- android - ITelephony.endCall() 不再用于阻止 Android 8/Android O/API 26 中的呼叫