用matlab模拟硬币试验,输入怎么抛硬币让硬币立起来次数,输出该次实验硬币正面的概率,要求保留小数点后两位

当前位置: >>
用计算机模拟掷硬币试验
随机数 试验次数反面次数1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 1 1 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 0 0 50 100 150 200 250 300 350 400 450 500 550 600 650 700 750 800 850 900 950 00 50 00 50 00
43 70 96 117 141 162 185 209 232 263 284 318 339 362 397 422 446 470 frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$13510.5) frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$) frequency($a$2:$a$)正面频率51 101 151 201 251 301 351 401 451 501 551 601 651 701 751 801 851 901 951 01 51 01 51 01
1 1 1 1 1 1 1 1 1 0 0 1 0 1 0 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 1 0 1 1 0 0 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 0 1 1 0 0 0 1 0 0 1 0 1 1 1 0 0 1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 0 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 1 1 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 1 1 1 1 0 1 0 1 0 0 1 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1 1 0 1 0 1 1 1 0 1 1 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 1 1 0 0 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 1 1 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 0 1 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 0 1 1 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 1 1 0 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 0 1 1 0 1 1 0 0 1 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 0 0 0 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 0 0 1 0 1 1 1 1 0 1 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 1 1 0
更多搜索:
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。MATLAB并行编程(一)
并行问题的由来——从抛硬币说起
&举个简单的例子:抛100次硬币统计正面向上的次数。我们可以拿一个硬币重复地抛100次。但有人嫌麻烦,就想能不能再叫一个人带另外一个硬币过来,两个人同时抛,这样每个人就能只抛50次了,节约了时间,并行的思想初现。问题来了,必须保证这2个硬币完全相同以及抛硬币者的动作一致性,才能确保该并行试验的完备性。那么怎么能够保证这两个条件呢?几乎不可能。但我们的计算机软件就能保证试验对象的完全一致性,因为我们可以设置伪随机数的初始种子在每次重复试验的时候一模一样,计算机软件在整数域上的计算上只要不溢出,是100%正确的。
&回到现实,可能很多人都会说自己的仿真好慢好慢,有时候一个仿真可能要1个月。其实,究其根本,仿真之所以这么慢,并不是我们的算法复杂度有多高,根本原因是我们仿真的问题大多情况下是一个随机过程,我么需要不停地拿随机数据去验证算法是否正确。不管是电子、金融,航空航天,亦或是其它领域,我们所面对的问题都是一个随机过程。在概率论中就有一条很著名的公理:当试验的次数趋于无穷大的时候,事件发生的频率才等于概率。该理论思想也导致了蒙特卡洛仿真模型的诞生。所以,为了验证自己算法设计的准确性,我们一般都需要尝试很多次试验,即仿真很大的数据量,这样才能和我们自己推出的理论结果进行有意义的比较。
&由此,从这里切入并行的概念。我们可以让不同的人或者计算机同时进行相同的试验,这就叫并行。用更专业的解释:利用多核、多处理器或者计算机集群进行运算都可以叫做并行处理。目前我们电脑中常用的软件基本都是串行的,在数字IC/FPGA领域,很多的EDA软件都支持并行,比如,Quartus中的P&R就可以并行。当然,并不是所有软件能设计为并行,并行软件的设计是要有前提条件的,下一节会讲。
能够并行运行的条件
&若要并行,必须满足以下2个条件之一:
每次循环之间是相互独立的;
循环执行完之后的结果和循环执行的先后次序无关。
第1条的例子
for k = 1 : 100
即每次循环的k之间是互不相关的。
第2条的例子
for k = 1 : 100
& &s = s +
等差数列的和和加法的次序无关,可以从1顺序加到100,但也可以先加100,再加99……这种和循环执行的先后次序无关的操作在MATLAB中叫简约循环,也能在MATLAB中并行化。
&本人做通信相关,通信系统的仿真一般都要跑系统在不同SNR下的性能,其中每个SNR的仿真过程互不影响,满足以上并行的第一个条件。所以,这就是我们并行仿真的切入点。我们可以让不同的处理单元(Processing
Unit)仿真不同SNR下的性能。
MATLAB并行开关
&以matlabpool为关键字的命令。关于matlabpool的用法,Help中一大堆,这里就不细讲了,列举几个常用的命令:
matlabpool open %
以默认配置方式打开MATLAB并行开关
matlabpool open size %
打开MATLAB并行开关并指明并行的核数为size
matlabpool close %
关闭MATLAB并行开关
& &目前Intel的CPU很多都支持超线程(Hyper
Threading,HT)技术,双核4线程或者4核8线程的CPU比比皆是,在windows下最大的并行度只能到核数,而不是线程数,而在Linux下有告诉我说可以最多开到线程数的,我也没试过,这里就抛砖引玉吧。常用的就以上3条命令。
MATLAB并行工作原理
&MATLAB并行基于client-worker模式。首先,MALTAB有个总体负责的client,它将任务合理分配给每个worker,worker的个数即为上一节matlabpool
size命令中的size。每个worker运行完之后将结果回传给client。这样,当client接收到所有的结果后,程序运行完成。
&打开了MATLAB并行开关之后,我们可以在任务管理器中看到MATLAB进程的数目是size+1,即为client和worker的数目和。在运行过程中,worker会满载CPU;但是client不会满载CPU,它只负责分配任务、传递数据和最后的数据采集。
在MATLAB中编写并行代码
&好了,现在我们知道什么样的代码能够并行执行了,也知道如何在MATLAB中打开并行开关了,那么接下来就介绍如何在MATLAB中编写最简单的并行代码:parfor
& &parfor,从字面意思就可以看出,parallel
for,即并行的for循环。
&parfor循环把变量分为五类:循环变量、广播变量、临时变量、分段变量以及简约变量。虽然有时候我们把for直接改成parfor后没有出现什么问题,但一旦遇到稍微复杂的代码,就会不知所措。搞清楚这五类变量不仅能够避免语法错误,更重要的是能够提高MATLAB的效率,减小代码的运行时间。举例如下:
parfor k = 1 : 100 % k为循环变量
& 10 % 广播变量
& & b = 10; % 临时变量
& & c(k) =
k; % 分段变量,输入属性
1e3; % 临时变量
+ % 简约变量
循环变量:即代码中的k。
广播变量:该变量不是由worker产生,而是当client把任务分配给worker时传给worker的,每个worker都会接收到此类变量。
临时变量:在worker中产生,worker执行完任务之后clear掉,也不会传递给client的变量。
分段变量:这是parfor中最为重要的变量,可以具有输入和输出两类属性。
简约变量:之前已经介绍过了,不再赘述。
&这5种变量的详细说明在Help中都有,要写出来的话会花大量的篇幅,省略。
并行编程之优化
&从前面的描述已经知道,MATLAB的并行程序运行是基于client-worker模式,那么我们的优化目标也会集中在以下2方面:
针对worker的优化;
针对client和worker之间数据交互的优化。
&第一个问题,针对worker的优化,我的前一篇博文《MATLAB并行编程》已经说了一些技巧,这些技巧完全适用于此。
&第二个问题,针对client和worker之间数据交互的优化。我们要尽量减小client和worker之间传递的数据量以节省时间。
一个关键的问题:还用预分配内存吗?上一篇博文《MATLAB并行编程》
中曾经提到过要在循环之前预分配内存。但是到了并行编程,这个原则应当被摒弃。因为一旦在parfor之前预分配内存了,该分段变量就具备了输入属性,已在client中生成了,client再将其分段传递给不同的worker,这会消耗额外的时间。所以,我们的原则是:分段变量能不增加输入属性就不增加。
&假设单核运行某程序需要时间t,那么N核并行运行的程序的执行时间为t/N+e,这里的e代表的就是client和worker之间数据交互所占用的时间。只要我们这部分的优化做得好,是可以让e相对于t/N忽略不计的。
并行编程之调试
&一般推荐先用for循环写好,程序运行正常之后把for改成parfor,这时如果运气好的话可以直接并行运行,但往往会报一些warning或者error,这就要考验我们对于上几节所说的变量分类了。而且就算没报warning或者error,程序在运行过程中也可能出错,往往这种错误不像串行程序报出是在哪一行的错误,并行的错误一般都会报出“No
Remote Error
Stack”,按照字面意思就知道,没有栈信息。因为按照普通的代码,调用函数前会先将变量入栈以及保护现场,而到了并行编程,每个worker出错的具体情况是不会回传给client的。因此,我们很难通过返回到command
window的错误信息判断程序到底出了什么错。
&在parfor循环内部是不能加断点的,这其实也很好理解,本来不同的循环变量针对的就是不同的worker,在parfor内部加断点的话,软件根本不知道编程人员想要看哪个worker的数据。
&不过,MATLAB还提供了另一种并行调试模式——pmode,主要命令下面3条:
pmode start % 开启并行调试(默认核数)
pmode start size %
开启size个核的并行调试
pmode exit % 退出并行调试模式
&但自己用过一段时间pmode,老实说,不好用。用该调试模式的话需要手动一行一行输m语言。而且在每个worker中的变量还需要手动传递到client,就是各种不方便。还是希望MATLAB以后能支持直接在Editor中的parfor循环内部加断点(虽然就像上段所说会有困难,但相信MathWorks公司的攻城狮一定能解决这个问题!),再加上一些labindex类似的调试语法规则,这样一定能大大提高程序设计人员的开发效率。
其它MATLAB并行编程
除了基于parfor的并行,MATLAB还支持其他种类的并行:
SPMD(Single Program Multiple
Data),即单指令多数据,即假使我们有一个很大的数据文件,用串行的代码可能要读取很久,现在将数据文件分割,用相同的程序读取不同的数据。这种并行方式很适合目前炒的火热的海量数据处理。
基于cluster的并行。parfor只能在一台电脑上的单CPU中的不同核上进行并行运算,这明显还是太弱了,MATLAB也支持在一台电脑的多CPU上并行,甚至还能支持多台电脑并行处理,往更大的说,即基于cluster的并行。不过,这时client和worker之间的通信已经不再是核间通信了或者一台电脑内部的CPU之间的通信了,而是基于局域网的通信,局域网的速度特会大大影响并行代码的执行效率。不过现在千兆以太网随处可见,只要通信量不是特别大,估计整个程序的瓶颈还是在每个worker上的代码优化。
基于GPU的加速。最近2年GPU加速(不仅仅是针对MATLAB平台)也是炒的沸沸扬扬,很幸运MATLAB也支持GPU加速,不过对这部分的内容丝毫不懂。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。从抛硬币试验看概率论的基本内容及统计方法
发表于 日 21:40 | Hits: 3013
一般说到概率,就喜欢拿抛硬币做例子。大多数时候,会简单认为硬币正背面的概率各为二分之一,其实事情远没有这么简单。这篇文章会以抛硬币试验为例子并贯穿全文,引出一系列概率论和数理统计的基本内容。这篇文章会涉及的有古典概型、公理化概率、二项分布、正态分布、最大似然估计和假设检验等一系列内容。主要目的是以抛硬币试验为例说明现代数学观点下的概率是什么样子以及以概率论为基础的一些基本数理统计方法。
概率的存在性
好吧,首先我们要回答一个基本问题就是概率为什么是存在的。其实这不是个数学问题,而是哲学问题(貌似一般存在不存在啥的都是哲学问题)。之所以要先讨论这个问题,是因为任何数学活动都是在一定哲学观点前提下进行的,如果不明确哲学前提,数学活动就无法进行了(例如如果在你的哲学观点下概率根本不存在,那还讨论啥概率论啊)。
概率的存在是在一定哲学观点前提下的,我不想用哲学术语拽文,简单来说,就是你首先得承认事物是客观存在的,并可以通过大量的观察和实践被抽象总结。举个例子,我们经常会讨论“身高”,为什么我们都认为身高是存在的?因为我们经过长期的观察实践发现一个人身体的高度在短期内不会出现大幅度的变动,因此我们可以用一个有单位的数字来描述一个人的身体在一段不算长的时间内相对稳定的高度。这就是“身高”作为被普遍承认存在的哲学前提。
与此相似,人们在长期的生活中,发现世界上有一些事情的结果是无法预料的,例如抛硬币得到正面还是背面,但是,后来有些人发现,虽然单次的结果不可预料,但是如果我不断抛,抛很多次,正面结果占全部抛硬币次数的比率是趋于稳定的,而且次数越多越接近某个固定的数值。换句话说,抛硬币这件事,单次结果不可预料,但是多次试验的结果却在总体上是有规律可循的(术语叫统计规律)。
下面是历史上一些著名的抛硬币试验的数据记录:
罗曼洛夫斯基
可以看到,虽然这些试验在不同时间、不同地点由不同的人完成,但是冥冥中似乎有一股力量将正面的占比固定在50%附近。
后来,人们发现还有很多其它不可预测的事情都与抛硬币类似,例如掷骰子、买六合彩等等,甚至渐渐发现不只这些简单的事情,人类社会方方面面从简单到复杂的很多不可预测的事情宏观上看都具有统计规律。于是人们推测,在某些条件下的一些不可预测事件,都是有统计规律的,或者直观说很多不可预测结果的试验在多次进行后总体上看结果会趋近于一些常数(这个现象后来被严格定义为大数定律,成为概率论最基础的定理之一,下文会提到)。这种可观测现象,成为概率存在的哲学基础,而这些常数就是概率在朴素观点下的定义。
在认识到上述事实后,人们希望将这种规律加以利用(人类文明的发展不就是发现和利用规律么,呵呵),但是想要利用就首先要对概率进行严格的形式化定义,也就是要建立数学模型。比较知名的数学模型有古典概型、几何概率模型和公理化概率,本文将会讨论古典概型和公理化概率。
古典概型是人类对概率和统计规律最早的建模尝试,表达了朴素的数学原则下人们对概率的认识。在表述古典概型之前,需要先定义一些概念。
首先是随机试验。
如果一个同时试验满足下面三条原则,则这个试验称为随机试验:
1、可在相同条件下(相对来说)重复进行。
2、可能出现的结果不止一个,但事先明确知道所有可能的结果(可以是无限个,例如所有自然数,但必须事先明确知道结果的取值范围)。
3、事先无法预测在一次试验中哪一个结果会出现。
显然上面的抛硬币试验是一个随机试验。
然后需要定义样本空间和样本点。一个随机试验的样本空间是这个试验所有可能结果组成的集合,而其中每个元素是一个样本点。例如,抛硬币试验中,样本空间为,其中F表示正面,B表示背面,而F、B就是两个样本点。
另一个非常重要的概念就是随机事件(简称事件):样本空间的一个子集称为一个事件。例如,抛硬币试验有四个不同的事件:,分别表示“既不出现正面也不出现反面”,“出现正面”,“出现反面”和“出现正面或反面”。在不考虑硬币立起来等特殊情况时,第一个事件不可能出现,但它确实是一个合乎定义的事件,叫不可能事件;而最后一个事件必然出现,叫必然事件。
有了上面概念,就可以定义古典概型了:
如果一个概率模型满足 1)样本空间是一个有限集合,2)每一个基本事件(只包含一个样本点的事件)出现的概率相同,则这是一个古典概型。例如,在上面的抛硬币试验中,再定义的概率均为0.5,则就构成了一个古典概型。
古典概型简单、直观,在早期的概率研究中广泛被使用。但是这个模型太朴素太不严格了,在这种不完善的定义下,根本没有办法做严格的数学推理,而且有限样本空间和等可能性在很多现实随机试验中并不满足,甚至对等可能不同定义会导致不同结论。因此必须使用一个更严格的定义,以符合现代数学公理化推导的要求,这就是公理化概率。
公理化概率
公理化概率对概率做如下定义:
概率是事件集合到实数域的一个函数,设事件集合为E,则如若满足:
对于任意事件A,。
对于必然事件S,。
对于两两互斥的事件,有。
公理化概率对概率做了严格的数学定义,可以较好的基于公理系统进行推导和证明。但是,概率模型只是给出了概率“是什么”(定性),没有回答“是多少”(定量)这个问题。也就是说,仅有概率模型,是不能定量回答抛硬币问题的。下面介绍对概率进行定量分析的方法。
度量与估计概率
从公理化概率的角度,我们可以这样定义抛硬币试验的概率:设是正面向上的次数,则如下函数定义了这个概率:
容易验证,这个定义完全符合公理化概率的所有条件。下面就是确定。不幸的是,显然N是无法穷尽的,因为理论上你不可能抛无数次硬币。由于不能精确度量这个概率,因此你必须通过某个可以精确度量的值去估计这个概率,而且还要从数学上证明这个估计方法是靠谱的,最好能定量给出这个估计量的可信程度。而对不可直接观测概率的一个估计度量值就是频率。
频率是这样定义的:事件A的频率是在相同条件下重复一个实验n次,事件A发生的次数在n次实验中的占比。一种简单的估计概率的方法就是用频率当做概率的估计。
例如,我刚刚抛完十次硬币,其中六次正面,四次背面,因此根据此次实验,我估计我这枚硬币出现正面的概率为0.6。这就是频率估计。
不过你一定有疑惑,为什么可以使用频率估计概率?有上面理论依据?如何对估计的准确性做出定理的分析?下面解答这些问题。
频率估计的理论基础是大数定律。毫不夸张的说,大数定律是整个现代概率论和统计学的最重要基石,几乎一切统计方法的正确性都依赖于大数定律的正确,因此大数定律被有些人称为概率论的首要定律。
大数定律直观来看表述了这样一种事实:在相同条件下,随着随机试验次数的增多,频率越来越接近于概率。注意大数定律陈述的是一个随着n趋向于无穷大时频率对真实概率的一种无限接近的趋势。
下面给出大数定律的数理表述,大数定律有多重数学表述,这里取伯努利大数定律:
其中表述在n次试验中事件x出现的次数。伯努利大数定律代表的意义是,当试验次数越来越多,频率与概率相差较大的可能性变得很小。大数定律从数学上严格证明了频率对概率的收敛性以及稳定性。这就是频率估计的理论基础。在后面关于中心极限定理的部分,还将定量给出估计的置信度(表示这个估计有多可靠)。
最大似然估计
下面给出另一种估计概率的方法,就是最大似然估计。最大似然估计是参数估计的一种方法,用于在已知概率分布的情况下对分布函数的参数进行估计。而这里分布函数的参数刚好是要估计的概率。
最大似然估计基于这样一个朴素的思想:如果已经得到一组试验数据,在概率分布已知的情况下,可以将出现这组试验数据的概率表述为分布函数参数的函数。
看到上面的话很多人肯定又晕了,我还是举个具体的例子吧(非数学严格的例子,但思想一致)。我来到一所陌生的大学门口,想知道这所大学男生多还是女生多,我蹲在校门口数了走出校门的100名同学,发现80个男生20个女生,如果我认为这所学校每个学生这段时间内出校门的概率都是差不多的,那么我会推断男生多。因为男生多的学校更大可能性产生我观察的结果。所以,最大似然估计的核心思想就是:知道了结果,但不知道结果所在总体的情况,然后计算在总体在每种可能下产生这个结果的概率,哪种情况下产生已知结果的概率最大,就认为这种情况是总体的情况。
下面正式使用这个方法估计硬币正面出现的概率。
还是上面的实验,我已经得到“抛了十次,六次正面”这个结果,下面我想知道正面向上的概率。由于这个概率是一定存在的(第一节已经说明了哈,在既定哲学观点下),而且这个概率的取值范围应该是0到1的开区间(正面背面都出现过,所以不可能是0或1):
由一些背景知识知道,每抛十次硬币,正面出现的次数服从二项分布:
由于已知n=10,k=6,将其带入,得到一个函数:
其中p的定义域为。这个函数表示的是,当出现正面的真实概率为p时,“抛十次六次正面”这个事件出现的概率。我们希望估计的p让这个函数取值最大,以下是求解过程:
因为在(0,1)区间,ln(x)是x的单调递增函数,所以最大化lnL(p)就等于最大化L(p)。这样做主要是取对数可以让连乘变成连加,方便后面求导。
由微积分知识可知:
让这个导数为0,解得p为0.6,这就是我们对概率的最大似然估计,与概率估计的结果一致。
显著性及假设检验
到此为止,我们已经说明了概率是存在的、建立了概率的数学模型,并能对不可直接观测的概率进行估计。但似乎还缺点什么。
大数定律只说明了理论上我们的估计是靠谱的,但是到底有多靠谱,却无法通过大数定律定量计算。这一节,我们就来解决这个问题:定量计算出估计的可靠性(术语叫显著性)。
评估显著性
还是上面我抛那十次硬币的试验。根据最优的频率估计和最大似然估计,均估计p(出现正面的概率)为0.6。但是如果有人提出异议,说我的估计可能是错的,p实际是0.5,我那个出现六次正面是因为只是偶然性的结果。这时我需要找证据反驳他,由于不能做无数次试验,我只能给出一个较高可信度的证据,例如,我想证明至少95%的可能性出现六次正面是因为p不等于0.5,也就是说,证明如果p为0.5,则偶然出现我这个结果的可能性不超过5%(5%称作显著水平)。
中心极限定理
要评估显著性,首先要借助于中心极限定理。中心极限定理也是统计学的基石定理之一,它的一种表述是:
设随机变量近似服从标准正态分布。
中心极限定理的直观意义是,随便一个服从什么的总体中,你独立随机的抽取一组样本,那么样本的均值服从正态分布,并且可以根据总体的期望和方差推导出这个均值服从的正态分布的期望和方差,然后简单变换一下就可以得到一个服从标准正态分布的随机量。由于标准正态分布的概率密度函数是已知的,那么就可以得到这个量出现的概率。
这样说貌似太抽象了,我们下面还是看这个定理的应用实例吧。
上面说过,我要反驳的是抛硬币得到正面的实际概率是0.5,那么我就要证明如果p是0.5,则得到这组结果的概率是很小的(上面要求小于5%)。
设正面取值为1,背面取值为0。如果p是0.5,则每一次抛硬币的取值服从一个p为0.5的0-1分布。由期望及方差的定义可知,这个分布的期望和方差分别为:
由中心极限定理近似服从标准正态分布。
而我抛的十次硬币可以看做十个独立随机抽样,它们的均值是0.6,变换后的值为。
标准正态分布的概率密度公式为:
上面说过,我们希望显著水平是5%,所以,我需要找到x=z,使得此概率密度函数从-z到z的定积分为0.95,然后看0.632在不在[-z, z]内,如果在的话,我会认为我确实错了,至少我没有95%以上的把握说p不等于0.5,而如果0.632不再这个范围内,则我可以拍着胸脯说,我已经从理论上证明我有95%以上的把握,p不是0.5(换句话说,如果p是0.5,抛十次六次正面的可能性不足5%)。
坦白说这个z不是很好算,不过还好由于这东西特别常用,任何一本概率课本后面都可以找到标准正态分布表(或者很多工具如R语言可以直接计算分位点),下面就是我在网上找到的一个(来源):
这是一个单侧表,要保证显著水平为5%,则单侧积分上限不能低于0.475,通过查上表,可知0.475对应的z是1.96,远大于我们算出的0.632。很不幸,我在5%的显著水平下无法拒绝p=0.5的假设。同时通过上表可以看到,0.63对应的单侧概率是0.2357,也就是说,通过抛十次得到六次正面,我们只有约50%的把握说出现正面的概率不是0.5。换句话说,抛十次硬币来做频率估计是不太合适的,于是,我们需要增加试验次数。
假如,我又做了100次实验,抛出了60次正面,40次背面。那么这个试验结果可以显著的认为p不是0.5吗?用同样的方法算出。很显然,2.0大于1.96,所以这个试验结果可以充分(超过95%的可能)说明这枚硬币正面朝上的概率确实不是0.5。通过查表可以看到,2.0的显著水平约为0.046,换句话说,这次试验结果95.4%以上表明硬币正面出现的概率不是0.5。当然,也有可能结论是错误的,因为毕竟还有4.6%的可能这是在p=0.5的情况下偶然出现的。
通过假设检验理论,可以通过增加试验次数,将犯错的概率缩小到任意小的值。
这篇文章以抛硬币试验为引子引出了一系列现代数学中概率的基本模型、定理及基本的估计及显著性检验方法。写这篇文章是我无聊抛硬币时一时兴起,其中对很多东西只是给出一个轮廓,没有处处给出严格的定义和证明,不过大约说明了常用的一些统计方法及其理论基础,限于篇幅不能面面俱到,例如一个假设检验如果展开写可以单独写一篇文章。目前随着大数据概念的热炒,基于互联网的数据挖掘和机器学习也变得火热,其实很多数据挖掘和机器学习都是基于概率和统计理论的,很多方法甚至只是传统统计方法的应用。因此如果准备在这方面深入学习,不妨考虑先在概率论和数理统计方面打好基础。
评价列表(0)

我要回帖

更多关于 抛硬币怎么抛 的文章

 

随机推荐