中心极限定理
如果将大量服从某种分布的值叠加起来, 所得到的和会收敛到正态分布. 这个定理成立需要满足一定条件:
- 用于求和的数据必须满足独立性
- 数据必须服从同一个分布(这个要求可以被适当地放松, 比如每个变量不必服从同一个分布)
- 产生这些数据分布的均值和方差必须是有限的
- 收敛速度取决于原来分布的偏度. 如果数据服从指数分布, 那么这些数据的和就会收敛很快; 但如果数据服从对数正态分布, 那么收敛速度就没有那么快了.
中心极限定理部分解释了为什么正态分布在自然界中广泛存在. 绝大多数动物(或是其他生命形式)的特征比如体重, 都会受到大量遗传和环境因素的影响, 而且这些影响是具有可加性的. 我们观测到的这些特征是大量微观因素的叠加, 所以他们都近似地服从正态分布. code on github
#!/usr/bin/env python #coding:utf-8 #Copyright (C) dirlt # https://en.wikipedia.org/wiki/Central_limit_theorem import matplotlib.pyplot as plt import random import numpy as np def pdf(ps): bucket_n = 1000 mx = max(ps) mn = min(ps) interval = (mx - mn) / bucket_n vs = [0] * bucket_n for p in ps: off = int((p - mn) / interval) if off >= bucket_n: off = bucket_n - 1 vs[off] += 1 vs = map(lambda x: x * 1.0 / len(ps), vs) return vs streams = [{'func': random.expovariate, 'args': [(1.0,), (2.0,), (3.0,), (4.0,)]}, {'func': random.gauss, 'args': [(2.0, 1.0), (1.0, 2.0), (3.0, 4.0), (2.0, 4.0)]}, {'func': random.paretovariate, 'args': [(5.0,), (6.0,), (7.0,), (8.0,)]}] def gen(): values = [] for s in streams: f = s['func'] args = s['args'] values.extend(map(lambda x: apply(f, x), args)) return sum(values) * 1.0 / len(values) N = 10000 ps = np.array([gen() for i in xrange(0, N)]) vs = np.array(pdf(ps)) xs = np.arange(ps.min(), ps.max(), (ps.max() - ps.min()) * 1.0 / vs.size) print('mean = {}, std ={}'.format(ps.mean(), ps.std())) plt.plot(xs, vs) plt.show()
mean = 1.23274131597, std =0.515295913956