概率与测度 (3):概率模型
本文属于概率与测度系列。
系列的前面两篇大致陈述了一下测度论方面的基础,由于这个学期有去旁听《概率论》这门课,所以主要还是按照课程进度来吧,不定期地把课程里一些有意思的内容抽取出来整理在这里。这次就说概率模型。
先从一个例子开始,比如一个盒子里放了 8 个黑球和 2 个白球,从盒子里随机拿一个球,问它是白球的概率是多少,大家都会不假思索地说,1/5 。的确,这似乎是很显然的,不过,实际上我们是用了一个模型来进行概率分析,但是由于这个情况实在太简单了,我们根本就没有注意到模型的存在性,但是换一个稍微简单的例子,要忽略模型“走捷径”有时候就会一下子想不清楚了。比如两个人各掷一个骰子,问 A 得到的点数比 B 大的概率。这个问题就比刚才那个问题要困难一些了。
最早人们在对这类概率问题进行数学抽象的时候,归纳出来的一种模型,现正称为古典概率模型。该模型包由一个包含有限个(设为 $N$)元素的样本空间 $\Omega$ 组成,$\Omega$ 中的每一个元素称为一个基本事件,$\Omega$ 的任意一个子集是一个事件。所有基本事件的概率是相等的,即 $1/N$ ,而任意事件的概率即为该集合的元素个数乘以 $1/N$ ,换句话说:
\[
P(A) = \frac{|A|}{N}
\]
也就是该事件集合的元素个数除以样本空间的总元素个数。对于第一个例子,我们可以这样建立模型:对每一个球编号,一共 1 到 10 号,设 8 号和 9 号是白球,其他的都是黑球,样本空间 $\Omega$ 为 {抽到的是 1 号球、抽到的是 2 号球、……、抽到的是 10 号球} ,而“抽到白球”这个事件集合即 {抽到的是 9 号球、抽到的是 10 号球} ,简单计算立即得到 1/5 的概率。
对于第二个问题,我们用一个 tuple $(x,y)$ 来记两次掷骰子的结果,则整个样本空间集合为 {$(x,y)$, $x=1,\ldots,6$, $y=1,\ldots,6$} 一共 36 个元素,要计算 A 的点数大于 B 的点数这个事件中基本事件的个数,只要暴力数一遍就好了(当然有更好的办法,例如先去掉相等的点数,然后利用对称性,但是这种具体的细节不是我们这里要关注的东西)。
心里有精确的模型存在的时候,就不至于“凭感觉”去想问题而导致各种混淆和错误了。不过古典概率模型实际上限制是比较大的,首先一个是各个基本事件的概率是一样的,这一点可以稍作修改得到稍微改进的版本。不过最主要的限制还在于样本空间必须是有限的这个问题上,在这里没有办法做直接推广,因为古典概率模型中事件的概率实际上就是把事件中包含的基本事件的概率全部加起来而得到的,但是如果集合的元素并不限制为有限个的话,求和式是不是有意义并且收敛就不一定能保证了。
除了古典概率模型之外呢,还有一个比较直观的模型叫做几何概率模型。它的样本空间为 $\mathbb{R}^n$ 上的一个“可求体积”的图形;基本事件是该图形中的点,而基本事件的概率为零;事件则是该图形的“可求体积”的子图形,一个事件 $A$ 的概率通过如下公式计算:
\[
P(A) = \frac{V_A}{V}
\]
其中 $V$ 表示样本空间的体积,而 $V_A$ 表示事件 $A$ 的体积。关于“可求体积”这个模糊的概念,我们待会再说。这里先举一个例子。比较有名的例子当属 Buffon’s needle 了,它有一个有趣的应用就是可以用来估计 $\pi$ 的值。这个例子虽然也不难,但是为了节省时间(好困…… ~_~),我们直接讲一个最简单直接的例子:在平面上有一个矩形,矩形里有一个圆,从矩形里任意选一个点,这个点落在圆内的概率是多少?这个问题正好就适合这里提到的几何概率模型——模型都不用建了,问题本身就已经建好了,比如,假设矩形是以原点为中心,边长为 2 的正方形,而圆是以原点为中心,半径为 1 的圆,那么根据刚才的公式,立即可以算出来概率为 $P=\pi/4$ 。
另一方面,我们知道(为什么?)具体试验所得到的频率是趋向于该事件的概率的。因此,我们可以通过做实验的方法来估算概率 $P$ ,从而反过来得到 $\pi$ 的数值。在这里我就纯粹用程序来模拟一下:
require 'open-uri' EDGE_LEN = 1.2 def rand_ptr return [2*EDGE_LEN*rand-EDGE_LEN, 2*EDGE_LEN*rand-EDGE_LEN] end $rnd_org_nums = [] def rnd_org_rand_num if $rnd_org_nums.empty? puts "Getting new random numbers from random.org" $rnd_org_nums += open('http://www.random.org/decimal-fractions/?num=10000&dec=10&col=1&format=plain&rnd=new'). read.split.map { |s| s.to_f } end return $rnd_org_nums.pop end def rnd_org_rand_ptr return [2*EDGE_LEN*rnd_org_rand_num-EDGE_LEN, 2*EDGE_LEN*rnd_org_rand_num-EDGE_LEN] end $dev_rnd_nums = [] INT32_MAX = 2**32 def dev_rnd_rand_num if $dev_rnd_nums.empty? puts "Getting new random numbers from /dev/urandom" $dev_rnd_nums += open('/dev/urandom').read(10000*4).unpack("L*"). map { |i| i.to_f / INT32_MAX } end return $dev_rnd_nums.pop end def dev_rnd_rand_ptr return [2*EDGE_LEN*dev_rnd_rand_num-EDGE_LEN, 2*EDGE_LEN*dev_rnd_rand_num-EDGE_LEN] end def in_circle(ptr) ptr[0]*ptr[0] + ptr[1]*ptr[1] <= 1 ? 1 : 0 end def find_freq(n) (1..n).map { #in_circle(dev_rnd_rand_ptr) in_circle(rand_ptr) }.inject(0) {|a,b| a+b}.to_f / n end pi = find_freq(50000)*(2*EDGE_LEN)*(2*EDGE_LEN) puts "Pi = #{pi}"
其实代码不用这么长的,写了这么多是因为除了用 Ruby 自带的伪随机数生成器来随机之外,还尝试了 Linux kernel 附带的据说“随机性更好”的伪随机数生成器 /dev/urandom (如果直接用真随机的 /dev/random 的话,经常 block 住……)。另外还尝试了下 random.org 提供的真随机数服务来获取随机数——不过似乎很容易就超过每天的 quota 了。到底什么样的随机数“更加随机”嘛,我想下面这个呆伯特的漫画很能说明问题:
模拟的结果不是很理想,基本上保证能算对 3.1 这两位吧,也许重复次数增加会稍微好一点。不过传说曾经有人用 Buffon’s needle 模型(应该和这里差不多的)做实验数千次之后算到了 $\pi$ 的 7 位精度,听上去似乎是运气相当相当好才能达到这样的精度哦。不知道可否算一下:用这样的实验方法达到 7 位精度的概率是多少呢?
最后,再来说一下刚才提到的“可求体积”这个很不精准的概念,实际上看过前两次介绍或者对测度论有所了解的同学肯定已经明白是什么意思了,其实就是“可测”的意思。为了将这些不精确的地方精确化,将以前的那些概率模型归纳起来,建立一个严格的数学模型,作为现代概率论之父的 Andrey Kolmogorov 在测度论的基础上建立了公理化的现代概率模型。
在公理化体系里,一个概率空间由一个三元组 $(\Omega, \mathcal{A}, P)$ 组成,其中 $\Omega$ 是样本空间,$\mathcal{A}$ 是 $\Omega$ 的一个子集族,它必须是一个 $\sigma$-Algebra ,我们在最开始关于测度的介绍中也提到过,一个 $\sigma$-Algebra (或者称 $\sigma$-field )是满足如下三条公理的一个集族:
- $\emptyset\in \mathcal{A}$, $\Omega\in\mathcal{A}$
- $A\in\mathcal{A}\Rightarrow A^c\in\mathcal{A}$,这里 $A^c$ 表示 $A$ 的补集
- $A_i\in\mathcal{A},i\geq 1\Rightarrow \bigcup_{i=1}^\infty A_i \in\mathcal{A}$
而 $P$ 则是一个概率测度,它也必须满足三条公理:
- $P(\emptyset)=0$, $P(\Omega)=1$
- $P(A)\geq 0$, $\forall A\in\mathcal{A}$
- 可列可加性
很明显可以看到,“概率测度”所满足的公理实际上就是“测度”的公理再加上了上面的第一条归一化,使得全概率等于 1 。因此,公理化的概率空间,说白了实际上就是一个归一化了的测度空间。
前面提到的两种概率模型实际上都是这种公理化模型的特殊情况。例如古典概率模型,$\Omega$ 是所有基本事件构成的集合,$\mathcal{A}$ 是 $\Omega$ 的 power set ,也就是所有子集构成的集族,而 $P$ 就是我们以前曾经介绍过的 Counting measure 再加以归一化的结果。
而几何概率模型则更直接一点,那里的“可求体积”实际上就是指该集合(Lebesgue)可测,而概率测度就是普通的 $\mathbb{R}^n$ 上的 Lebesgue 测度再通过全集 $\Omega$ 的测度来归一化之后的结果。