2008-11-25 2 views
4

говорят, что мы имеем нормальное распределение N (X): среднее = 0 и \ int _ {- а}^{а} п (х) = P.Standard C или Python библиотеки для вычисления стандартного отклонения нормального распределения

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

+0

Не стандартное отклонение нормального распределения со средним значением 0, всегда 1,0? Разве это не определение? – 2008-11-25 18:32:05

ответ

5

Стандартное отклонение средней нулевой гауссовым распределением с 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-ссылку.

7

Если 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) 

Где Фи является кумулятивная функция распределения (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) переменная падения INT интервал [-1.1] составляет ~ 0,682 (темно-синяя область в this figure). Если вы установите P = 0.682 и a = 1.0, вы получите сигма ~ 1.0, что действительно является стандартным отклонением.

Смежные вопросы