注:這兩個定理可以說是概率論中最重要的兩個定理。也是由於中心極限定理的存在,使得正態分布從其他眾多分布中脫穎而出,成為應用最為廣泛的分布。這兩個定理在概率論的歷史上非常重要,因此對於它們的研究也橫跨了幾個世紀(始於18世紀初),眾多耳熟能詳的大數學家都對這兩個定理有自己的貢獻。因此,這兩個定理都不是單一的定理。不同的大數定理和中心極限定理從不同的方面對相同的問題進行了闡述,它們條件各不相同,得到的結論的強弱程度也不一樣。
1. 大數定理(law of large numbers,LLN)

圖1-1,伯努利(1655-1705)
大數定律可以說是整個數理統計學的一塊基石,最早的大數定律由伯努利在他的著作《推測術》中提出並給出了證明。這本書出版於伯努利去世后的1713年。數理統計學中包含兩類重要的問題——對概率p的檢驗與估計。大數定律的本質是一類極限定理,它是由概率的統計定義“頻率收斂於概率”引申而來的。簡單來說就是n個獨立同分布的隨機變量的觀察值的均值$\bar{X}$依概率收斂於這些隨機變量所屬分布的理論均值,也就是總體均值。
舉一個古典概率模型的例子:拿一個盒子,里面裝有大小、質地一樣的球a+b個,其中白球a個,黑球b個。這時隨機地從盒子中抽出一球(意指各球有同等可能被抽出),則“抽出的球為白球”這一事件A的概率p=a/(a+b).但是如果不知道a、b的比值,則p也不知道。但我們可以反復從此盒子中抽球(每次抽出記下其顏色后再放回盒子中)。設抽了N次,發現白球出現了m次,則用m/N去估計p。這個估計含有其程度不確定的誤差,但我們直觀上會覺得,抽取次數N越大,誤差一般會縮小。
從實用的角度看,概率的統計定義無非是一種通過實驗去估計事件概率的方法。大數定律為這種后驗地認識世界的方式提供了堅實的理論基礎。正如伯努利在結束《推測術》時就其結果的意義作的表述:“如果我們能把一切事件永恆地觀察下去,則我們終將發現:世間的一切事物都受到因果律的支配,而我們也注定會在種種極其紛紜雜亂的現象中認識到某種必然。”
1.1 定義
設$X_1, X_2, ..., X_n$是獨立同分布的隨機變量,記它們的公共均值為$\mu$。又設它們的方差存在並記為$\sigma^2$。則對任意給定的$\varepsilon > 0$,有
$$\displaystyle \lim_{ n \to \infty } P(| \bar{X}_n - \mu| \geq \varepsilon) = 0 \hspace{ 10pt } \ldots (1-1)$$
這個式子指出了“當n很大時,$\bar{X}_n$接近$\mu$”的確切含義。這里的“接近”是概率上的,也就是說雖然概率非常小,但還是有一定的概率出現意外情況(例如上面的式子中概率大於$\varepsilon$)。只是這樣的可能性越來越小,這樣的收斂性,在概率論中叫做“$\bar{X}_n$依概率收斂於$\mu$”。
1.2 Python模擬拋硬幣
下面用程序模擬拋硬幣的過程來輔助說明大數定律:
用random模塊生成區間[0,1)之間的隨機數,如果生成的數小於0.5,就記為硬幣正面朝上,否則記為硬幣反面朝上。由於random.random()生成的數可以看做是服從區間[0,1)上的均勻分布,所以以0.5為界限,隨機生成的數中大於0.5或小於0.5的概率應該是相同的(相當於硬幣是均勻的)。這樣就用隨機數模擬出了實際的拋硬幣試驗。理論上試驗次數越多(即拋硬幣的次數越多),正反面出現的次數之比越接近於1(也就是說正反面各占一半).
1 import random 2 import matplotlib.pyplot as plt 3 4 5 def flip_plot(minExp, maxExp): 6 """ 7 Assumes minExp and maxExp positive integers; minExp < maxExp 8 Plots results of 2**minExp to 2**maxExp coin flips 9 """ 10 # 兩個參數的含義,拋硬幣的次數為2的minExp次方到2的maxExp次方,也就是一共做了(2**maxExp - 2**minExp)批次實驗,每批次重復拋硬幣2**n次 11 12 ratios = [] 13 xAxis = [] 14 for exp in range(minExp, maxExp + 1): 15 xAxis.append(2**exp) 16 for numFlips in xAxis: 17 numHeads = 0 # 初始化,硬幣正面朝上的計數為0 18 for n in range(numFlips): 19 if random.random() < 0.5: # random.random()從[0, 1)隨機的取出一個數 20 numHeads += 1 # 當隨機取出的數小於0.5時,正面朝上的計數加1 21 numTails = numFlips - numHeads # 得到本次試驗中反面朝上的次數 22 ratios.append(numHeads/float(numTails)) #正反面計數的比值 23 plt.title('Heads/Tails Ratios') 24 plt.xlabel('Number of Flips') 25 plt.ylabel('Heads/Tails') 26 plt.plot(xAxis, ratios) 27 plt.hlines(1, 0, xAxis[-1], linestyles='dashed', colors='r') 28 plt.show() 29 30 flip_plot(4, 16)
結果:
圖1-2,隨着實驗次數的增加,正反面出現次數之比越來越接近於1
2. 中心極限定理(central limit theorem,CLT)
與大數定理描述某個值的收斂趨勢不同,中心極限定理描述的是某種形式的隨機變量之和的分布。
2.1 從大數定理到中心極限定理
2.1.1 對於這兩個定理之間的聯系與區別,知乎上的Detian Deng有如下回答:
簡單來說,大數定律(LLN)和中心極限定理(CLT)的聯系與區別在於:
共同點:都是用來描述獨立同分布(i.i.d)的隨機變量的和的漸進表現(asymptotic behavior)
區別:首先,它們描述的是在不同的收斂速率(convergence rate)之下的表現,其次LLN前提條件弱一點:$E(|X|) < \infty$ , CLT成立條件強一點:$E(X^2) < \infty$
上面的描述中,$E(X^2) < \infty$相當於表示隨機變量$X$的二階原點矩存在,即方差存在;$E(|X|) < \infty$表示$X$的一階原點矩存在,即期望存在。方差存在可以推出期望存在,但是反之則不行。
2.1.2 我自己的理解:
利用大數定理我們可以用樣本均值估計總體分布的均值。例如拋硬幣,假如我們有一枚不均勻的硬幣,事先並不知道正面朝上的概率$P_h$。那么我們可以大量重復拋這枚硬幣,統計正面朝上的次數,用這個值除以拋硬幣的總次數,就可以近似的得到一個比值,例如$P_1$。這個值就是對$P_h$的估計,根據大數定理,我們可以保證拋硬幣的總次數越多這個估計的誤差就越小(即$P_1$依概率收斂於$P_h$)。對於大數定理,故事到這里就結束了。
此時,如果我們將每次拋硬幣都看成是一次伯努利試驗,即$X \sim B(1, P_h)$,其中正面朝上記為1,概率為$P_h$。由於是同一個人進行的試驗,可以將每次試驗都看作是獨立同分布。對於充分大的n,根據中心極限定理可得:
$$X_1 + X_2 + \cdots + X_n \sim N(nP_h, nP_h(1-P_h)) \hspace{ 10pt } \ldots (2-1)$$
上式表示所有試驗結果之和,也就是硬幣正面朝上的總次數,服從均值為$nP_h$,方差為$nP_h(1-P_h)$的正態分布。這里的分布是近似分布。嚴格意義上來說,n次伯努利試驗之和服從二項分布$B(n, P_h)$,近似的正態分布中的均值和方差與對應的二項分布相同。式2-1是利用正態分布近似估計二項分布的理論基礎(在$n$很大的前提下:$p$固定,$np$也很大時常用正態分布逼近;當$p$很小,$np$不太大時常用泊松分布逼近)。該式也是歷史上最早的中心極限定理的表述形式。1716年棣莫弗討論了p=1/2的情況,后來拉普拉斯將其推廣到了一般p的情形。因此式2-1又叫做棣莫弗-拉普拉斯中心極限定理。
到這里,故事還沒有結束。
假如此時又來了一個人,他不相信前一個人的試驗結果,自己重新做了一次試驗:大量的重復拋這枚硬幣,他的估計值是$P_2$。接着又來了第三個人,第四個人,...,這些人每個人都做了一次這樣的試驗,每個人都得到了一個估計值$P_i$。那么這些不同的估計值之間有什么聯系呢?類似上面一個人拋硬幣的過程,如果將每個人拋硬幣的試驗看做是二項分布$B(n, P_h)$,正面記為1,背面記為0。那么每個人的試驗結果之和都相當於一個具體的觀察值,表示其試驗中硬幣正面朝上的總次數$X$。正面朝上的概率可以用$X/n$來估計。
由大數定理可得$X - n*P_h$依概率收斂於0(也就是說如果每個人的重復次數都非常多的話,每個人的結果都是依概率收斂於二項分布的期望),中心極限定理進一步給出了下面的結論:
值得注意的一點是,此時需要區分兩個不同的量:一個是每個人重復伯努利試驗的次數,還是取為$n$;另一個是參與試驗的人數,這里取為$m$。
$$X_1 + X_2 + \cdots + X_m \sim N(\mu, \sigma^2) \hspace{ 10pt } \ldots (2-2)$$
也就是說,這m個不同的人的試驗結果之和也是屬於正態分布的。由於每個人的試驗都相當於是一個二項分布,假如將每個二項分布都用式2-1逼近,那么這里的和就相當於服從式子2-1中正態分布的隨機變量之和(這些不同的隨機變量之間相互獨立),也就不難求出這里的均值和方差分別為:$\mu = mnP_h, \sigma^2 = mnP_h(1-P_h)$。由於這些隨機變量之間是相互獨立的,因此求和以后均值和方差都擴大了m倍。
此外,
$$\bar{X} \sim N(nP_h, nP_h(1-P_h)/m) \hspace{ 10pt } \ldots (2-3)$$
其中,$\bar{X} = \frac{1}{m} \displaystyle \sum_{i=1}^{m}X_i$。同樣本均值的均值和方差,m個人的結果均值的均值沒變,方差縮小了m倍。
這里還有一個很好的問題是,m取多少比較合適。如果只取1,上面三個式子都是等價的,隨着人數的增加,式2-3的方差越來越小,也就是說用多人的均值來估計的結果也越來越准確(不確定性減小了),而式2-2的方差會越來越大(所有人的試驗結果之和)。對於式2-2,和式中的每一項都是一個二項分布,而不是式2-1中的伯努利分布。
那么和式中的每一項可以是其他分布嗎?其實和式中的每一項可以是任意分布,只要每一項都是獨立同分布且該分布的方差存在,那么當$m$趨近於無窮大時,它們的和就服從正態分布:
$$X_1 + X_2 + \cdots + X_m \sim N(m\mu, m\sigma^2) \hspace{ 10pt } \ldots (2-4)$$
其中$\mu$與$\sigma$是和式中每一項所屬分布的期望和標准差。 式2-4是2-1的進一步推廣,條件更弱,適用范圍更加廣泛。這就是獨立同分布下的中心極限定理也叫作林德伯格-萊維(Lindeberg-Levi中心極限定理)。這里的服從也是近似服從。
2.2 用Python程序模擬中心極限定理
2.2.1 模擬服從伯努利分布的隨機變量之和
這就相當於一個人做拋硬幣的試驗(正面朝上為1,反面朝上為0),這些試驗結果之和就表示這個人的試驗中出現正面朝上的總次數。
設單次伯努利試驗服從$B(1, p)$,單次試驗拋硬幣n次(這n次試驗結果合起來為該試驗條件下的一個樣本),重復單次試驗$t$次(同下面代碼中的$t$,$t$一般取值比較大),那么這些試驗結果之和近似服從$N(np, np(1-p))$。其中$np$表示均值$\mu$,$np(1-p)$表示方差$\sigma^2$。

