中心极限定理与Python图解
方差与z-score标准化
方差公式,也表示为。
方差描述的是分布的离散程度,方差为0时则,即分布不含有任何随机的成分。
由于数据加常量后其方差不变,乘以后则变为,所以对任何分布的数据都可以做一个标准化(z-score),使得方差,期望。具体做法为:
import numpy as np
import matplotlib.pyplot as plt
X = np.random.rand(1000)
fig, (axs1, axs2) = plt.subplots(1, 2, figsize=(9, 4))
axs1.plot(X, '.')
axs1.set_ylim(-2, 2)
axs2.hist(X, edgecolor='k', alpha=0.8)
plt.show()
print("mean:", np.round(X.mean(), 2), "std:", np.round(X.std(), 2))
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WlwuPYyG-1592485360789)(https://static01.imgkr.com/temp/bf9cd8999ba24d929380bee8f5e8835c.png)]
mean: 0.5 std: 0.29
进行z-score标准化操作(证明过程见下一小节)
W = (X - X.mean())/X.std()
mean = W.mean()
std_var = W.std()
fig, (axs1, axs2) = plt.subplots(1, 2, figsize=(9, 4))
axs1.plot(W, '.')
axs1.set_ylim(-2, 2)
axs2.hist(W, edgecolor='k', alpha=0.8)
plt.show()
print("mean:", np.round(W.mean(), 2), "std:", np.round(W.std(), 2))
mean: -0.0 std: 1.0
打印的信息显示新的数据均值为0,方差为1,但是histgram显示出每个bin(默认10个)的数据数量没有变化。
z-score证明
假设一组数据的均值为,方差为,经过z-score标准化的数据。
的均值
的方差(已经得知)
标准正态分布
对于正态分布,其概率密度函数如下:
如果,则称为标准正态分布,概率密度函数简化为:
def NormDist(x, mean=0, sigma=1):
assert(sigma != 0)
return np.exp(-(x-mean)**2/2)/(np.sqrt(2*np.pi)*sigma)
plt.figure(figsize=(8, 6))
xs = np.linspace(-5, 5, 100)
X = [NormDist(i) for i in xs]
plt.plot(xs, X, '-', label=r'$\frac{1}{\sqrt{2\pi}\sigma}exp(\frac{-x^2}{2})$')
X = [np.exp(-i**2/2) for i in xs]
plt.plot(xs, X, '--', label=r'$exp(\frac{-x^2}{2})$')
X = [np.exp(-i**2) for i in xs]
plt.plot(xs, X, '--', label=r'$exp(-x^2)$')
plt.legend(fontsize=14)
plt.show()
从上图可以看出:1. 由于的存在使得在0点处左右对称,并且越接近于0越大;2. 而和的指数除以使得其面积(在x轴上积分)为1,满足了概率密度函数积分为1的性质。
z-score变换为标准正态分布
正态分布经过z-score标准化后会变成标准正态分布。证明过程如下
正态分布概率密度函数
其精髓和意义就是通过对积分,可以得到在任意区间的概率,例如的概率:
经过z-score标准化的新数据为,那么的概率:
将代入积分公式,替换上限:
可是我们要求的是的概率,由于,只需要将只要代入积分公式替换掉即可:
注意两点:
- 积分的上限为,新变量的上限为
- 对两边求导,得到
至此,证明得到z-score变化后的数据服从标准正态分布。
中心极限定理
The central limit theorem in statistics states that, given a sufficiently large sample size, the sampling distribution of the mean for a variable will approximate a normal distribution regardless of that variable’s distribution in the population.
名词解释
在统计学中,有一些专用名词不能弄混淆,特别是我们平时说的“样本”在这里并不是指单个数据,参见Central Limit Theorem Explained
- 总体(population):研究对象的整个群体(the complete set of all objects or people of interest)
- 样本(sample):从总体中选取的一部分数据(a subset of the entire population)
- 样本数量(the number of samples):有多少个样本。
- 样本大小/样本容量(sample size):每个样本里包含多少个数据。
- 抽样分布(sampling distribution):将样本平均值的分布可视化。
定义
对于独立同分布的变量,其中,这组样本的均值表示为:
中心极限定理研究的就是这个的分布情况,而不是的分布情况,因为现实中很多数据我们是无法获得其总体(population)分布情况的,而中心极限定理可以帮助我们分析其均值位置。
不同的或者不同的样本都会影响,直觉上是和有关的,而且是围绕着的。如果对这组数据做z-score标准化得到,标准化后的样本均值
由大数定律(大数定律、中心极限定理与格里文科定理)可知,当时,以概率1收敛于期望,因此得到
现在给出中心极限定理的定义:
公式左边相当于对做了类似z-score的处理,减去总体均值,并除以,右边就是标准正态分布的概率密度函数的积分,也就是说当样本容量极大时,样本均值的抽样分布趋近于期望为,标准差为的正态分布。如果将分子分母同乘以,那么可以得到和的表示形式
证明过程将的特征函数在0点泰勒展开,得到了和标准正态分布一样的特征函函数。
单次采样
均匀分布
以均匀分布np.random.rand()
为例,一次采样1000个值,可以看到样本均值接近0.5,并且histgram(默认10个bin)中每个bin的值都接近1000/10=100
sample_size = 1000 # 采样个数
number_of_sample = 1 # 采样次数
np.random.seed(0)
X = np.random.rand(number_of_sample, sample_size)
mean = X.mean(axis=1)
fig, axs = plt.subplots(1, 2, figsize=(9, 4))
# sample values
axs[0].plot(X[0], '.')
axs[0].set_ylim(-1, 2)
axs[0].set_title('sample values')
# histgram of X
axs[1].hist(X[0], edgecolor='k', alpha=0.8)
axs[1].set_title('histgram of $X$')
plt.show()
print('mean:', mean)
mean: [0.49592153]
偏正态分布
如果用正态分布实验,结果可能不能很好的展示中心极限定理。我们直接用SciPy里的skewnorm偏正态分布,概率密度函数为skewnorm.pdf(x, a) = 2 * norm.pdf(x) * norm.cdf(a*x)
。
from scipy.stats import skewnorm
import matplotlib.pyplot as plt
a = 4
fig, ax = plt.subplots(1, 1)
mean, var, skew, kurt = skewnorm.stats(a, moments='mvsk')
x = np.linspace(skewnorm.ppf(0.01, a), skewnorm.ppf(0.99, a), 100)
ax.plot(x, skewnorm.pdf(x, a), 'r-', lw=5, alpha=0.6, label='skewnorm pdf')
print('E(X) =', mean)
E(X) = 0.7740617226446519
打印的结果显示这个分布均值约等于0.774,我们采样1000个值看看其分布情况。
r = skewnorm.rvs(a, size=1000)
fig, axs = plt.subplots(1, 2, figsize=(9, 4))
# sample values
axs[0].plot(r, '.')
axs[0].set_ylim(-2, 5)
axs[0].set_title('sample values')
# histgram of X
axs[1].hist(r, edgecolor='k', alpha=0.8)
axs[1].set_title('histgram of $X$')
print('mean:', r.mean())
mean: 0.7426786528215207
多次采样
均匀分布
我们分别测试的情况,每种情况都采集100000次,并画出每种情况下均值的分布图(已归一化)。从图中可以看出,虽然样本容量很小,但是其均值的分布图已经是正态分布,这和均匀分布本身对称有关系。当时候已经很好了。
sample_size = [3, 10, 30, 100] # 每次采样个数
number_of_sample = 100000 # 采样次数
plt.figure(figsize=(8,6))
for i, ss in enumerate(sample_size):
Xs = np.random.rand(number_of_sample, ss)
h, b = np.histogram(Xs.mean(axis=1), bins=50, density=True)
b = (b[:-1] + b[1:]) / 2.
plt.plot(b, h, '-', label=f'sample size = {ss}')
plt.legend()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iw3aDmtH-1592485360810)(https://static01.imgkr.com/temp/455608657cea4ca8867401ab1e077261.png)]
偏正态分布
同均匀分布一样,仍然测试的情况,但是注意,由于样本容量太小,其均值分布类似于总体数据的偏正态分布,而就好了很多。
sample_size = [3, 10, 30, 100] # 每次采样个数
number_of_sample = 100000 # 采样次数
plt.figure(figsize=(8,6))
for i, ss in enumerate(sample_size):
Xs = skewnorm.rvs(4, size=(number_of_sample, ss))
h, b = np.histogram(Xs.mean(axis=1), bins=50, density=True)
b = (b[:-1] + b[1:]) / 2.
plt.plot(b, h, '-', label=f'sample size = {ss}')
plt.legend()
练习题
e.g.1 某炮兵阵地对敌人的防御地段进行100次射击,每次射击中炮弹的命中数是一个随机变量,其期望为2,方差为1.69,求在100次射击中有180颗到220颗炮弹命中目标的概率。
解:设表示第次设计命中的炮弹数,则,因为100很大,所以根据中心极限定理可以认为近似服从,,所以