Стандартные библиотеки C или Python для вычисления стандартного отклонения нормального распределения - PullRequest
4 голосов
/ 25 ноября 2008

Скажем, у нас нормальное распределение n (x): среднее = 0 и \ int _ {- a} ^ {a} n (x) = P.

Какой самый простой способ вычислить стандартное отклонение такого распределения? Может быть, есть стандартные библиотеки для Python или C, которые подходят для этой задачи?

Ответы [ 4 ]

7 голосов
/ 26 ноября 2008

Если X нормальный со средним значением 0 и сигмой стандартного отклонения, он должен содержать

P = Prob[ -a <= X <= a ] = Prob[ -a/sigma <= N <= a/sigma ]
  = 2 Prob[ 0 <= N <= a/sigma ]
  = 2 ( Prob[ N <= a/sigma ] - 1/2 )

где N нормальное со средним 0 и стандартным отклонением 1. Следовательно

P/2 + 1/2 = Prob[ N <= a/sigma ] = Phi(a/sigma)

Где Phi - кумулятивная функция распределения (cdf) нормальной переменной со средним значением 0 и stddev 1. Теперь нам нужен обратный нормальный cdf (или «функция процентной точки»), которая в Python это scipy.stats.norm.ppf (). Пример кода:

from scipy.stats import norm
P = 0.3456
a = 3.0

a_sigma = float(norm.ppf(P/2 + 0.5))   # a/sigma
sigma = a/a_sigma   # Here is the standard deviation

Например, мы знаем, что вероятность того, что переменная N (0,1) попадет в интервал [-1,1], равна ~ 0,682 (темно-синяя область в на этом рисунке ). Если вы установите P = 0,682 и a = 1,0, вы получите сигма ~ 1,0, что действительно является стандартным отклонением.

5 голосов
/ 26 ноября 2008

Стандартное отклонение среднего-нулевого распределения Гаусса с Pr (-a

a/(sqrt(2)*inverseErf(P))

- это искомое выражение, где inverseErf - обратная функция ошибки (обычно называемая erf).

Для C научная библиотека Gnu (GSL) - хороший ресурс. Однако он имеет только erf, а не inverseErf, поэтому вам придется инвертировать его самостоятельно (простой бинарный поиск поможет). Кроме того, вот хороший способ приблизить erf и inverseErf:

http://homepages.physik.uni -muenchen.de / ~ Winitzki / ERF-approx.pdf

Для Python inverseErf доступен как erfinv в библиотеке SciPy, поэтому стандартное отклонение дает следующее:

a/(math.sqrt(2)*erfinv(P))

PS: в рендеринге URL Stackoverflow есть какая-то ошибка, которая не позволяет мне ссылаться на GSL выше: http://www.gnu.org/software/gsl. Это также неправильно отображает URL-адрес, указанный выше, с PDF-ссылкой.

3 голосов
/ 25 ноября 2008

SciPy содержит подпакет stats .

1 голос
/ 25 ноября 2008

Взгляните на проект sciPy , он должен иметь то, что вам нужно.

...