Подтвердить что ты не робот

Вычислить вероятность в нормальном распределении, учитывая среднее значение, std в Python

Как рассчитать вероятность в нормальном распределении заданное среднее, std в Python? Я всегда могу явно указать свою собственную функцию в соответствии с определением, подобным OP в этом вопросе: Вычисление вероятности случайной переменной в распределении в Python

Просто интересно, есть ли вызов функции библиотеки, который позволит вам это сделать. По-моему, это было бы так:

nd = NormalDistribution(mu=100, std=12)
p = nd.prob(98)

В Perl есть аналогичный вопрос: Как вычислить вероятность в точке, заданной нормальным распределением в Perl?. Но я не видел его в Python.

Numpy имеет функцию random.normal, но это похоже на выборку, а не на то, что я хочу.

4b9b3361

Ответ 1

Там один в scipy.stats:

>>> import scipy.stats
>>> scipy.stats.norm(0, 1)
<scipy.stats.distributions.rv_frozen object at 0x928352c>
>>> scipy.stats.norm(0, 1).pdf(0)
0.3989422804014327
>>> scipy.stats.norm(0, 1).cdf(0)
0.5
>>> scipy.stats.norm(100, 12)
<scipy.stats.distributions.rv_frozen object at 0x928352c>
>>> scipy.stats.norm(100, 12).pdf(98)
0.032786643008494994
>>> scipy.stats.norm(100, 12).cdf(98)
0.43381616738909634
>>> scipy.stats.norm(100, 12).cdf(100)
0.5

[Остерегайтесь - просто подсказка - это то, что пропуск параметров немного широк. Из-за способа создания кода, если вы случайно напишете scipy.stats.norm(mean=100, std=12) вместо scipy.stats.norm(100, 12) или scipy.stats.norm(loc=100, scale=12), то он примет его, но молча отмените эти дополнительные аргументы ключевого слова и предоставит вам значение по умолчанию (0,1).]

Ответ 2

Scipy.stats - отличный модуль. Просто чтобы предложить другой подход, вы можете рассчитать его напрямую, используя

import math
def normpdf(x, mean, sd):
    var = float(sd)**2
    denom = (2*math.pi*var)**.5
    num = math.exp(-(float(x)-float(mean))**2/(2*var))
    return num/denom

Для этого используется формула, найденная здесь: http://en.wikipedia.org/wiki/Normal_distribution#Probability_density_function

тестировать:

>>> normpdf(7,5,5)  
0.07365402806066466
>>> norm(5,5).pdf(7)
0.073654028060664664

Ответ 3

Здесь больше информации. Сначала вы имеете дело с замороженным дистрибутивом (в этом случае замороженный означает, что его параметры установлены на определенные значения). Чтобы создать замороженный дистрибутив:

import scipy.stats
scipy.stats.norm(loc=100, scale=12)
#where loc is the mean and scale is the std dev
#if you wish to pull out a random number from your distribution
scipy.stats.norm.rvs(loc=100, scale=12)

#To find the probability that the variable has a value LESS than or equal
#let say 113, you'd use CDF cumulative Density Function
scipy.stats.norm.cdf(113,100,12)
Output: 0.86066975255037792
#or 86.07% probability

#To find the probability that the variable has a value GREATER than or
#equal to let say 125, you'd use SF Survival Function 
scipy.stats.norm.sf(125,100,12)
Output: 0.018610425189886332
#or 1.86%

#To find the variate for which the probability is given, let say the 
#value which needed to provide a 98% probability, you'd use the 
#PPF Percent Point Function
scipy.stats.norm.ppf(.98,100,12)
Output: 124.64498692758187

Ответ 4

Начиная с Python 3.8, стандартная библиотека предоставляет объект NormalDist как часть модуля statistics.

Его можно использовать для получения функции плотности вероятности ( pdf - вероятность того, что случайная выборка X будет близка к заданному значению x) для заданного среднего значения (mu) и стандартного отклонения (sigma):

from statistics import NormalDist

NormalDist(mu=100, sigma=12).pdf(98)
# 0.032786643008494994

Также обратите внимание, что объект NormalDist также предоставляет функцию кумулятивного распределения (cdf - вероятность того, что случайная выборка X будет меньше или равна x):

NormalDist(mu=100, sigma=12).cdf(98)
# 0.43381616738909634

Ответ 5

Формула, указанная в википедии, упомянутая в ответах, не может быть использована для вычисления нормальных вероятностей. Вам нужно будет написать функцию аппроксимации численного интегрирования, используя эту формулу для вычисления вероятности.

Эта формула вычисляет значение функции плотности вероятности. Поскольку нормальное распределение непрерывно, вам нужно вычислить интеграл для получения вероятностей. Сайт Википедии упоминает CDF, который не имеет закрытой формы для нормального распространения.

Ответ 6

Я написал эту программу, чтобы сделать математику для вас. Просто введите в сводную статистику. Нет необходимости предоставлять массив:

Один образец Z-критерия для доли населения:

Чтобы сделать это для среднего значения, а не для пропорции, измените формулу для z соответственно

Ответ 7

Вы можете просто использовать функцию ошибки, встроенную в математическую библиотеку, как указано на веб-сайте .

Ответ 8

В случае, если вы хотите найти область между 2 значениями, х означает = 1; стандартное отклонение = 2; вероятность х между [0,5,2]

import scipy.stats
scipy.stats.norm(1, 2).cdf(2) - scipy.stats.norm(1,2).cdf(0.5)