python实现大数定律与中心极限定理

一. 大数定律

{ 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 nlimP(Xiuϵ)=nlimP(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=δ/n Xkμ分布服从标准正太分布, 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 nlimP(δ/n Xkμ<α)=Φ(α)=2π 1αet2/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=δ/n Xkμ的分布会越来越趋近于标准正太分布。下面用代码来演示这个过程。

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=δ/n Xkμ的分布越来越跟标准正太分布吻合。

  • 14
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值