mu = 2.0
sigma = 0.5

# зададим нормально распределенную случайную величину
norm_rv = sts.norm(loc=mu, scale=sigma)

# сгенерируем 10 значений
norm_rv.rvs(size=10)

"""
Explanation: Нормальное распределение
Вот так можно сгенерировать выборку из нормально распределённой случайной величины с параметрами $\mu=2.0$ и $\sigma=0.5$:
End of explanation
"""


norm_rv.cdf(3)

"""
Explanation: Параметр loc задаёт $\mu$, scale — среднеквадратичное отклонение $\sigma$, size — размер выборки. Имя параметра size при вызове функции rvs можно не писать.
Следующая функция возвращает значение функции распределения нормальной случайной величины в точке, соответствующей её аргументу:
End of explanation
"""


x = np.linspace(0,4,100)
cdf = norm_rv.cdf(x) # функция может принимать и вектор (x)
plt.plot(x, cdf)
plt.ylabel('$F(x)$')
plt.xlabel('$x$')

"""
Explanation: Построим график функции распределения:
End of explanation
"""


norm_rv.pdf(3)

"""
Explanation: А так можно вычислить значение функции плотности вероятности нормального распределения в заданной точке:
End of explanation
"""


x = np.linspace(0,4,100)
pdf = norm_rv.pdf(x)
plt.plot(x, pdf)

plt.ylabel('$f(x)$')
plt.xlabel('$x$')

"""
Explanation: Построим график функции плотности вероятности:
End of explanation
"""


a = 1
b = 4

# обратите внимание, что в этой функции задается левая граница и масштаб, а не левая и правая границы:
uniform_rv = sts.uniform(a, b-a)

uniform_rv.rvs(10)

"""
Explanation: Равномерное распределение на отрезке
Вот так можно сгенерировать выборку из случайной величины, имеющей равномерное распределение на отрезке $[a,b]$:
End of explanation
"""


x = np.linspace(0,5,100)
cdf = uniform_rv.cdf(x)
plt.plot(x, cdf)

plt.ylabel('$F(x)$')
plt.xlabel('$x$')

x = np.linspace(0,5,1000)
pdf = uniform_rv.pdf(x)
plt.plot(x, pdf)

plt.ylabel('$f(x)$')
plt.xlabel('$x$')

"""
Explanation: А так — вычислять значения функций распределения и плотностей:
End of explanation
"""


bernoulli_rv = sts.bernoulli(0.7)

bernoulli_rv.rvs(10)

"""
Explanation: Распределение Бернулли
Генерация выборок из распределения Бернулли с заданным параметром $p$:
End of explanation
"""


binomial_rv = sts.binom(20, 0.7)
binomial_rv.rvs(10)

"""
Explanation: Биномиальное распределение
Генерация выборок из биномиального распределения:
End of explanation
"""


x = np.linspace(0,20,21)
cdf = binomial_rv.cdf(x)
plt.step(x, cdf)

plt.ylabel('$F(x)$')
plt.xlabel('$x$')

"""
Explanation: Первый аргумент функции binom — значение параметра $n$, второй — параметра $p$.
Функция распределения:
End of explanation
"""


x = np.linspace(0,20,21)
pmf = binomial_rv.pmf(x)
plt.plot(x, pmf, 'o')

plt.ylabel('$P(X=x)$')
plt.xlabel('$x$')

"""
Explanation: Функция вероятности pmf для дискретных случайных величин заменяет функцию плотности pdf:
End of explanation
"""


x = np.linspace(0,45,46)
for N in [20, 30]:
    for p in [0.2, 0.7]:
        rv = sts.binom(N, p)
        cdf = rv.cdf(x)
        plt.step(x, cdf, label="$N=%s, p=%s$" % (N,p))
plt.legend()
plt.title("CDF (binomial)")

plt.ylabel('$F(X)$')
plt.xlabel('$x$')

x = np.linspace(0,45,46)
symbols = iter(['o', 's', '^', '+'])
for N in [20, 30]:
    for p in [0.2, 0.8]:
        rv = sts.binom(N, p)
        pmf = rv.pmf(x)
        plt.plot(x, pmf, next(symbols), label="$N=%s, p=%s$" % (N,p))
plt.legend()
plt.title("PMF (binomial)")

plt.ylabel('$P(X=x)$')
plt.xlabel('$x$')

"""
Explanation: Посмотрим, как ведут себя биномиально распределенные величины при разных значениях параметров:
End of explanation
"""


poisson_rv = sts.poisson(5)
poisson_rv.rvs(10)

x = np.linspace(0,30,31)
for l in [1, 5, 10, 15]:
    rv = sts.poisson(l)
    cdf = rv.cdf(x)
    plt.step(x, cdf, label="$\lambda=%s$" % l)
plt.legend()
plt.title("CDF (poisson)")

plt.ylabel('$F(x)$')
plt.xlabel('$x$')

x = np.linspace(0,30,31)

symbols = iter(['o', 's', '^', '+'])
for l in [1, 5, 10, 15]:
    rv = sts.poisson(l)
    pmf = rv.pmf(x)
    plt.plot(x, pmf, next(symbols), label="$\lambda=%s$" % l)
plt.legend()
plt.title("PMF (poisson)")

plt.ylabel('$P(X=x)$')
plt.xlabel('$x$')

"""
Explanation: Распределение Пуассона
Генерация выборок из распределения Пуассона с параметром $\lambda$:
End of explanation
"""


elements = np.array([1, 5, 12])
probabilities = [0.05, 0.7, 0.25]
np.random.choice(elements, 10, p=probabilities)

"""
Explanation: Дискретное распределение общего вида
Чтобы сгенерировать дискретную случайную величину общего вида, нужно задать множество её значений и соответствующих вероятностей и использовать функцию numpy.random.choice:
End of explanation
"""


x = np.linspace(0,30,100)
for k in [1, 2, 3, 4, 6, 9]:
    rv = sts.chi2(k)
    cdf = rv.cdf(x)
    plt.plot(x, cdf, label="$k=%s$" % k)
plt.legend()
plt.title("CDF ($\chi^2_k$)")

x = np.linspace(0,30,100)
for k in [1, 2, 3, 4, 6, 9]:
    rv = sts.chi2(k)
    pdf = rv.pdf(x)
    plt.plot(x, pdf, label="$k=%s$" % k)
plt.legend()
plt.title("PDF ($\chi^2_k$)")

"""
Explanation: Другие распределения
Существует большое количество других стандартных семейств распределений, многие из которых также можно генерировать в Питоне. 
Например, распределение хи-квадрат $\chi^2_k$, имеющее наутральный параметр $k$, который называется числом степеней свободы:
End of explanation
"""