圖2-1,n依次等於1, 4, 20, 80, 200, 1000;p等於0.4的伯努利分布之和
上圖紅色曲線表示用於逼近"多個取自伯努利分布的隨機變量之和"的正態分布的概率密度曲線。由上圖可以看到,當n(單次試驗拋硬幣的次數)等於20的時候,隨機變量和的分布和對應的近似正態分布的形狀已經高度重合。但是當n繼續增大時,擬合程度反而有所下降,這是由於試驗次數(下面代碼中,函數sampling2pmf的參數t,相當於總的試驗次數)和在x軸上分割的區間數(代碼中第49行的bins)太小造成的。
t的大小就是最終"隨機變量之和"這個新隨機變量的取樣個數(因此總共拋硬幣$t*n$次)。
當n=1時,該隨機變量就是伯努利分布本身,這時只有兩個可能的取值:0和1,因此1出現了$tp$次,0出現了$t(1-p)$次。
當n=20時,該隨機變量是20個服從伯努利分布的隨機變量之和。這時的可能取值為[0, 20]的整數。0就表示這20次試驗全都背面朝上,20就表示這20次試驗全都正面朝上。每次試驗都可以得到一個位於區間[0, 20]的整數,試驗結束后,最終得到了t個這樣的整數,這些整數的直方圖的形狀也近似為正態分布的形狀。
下面是代碼:
1 # -*- coding: utf-8 -*- 2 import numpy as np 3 import matplotlib.pyplot as plt 4 from scipy import stats 5 6 """ 7 Created on Sun Nov 12 08:44:37 2017 8 9 @author: Belter 10 """ 11 12 13 def sampling2pmf(n, dist, t=10000): 14 """ 15 n: sample size for each experiment 16 t: how many times do you do experiment, fix in 10000 17 dist: frozen distribution 18 """ 19 ber_dist = dist 20 sum_of_samples = [] 21 for i in range(t): 22 samples = ber_dist.rvs(size=n) # 與每次取一個值,取n次效果相同 23 sum_of_samples.append(np.sum(samples)) 24 val, cnt = np.unique(sum_of_samples, return_counts=True) 25 pmf = cnt / len(sum_of_samples) 26 return val, pmf 27 28 29 def plot(n, dist, subplot, plt_handle): 30 """ 31 :param n: sample size 32 :param dist: distribution of each single sample 33 :param subplot: location of sub-graph, such as 221, 222, 223, 224 34 :param plt_handle: plt object 35 :return: plt object 36 """ 37 bins = 10000 38 plt = plt_handle 39 plt.subplot(subplot) 40 mu = n * dist.mean() 41 sigma = np.sqrt(n * dist.var()) 42 samples = sampling2pmf(n=n, dist=dist) 43 plt.vlines(samples[0], 0, samples[1], 44 colors='g', linestyles='-', lw=3) 45 plt.ylabel('Probability') 46 plt.title('Sum of bernoulli dist. (n={})'.format(n)) 47 # normal distribution 48 norm_dis = stats.norm(mu, sigma) 49 norm_x = np.linspace(mu - 3 * sigma, mu + 3 * sigma, bins) 50 pdf1 = norm_dis.pdf(norm_x) 51 plt.plot(norm_x, pdf1, 'r--') 52 return plt 53 54 size = [1, 4, 20, 80, 200, 1000] 55 56 # sum of bernoulli distribution 57 dist_type = 'bern' 58 bern_para = [0.4] 59 single_sample_dist = stats.bernoulli(p=bern_para[0]) # 定義一個伯努利分布 60 61 # 下面是利用matplotlib畫圖 62 plt.figure(1) 63 plt = plot(n=size[0], dist=single_sample_dist, subplot=321, plt_handle=plt) 64 plt = plot(n=size[1], dist=single_sample_dist, subplot=322, plt_handle=plt) 65 plt = plot(n=size[2], dist=single_sample_dist, subplot=323, plt_handle=plt) 66 plt = plot(n=size[3], dist=single_sample_dist, subplot=324, plt_handle=plt) 67 plt = plot(n=size[4], dist=single_sample_dist, subplot=325, plt_handle=plt) 68 plt = plot(n=size[5], dist=single_sample_dist, subplot=326, plt_handle=plt) 69 plt.tight_layout() 70 plt.savefig('sum_of_{}_dist.png'.format(dist_type), dpi=200)
將上面代碼中第13行的t和37行的bins都從10,000增加到1,000,000,可以得到下圖:

