中心极限定理-通俗理解
程序员文章站
2024-03-18 09:50:34
...
中心极限定理-通俗理解:
1、大量相互独立的随机变量,其求和后的平均值服从正态分布,分布是指按照每个平均值的出现频数去判断分布
2、给定一个任意分布的总体。每次从这些总体中随机抽取 n 个抽样,一共抽 m 次。
然后把这 m 组抽样分别求出平均值。 这些平均值的分布接近正态分布。
本文的例子通过扔骰子,模拟实现,思路如下:
1、进行了5000组实验,每个实验,扔100次骰子并求和,
2、然后对这个和进行分布统计,按照这个和值出现的频数进行统计,然后画图出来
3、改变骰子的1-6数字出现的概率,比如骰子6个面是123416,发现和值仍然服从正态分布
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
# 统计次数
def count_times(count,num):
if (str(num) in count.keys()):
count[str(num)] = count[str(num)] + 1
else:
count[str(num)] = 1
# return count
# 随机扔n次骰子,并求点数和
def random_and_sum(n):
total = 0;
count = {}
for i in range(n):
num = np.random.randint(1,7)
# print("第", i, "次", num)
# 即使分布不同,定理也成立
# if num == 5:
# num = 1
count_times(count,num)
total = num + total
# print("count=",count)
return total
# Test 随机扔100次骰子,并求点数和
# total = random(100) # max 600
# print("total=",total)
# 进行m组实验,每次实验扔n次骰子,并求点数和,并统计
def ramdom_outside(m,n):
global all_sum
count = {}
for i in range(m):
total = random_and_sum(n)
count_times(count,total//10)
return count
total_times = ramdom_outside(5000,100)
print("total_times1=",total_times)
# 字典 按key排序
total_times = sorted(total_times.items(), key = lambda k: k[0])
print("total_times2=",total_times)
# 整理出 画图的 x y值
label_list = [];
num_list1 = [];
for tup in total_times:
label_list.append(tup[0]) # 横坐标值
num_list1.append(tup[1]) # 纵坐标值
print("label_list=",label_list)
print("num_list1=",num_list1)
# 设置中文字体和负号正常显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
x = range(len(total_times))
plt.bar(left=x, height=num_list1, width=0.5, alpha=0.8, color='red', label="次数",tick_label = label_list)
plt.ylabel("频次")
plt.title('中心极限定理')
plt.legend() # 设置题注
plt.show()
现实中的应用
现在我们要统计全国的人的体重,看看我国平均体重是多少。当然,我们把全国所有人的体重都调查一遍是不现实的,而且体重和每个人的生活的各种因素都有关系,无法量化。所以我们打算一共调查1000组,每组50个人。 然后,我们求出第一组的体重平均值、第二组的体重平均值,一直到最后一组的体重平均值。中心极限定理说:这些平均值是呈现正态分布的。并且,随着组数的增加,效果会越好。
上例中,人的体重是正态分布的。但如果是掷一个骰子(平均分布),甚至是一个不均衡的骰子,
最后每组的平均值也会组成一个正态分布。