一. 大数定律
设
{
X
k
,
k
=
1
,
2
,
.
.
.
}
{\{X_k,k = 1, 2,...\}}
{Xk,k=1,2,...}是独立同分布的随机变量序列,且随机变量
X
X
X的数学期望为
μ
\mu
μ,方差为
δ
2
\delta^2
δ2。则对于任意给定的
ϵ
>
0
\epsilon>0
ϵ>0有
lim
n
→
∞
P
(
∣
X
i
‾
−
u
∣
≥
ϵ
)
=
lim
n
→
∞
P
(
∣
1
n
(
X
1
+
X
2
+
.
.
.
+
X
n
)
−
μ
∣
≥
ϵ
)
=
0
\lim\limits_{n\rightarrow\infty}P(|\overline{X_i}-u| \geq \epsilon) = \lim\limits_{n\rightarrow\infty}P(|\frac{1}{n}(X_1 + X_2 + ... + X_n) - \mu| \geq \epsilon) = 0
n→∞limP(∣Xi−u∣≥ϵ)=n→∞limP(∣n1(X1+X2+...+Xn)−μ∣≥ϵ)=0
大数定律表明随机变量序列的算术平均值依概率收敛于随机变量的期望。
假如随机变量 X X X服从二项分布,随机取出一个长度为 n n n的随机变量序列 X k X_k Xk,随着 n n n的增大,该随机变量序列 X k X_k Xk的均值的极限值就是随机变量 X X X的数学期望。下面用代码来演示这个收敛过程。
import matplotlib.pyplot as plt
from scipy.stats import binom
import numpy as np
plt.rcParams["font.family"] = "SimHei" # 设置字体
plt.rcParams["axes.unicode_minus"] = False # 正常显示负号
if __name__ == '__main__':
fig, ax = plt.subplots(figsize=(10,8))
# 二项分布的参数
n, p = 10, 0.4
# 二项分布的期望
expected_mean = n * p
# 样本大小从10到100000,每次递增50
sample_size_list = range(10, 100000, 50)
mean_list = []
for sample_size in sample_size_list:
sample = binom(n = n, p = p).rvs(size = sample_size)
mean = np.mean(sample)
mean_list.append(mean)
ax.plot(sample_size_list, mean_list, label = 'sample_mean')
expected_mean_list = [expected_mean for i in sample_size_list]
ax.plot(sample_size_list, expected_mean_list, label = 'expected_mean')
ax.legend()
plt.show()
运行结果:
从图中可以看出随着样本量的增大,样本的均值逐渐收敛于总体期望。
二. 中心极限定理
设 { X k , k = 1 , 2 , . . . } \{X_k, k=1,2,...\} {Xk,k=1,2,...}是独立同分布的随机变量序列,且随机变量 X X X的数学期望为 μ \mu μ,方差为 δ 2 ≠ 0 \delta^2\neq 0 δ2=0,则当 n → ∞ n\rightarrow\infty n→∞时,随机变量 X ∗ = X k ‾ − μ δ / n X^*=\frac{\overline{X_k} - \mu}{\delta/\sqrt{n}} X∗=δ/nXk−μ分布服从标准正太分布, n n n为随机变量序列的长度,数学表达式如下:
lim n → ∞ P ( X k ‾ − μ δ / n < α ) = Φ ( α ) = 1 2 π ∫ − ∞ α e − t 2 / 2 d t \lim\limits_{n\rightarrow\infty}P(\frac{\overline{X_k} - \mu}{\delta/\sqrt{n}} < \alpha) = \Phi(\alpha) =\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\alpha}e^{-t^2/2}dt n→∞limP(δ/nXk−μ<α)=Φ(α)=2π1∫−∞αe−t2/2dt
假如随机变量 X X X服从二项分布,则随机取出一个长度为 n n n的随机变量序列 X k X_k Xk,随着抽样次数的增大,随机变量序列 X ∗ = X k ‾ − μ δ / n X^* = \frac{\overline{X_k} - \mu}{\delta/\sqrt{n}} X∗=δ/nXk−μ的分布会越来越趋近于标准正太分布。下面用代码来演示这个过程。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom
from scipy.stats import norm
import math
plt.rcParams["font.family"] = "SimHei" # 设置字体
plt.rcParams["axes.unicode_minus"] = False # 正常显示负号
if __name__ == '__main__':
fig, ax = plt.subplots(4, 1, figsize=(10, 8))
# 二项分布的参数
n, p = 10, 0.4
# 二项分布的期望
expected_mean = n * p
# 二项分布的标准差
expected_std = math.sqrt(n * p * (1 - p))
# 单次抽样的大小
sample_size = 1000
# 抽样次数
sample_times_list = [500, 10000, 100000]
i = 0
while i < len(sample_times_list):
sample_mean_list = []
for k in range(sample_times_list[i]):
sample = binom(n=n, p=p).rvs(size = sample_size)
# 计算抽样样本的均值
sample_mean = np.mean(sample)
sample_mean_list.append(sample_mean)
# 对均值进行标准化处理
sample_size_list_normalized = [ (mean - expected_mean) / (expected_std / math.sqrt(sample_size)) for mean in sample_mean_list]
# 画出抽样均值的分布
ax[i].hist(sample_size_list_normalized, bins=100, density=True, color='blue', label='抽样次数:{}, 单次抽样大小:{}'.format(sample_times_list[i], sample_size))
ax[i].legend()
i += 1
# 画出正太分布
x = np.linspace(-5, 5, 1000)
y = norm(loc = 0, scale= 1).pdf(x)
ax[i].plot(x,y, color = 'red', label = '标准正太分布')
ax[i].legend()
plt.show()
运行结果:
从图中可以看出随着抽样次数的增加,随机变量 X ∗ = X k ‾ − μ δ / n X^* = \frac{\overline{X_k} - \mu}{\delta/\sqrt{n}} X∗=δ/nXk−μ的分布越来越跟标准正太分布吻合。