圖2-2,增加試驗次數和在x軸上的分割區間,其他參數同2-1
由上圖可以看到,增加試驗次數和在x軸上分割區間的個數后,隨機變量之和與正態分布之間的重合度隨着樣本量(在代碼的54行定義)的增加而升高。這也很容易解釋:對於隨機變量和的分布,抽樣次數(試驗次數)越多,最終畫出來的圖越能代表整個分布,但是抽樣次數本身卻不影響該分布的類型和參數。就像在學校研究全體同學的身高,抽樣的人數不會影響身高的真實分布,只會影響我們利用所得的樣本描繪出來的分布的形狀。
此外,還有一個因素對隨機變量和的分布也有極大的影響:單次試驗所在分布的參數,這里是指伯努利分布中的參數$p$,下面是將$p$從$0.4$增加到$0.99$后的圖形:

圖2-3,n依次等於1, 4, 20, 80, 200, 1000;p等於0.99的伯努利分布之和
由上圖可以看到,由於單個樣本所在的伯努利分布嚴重不均勻(如果這個試驗表示拋硬幣且正面朝上記為1,那就意味着99%的情況下都只出現正面),導致后面隨機變量之和的圖形都出現了偏斜。但是,偏斜程度隨着樣本量的增加而降低。如果樣本量繼續增加,就會基本消除這種偏斜。
2.2.2 模擬服從二項分布的隨機變量之和
這就相當於多個人做拋硬幣的試驗(正反面朝上還是分別記為1和0),這些試驗結果之和就表示所有人的試驗中出現正面朝上的總次數。
設單次二項試驗服從$B(m, p)$,參與人數為n,那么這些試驗結果之和近似服從$N(nmp, nmp(1-p))$。其中$nmp$表示均值$\mu$,$nmp(1-p)$表示方差$\sigma^2$。
只需要將上面代碼中的57-59行替換成下面的代碼就可以模擬出二項分布之和的情況:
... 57 dist_type = 'bino' 58 bino_para = [20, 0.4] 59 single_sample_dist = stats.binom(n=bino_para[0], p=bino_para[1]) # 定義一個二項分布 ...

