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()
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
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
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()
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()
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()
In [ ]:
# чем больше размер генерируемой выборки, тем точнее получаем наша нормальная апрокмимация