Задание: Центральная предельная теорема своими руками


In [ ]:
#Выберите ваше любимое непрерывное распределение (чем меньше оно будет похоже на нормальное, 
# тем интереснее; попробуйте выбрать какое-нибудь распределение из тех, что мы не обсуждали в курсе). 
# Сгенерируйте из него выборку объёма 1000, постройте гистограмму выборки и нарисуйте поверх 
# неё теоретическую плотность распределения вашей случайной величины (чтобы величины были в 
# одном масштабе, не забудьте выставить у гистограммы значение параметра normed=true).

In [63]:
import numpy as np
#генерируем распределение лапласа
loc, scale = 0., 1.
s = np.random.laplace(loc, scale, 1000)

In [65]:
# строим гистаграмму по выборке объема 1000 и теорит. поверх нее
%matplotlib inline
import matplotlib.pyplot as plt
count, bins, ignored = plt.hist(s, 30, normed=True, label='Laplase actual')
x = np.arange(-10., 10., .01)
pdf = np.exp(-abs(x-loc)/scale)/(2.*scale)
plt.plot(x, pdf, label='Laplase theor')
plt.legend()
plt.ylabel('$f(x)$')
plt.xlabel('$x$')
plt.show()



In [ ]:
# Ваша задача — оценить распределение выборочного среднего вашей случайной величины при разных объёмах выборок. 
# Для этого при трёх и более значениях n (например, 5, 10, 50) сгенерируйте 1000 выборок объёма n и постройте 
# гистограммы распределений их выборочных средних. Используя информацию о среднем и дисперсии исходного распределения 
# (её можно без труда найти в википедии), посчитайте значения параметров нормальных распределений, которыми, 
# согласно центральной предельной теореме, приближается распределение выборочных средних. Обратите внимание:
#     для подсчёта значений этих параметров нужно использовать именно теоретические среднее и дисперсию вашей 
#     случайной величины, а не их выборочные оценки. Поверх каждой гистограммы нарисуйте плотность соответствующего 
#     нормального распределения (будьте внимательны с параметрами функции, она принимает на вход не дисперсию, 
#                                а стандартное отклонение).

In [8]:
print s.mean()


-0.0569508095323

In [31]:
# создаем выборку размера sub_sample_size 1000 раз и записываем её в массив mean по которому далее построим графики 
mean = []
sub_sample_size = 50
for i in range(1000):
    s = np.random.laplace(loc, scale, sub_sample_size)
    mean.append(s.mean())

In [50]:
# mu VAR сосчитано на основе теории с вики
import math
from scipy import stats
mu = 0
VAR = 2
SIGMA = math.sqrt(VAR)
SE = SIGMA/math.sqrt(sub_sample_size)
print mu, VAR, SIGMA, 2*SE


0 2 1.41421356237 0.4

In [54]:
# строим искомые графики
count, bins, ignored = plt.hist(mean, 50, normed=True, label='actual laplace')
x = np.arange(-1, 1, .0001)
pdf = np.exp(-abs(x-loc)/scale)/(2.*scale)
plt.plot(x, pdf,label='Laplase theor')

norm_rv = stats.norm(mu,SE)
plt.plot(x,norm_rv.pdf(x),label='Norm theor')
plt.legend()
plt.ylabel('$f(x)$')
plt.xlabel('$x$')
plt.show()



In [34]:
import math 
mu = 0
VAR = 2
SIGMA = math.sqrt(VAR)
SE = SIGMA/math.sqrt(sub_sample_size)
print mu, VAR, SIGMA, 2*SE


0 2 1.41421356237 0.4

In [56]:
mean = []
sub_sample_size = 5
for i in range(1000):
    s = np.random.laplace(loc, scale, sub_sample_size)
    mean.append(s.mean())
    
mu = 0
VAR = 2
SIGMA = math.sqrt(VAR)
SE = SIGMA/math.sqrt(sub_sample_size)
print mu, VAR, SIGMA, 2*SE
count, bins, ignored = plt.hist(mean, 50, normed=True, label='actual laplace')
x = np.arange(-3, 3, .0001)
pdf = np.exp(-abs(x-loc)/scale)/(2.*scale)
plt.plot(x, pdf,label='Laplase theor')

norm_rv = stats.norm(mu,SE)
plt.plot(x,norm_rv.pdf(x),label='Norm theor')
plt.legend()
plt.ylabel('$f(x)$')
plt.xlabel('$x$')
plt.show()


0 2 1.41421356237 1.26491106407

In [58]:
mean = []
sub_sample_size = 10
for i in range(1000):
    s = np.random.laplace(loc, scale, sub_sample_size)
    mean.append(s.mean())
    
mu = 0
VAR = 2
SIGMA = math.sqrt(VAR)
SE = SIGMA/math.sqrt(sub_sample_size)
print mu, VAR, SIGMA, 2*SE
count, bins, ignored = plt.hist(mean, 50, normed=True, label='actual laplace')
x = np.arange(-1.6,1.6, .0001)
pdf = np.exp(-abs(x-loc)/scale)/(2.*scale)
plt.plot(x, pdf,label='Laplase theor')

norm_rv = stats.norm(mu,SE)
plt.plot(x,norm_rv.pdf(x),label='Norm theor')
plt.legend()
plt.ylabel('$f(x)$')
plt.xlabel('$x$')
plt.show()


0 2 1.41421356237 0.894427191

In [70]:
mean = []
sub_sample_size = 150
for i in range(1000):
    s = np.random.laplace(loc, scale, sub_sample_size)
    mean.append(s.mean())
    
mu = 0
VAR = 2
SIGMA = math.sqrt(VAR)
SE = SIGMA/math.sqrt(sub_sample_size)
print mu, VAR, SIGMA, 2*SE
count, bins, ignored = plt.hist(mean, 50, normed=True, label='actual laplace')
x = np.arange(-0.5,0.5, .0001)
pdf = np.exp(-abs(x-loc)/scale)/(2.*scale)
plt.plot(x, pdf,label='Laplase theor')

norm_rv = stats.norm(mu,SE)
plt.plot(x,norm_rv.pdf(x),label='Norm theor')
plt.legend()
plt.ylabel('$f(x)$')
plt.xlabel('$x$')
plt.show()


0 2 1.41421356237 0.230940107676

In [ ]:
# чем больше  размер генерируемой выборки, тем точнее получаем наша нормальная апрокмимация