圖2-4,n依次等於1, 4, 20, 80, 200, 1000;參數為(20, 0.4)的二項分布之和
圖片中的n表示每次試驗參加的人數,每個人做單次試驗時,試驗服從$B(20, 0.4)$。
當n=1時,就相當於圖2-1中n=20的情況:都是一個人重復"拋20次硬幣"這一試驗,正面朝上的概率也相同。
當n=80時,就相當於有80個人同時做服從參數為(20, 0.4)的二項分布試驗,這些人之間的試驗是相互獨立的,然后將這些人的實驗結果相加:所以此時的均值為80*20*0.4=640,標准差為$\sqrt{80*20*0.4*(1-0.4)} \approx 19.6$,且最大值為80*20=1600(相當於所有人的試驗結果全部都是1),最小值為0(相當於所有人的試驗結果都是0)。
宏觀解釋:當非常多的人一起重復結果服從上述二項分布的試驗時,每次拋硬幣最可能得到正面朝上的概率始終都是$p$,因此這些人完成一次試驗的結果之和的期望就是:人數 * 每人單次試驗拋硬幣數 * 硬幣正面朝上的概率,即$n * 20 * 0.4$。得到硬幣正面朝上的結果小於這個概率,會導致試驗結果之和小於平均值;反之則會使試驗結果之和大於平均值。但是這兩種情況都沒有以概率$p$出現更常見,因此就產生了取到均值的概率最大,越往兩邊概率越小的鍾型概率密度曲線。
2.2.3 模擬服從均勻分布的隨機變量之和
還是假設每次有n個人參與服從$U[a, b]$的均勻分布,則求和就相當於將這些人的試驗結果相加,那么這些試驗結果之和近似服從$N(\frac{n(b-a)}{2}, \frac{n(b-a)^2}{12})$。其中$\frac{n(b-a)}{2}$表示均值$\mu$,$\frac{n(b-a)^2}{12}$表示方差$\sigma^2$(近似正態分布的參數都是原均勻分布參數的n倍,參考式2-4)。
取參數為[3, 5]的均勻分布,可得:

