Вычисление вероятности случайной величины в распределении в Python
учитывая среднее и стандартное отклонение, определяющее нормальное распределение, как бы вы рассчитали следующие вероятности в pure-Python (т. е. нет Numpy/Scipy или других пакетов, не входящих в стандартную библиотеку)?
- вероятность случайной величины r, где r
- вероятность случайной величины r, где r > x или r >= x.
- вероятность случайной величины r, где x > r > y.
Я нашел некоторые библиотеки, например Pgnumerics, которые предоставляют функции для их вычисления, но основная математика мне неясна.
Edit: чтобы показать, что это не домашнее задание, ниже приведен мой рабочий код для Python
from math import *
import unittest
def erfcc(x):
"""
Complementary error function.
"""
z = abs(x)
t = 1. / (1. + 0.5*z)
r = t * exp(-z*z-1.26551223+t*(1.00002368+t*(.37409196+
t*(.09678418+t*(-.18628806+t*(.27886807+
t*(-1.13520398+t*(1.48851587+t*(-.82215223+
t*.17087277)))))))))
if (x >= 0.):
return r
else:
return 2. - r
def normcdf(x, mu, sigma):
t = x-mu;
y = 0.5*erfcc(-t/(sigma*sqrt(2.0)));
if y>1.0:
y = 1.0;
return y
def normpdf(x, mu, sigma):
u = (x-mu)/abs(sigma)
y = (1/(sqrt(2*pi)*abs(sigma)))*exp(-u*u/2)
return y
def normdist(x, mu, sigma, f):
if f:
y = normcdf(x,mu,sigma)
else:
y = normpdf(x,mu,sigma)
return y
def normrange(x1, x2, mu, sigma, f=True):
"""
Calculates probability of random variable falling between two points.
"""
p1 = normdist(x1, mu, sigma, f)
p2 = normdist(x2, mu, sigma, f)
return abs(p1-p2)
1 ответов
все они очень похожи: Если вы можете вычислить #1 с помощью функции cdf(x)
, тогда решение #2 просто 1 - cdf(x)
, а для #3 это cdf(x) - cdf(y)
.
поскольку Python включает функцию ошибки (gauss), встроенную с версии 2.7, вы можете сделать это, вычисляя cdf нормального распределения, используя уравнение из статья, которую вы связали с:
import math
print 0.5 * (1 + math.erf((x - mean)/math.sqrt(2 * standard_dev**2)))
здесь mean
- это означает, что и standard_dev
стандартный отклонение.
некоторые заметки, так как то, что вы спросили, казалось относительно простым, учитывая информацию в статье:
- CDF случайной величины (скажем, X)- вероятность того, что X лежит между-бесконечностью и некоторым пределом, скажем x (нижний регистр). CDF является интегралом pdf для непрерывных распределений. Cdf-это именно то, что вы описали для #1, вы хотите, чтобы некоторые нормально распределенные RV были между-бесконечностью и x (
- и >= одинаковы для непрерывных случайных величин, так как вероятность того, что rv-любая одиночная точка равна 0. Таким образом, включен ли сам x или нет, на самом деле не имеет значения при вычислении вероятностей для непрерывных распределений.
- сумма вероятностей равна 1, если это не = x, поэтому, если у вас есть
cdf(x)
. тогда1 - cdf(x)
- вероятность того, что случайная величина X >= x. Поскольку >= эквивалентно для непрерывных случайных величин>, это также вероятность X > x.