圖2-5,服從均勻分布$U[3, 5]$的隨機變量之和
使用前面模擬離散型隨機變量和的方法無法模擬連續型隨機變量和的極限分布,這是因為連續型隨機變量的取值是無窮多的,單個點的概率等於0,即使大量重復取樣每個結果的概率都還是會非常小(因為每個值都不同),根本無法看到累積的效果。可以將x軸進行分區,將出現在同一個區域的觀察值當做相同的值來對待,這樣就跟離散型隨機變量的情況一樣了(將無窮多的可能取值轉化成了有限個區域的取值)。下面使用hist函數實現了這一方式,並且將bins設置為100。
對於本次試驗的均勻分布,每次取值為區間$[3, 5]$上的任意實數,且取到這些實數的概率是相等的。
當n=1時,相當於只有一個人進行服從該均勻分布的試驗,試驗次數為函數“sampling2pmf”中的參數“t”,即100000次。由於將區間$[3, 5]$等分為100份,因此這些觀察值也應該均勻的分布在這100個區間內,即每個小區間中會有大約1000個觀察值。由於總長度為2,此時整個矩形區域的面積為$1000*2 = 2000$,如果標准化為頻率可得到每個小區間中觀察值出現的頻率為觀察值個數除以總面積,即$1000/2000 = 0.5$。最終結果就得到了左上角的圖形。此時相當於均值和方差都相同的正態分布(紅色虛線)和均勻分布(藍色區域)的比較,相差還是非常大的。
當n=8時,相當於有8個人同時做該試驗,每次試驗完成后將這些人的觀察值相加,試驗$t$次,就可以得到$t$個相加的觀察值。由於每次試驗從均勻分布中取值,這8個人的試驗結果也應該大致服從均勻分布,這些值幾乎均勻的分布在區間$[3, 5]$上。因此其和約等於人數乘以均勻分布的均值,即$8*4 = 32$,這也是n=8時,隨機變量和的期望值。該期望值是這8個人的結果之和最有可能出現的值,因此概率最大;大於該值或小於該值的概率表示這些人的取值會偏向均值的右側或左側,因此概率會減小。
宏觀解釋:多人試驗時,有些人取到較大的值,有些人取到較小的值,因此總的來說這些值的和接近人數乘以均勻分布的均值,得到這個位置的值的概率最大,為圖形中的頂點。所有人的取值同時小於或大於均值的概率是比較小的,因此頂點兩側的概率降低了,且越往兩側概率越小。取到極小值(極大值)表示所有人都取到了均勻分布中的最小值3(最大值5),這幾乎是不可能的。
下面是代碼實現:
1 # -*- coding: utf-8 -*- 2 import numpy as np 3 import matplotlib.pyplot as plt 4 from scipy import stats 5 6 """ 7 Created on Sun Nov 17 18:44:37 2017 8 9 @author: Belter 10 """ 11 12 13 def sampling2pmf(n, dist, t=100000): 14 """ 15 n: sample size for each experiment 16 t: how many times do you do experiment, fix in 100000 17 dist: frozen distribution 18 """ 19 current_dist = dist 20 sum_of_samples = np.zeros(t) 21 for i in range(t): 22 samples = [] 23 for j in range(n): # n次獨立的試驗 24 samples.append(current_dist.rvs()) 25 sum_of_samples[i] = np.sum(samples) 26 return sum_of_samples 27 28 29 def plot(n, dist, subplot): 30 """ 31 :param n: sample size 32 :param dist: distribution of each single sample 33 :param subplot: location of sub-graph, such as 221, 222, 223, 224 34 """ 35 plt.subplot(3, 2, subplot) 36 mu = n * dist.mean() 37 sigma = np.sqrt(n * dist.var()) 38 samples = sampling2pmf(n=n, dist=dist) 39 # normed參數可以對直方圖進行標准化,從而使縱坐標表示概率而不是次數 40 plt.hist(samples, normed=True, bins=100, color='#348ABD', 41 label='{} RVs'.format(n)) 42 plt.ylabel('Probability') 43 # normal distribution 44 norm_dis = stats.norm(mu, sigma) 45 norm_x = np.linspace(mu - 3 * sigma, mu + 3 * sigma, 10000) 46 pdf = norm_dis.pdf(norm_x) 47 plt.plot(norm_x, pdf, 'r--', alpha=0.6, label='N(${0:.0f}, {1:.2f}^2$)'.format(mu, sigma)) 48 plt.legend(loc='upper left', prop={'size': 8}) 49 50 size = [1, 2, 3, 4, 8, 10] 51 52 # sum of uniform distribution 53 dist_type = 'uniform' 54 uniform_para = [3, 2] 55 single_sample_dist = stats.uniform(loc=uniform_para[0], scale=uniform_para[1]) # 定義一個均勻分布 56 57 # 下面是利用matplotlib畫圖 58 plt.figure(figsize=(10, 7)) # bigger size 59 plt.suptitle('Sum of {} dist. random variables (RVs) converge to a Gaussian distribution (CLT)'.format(dist_type), 60 fontsize=16) 61 for s in range(len(size)): 62 plot(n=size[s], dist=single_sample_dist, subplot=s+1) 63 64 plt.savefig('sum_of_{}_dist.png'.format(dist_type), dpi=200)
上面的代碼參考了這里,整體上也更加簡潔。
后記:
寫到這里,似乎任何分布之和(只要項數足夠多)都服從正態分布。但是就是在上面鏈接的末尾處看到了一個例外:任意多的服從柯西分布的隨機變量之和還是服從原來的柯西分布。后面查了一些資料證實了這一點,可以參考這里。有了這一個例外,可能就無法排除還有其他的例外,只是這種情況應該很少見,平時的數據分析中也很少會遇到服從柯西分布的數據(物理學除外)。因此也不用擔心中心極限定理突然失靈。大數定理部分,寫於大約兩年前,當時發布在新浪博客(reference中最后一個鏈接),轉載時做了一些小的修改。
歡迎閱讀“概率論與數理統計及Python實現”系列文章
Reference
http://skhdh.blog.163.com/blog/static/279661392013126402728/
https://www.zhihu.com/question/22913867
https://www.zhihu.com/question/22913867/answer/35058403
https://www.quora.com/What-is-the-difference-between-the-Weak-Law-of-Large-Numbers-and-the-Central-Limit-Theorem/answer/Michael-Hochster?srid=uIoGQ
https://math.stackexchange.com/questions/2521380/using-python-simulate-central-limit-theorem-bigger-n-worse-fitting
https://rajeshrinet.github.io/blog/2014/central-limit-theorem/
http://blog.sina.com.cn/s/blog_6a6c136d0102wvrc.html
