只是想知道是否有一个库函数调用可以让您完成这个任务。在我的想象中,它应该是这样的:
nd = NormalDistribution(mu=100, std=12)
p = nd.prob(98)
在Perl中有一个类似的问题:如何计算给定正态分布下某一点的概率? 但是我没有在Python中看到。
Numpy
有一个random.normal
函数,但它更像是样本抽取,不是我想要的准确计算方式。
nd = NormalDistribution(mu=100, std=12)
p = nd.prob(98)
在Perl中有一个类似的问题:如何计算给定正态分布下某一点的概率? 但是我没有在Python中看到。
Numpy
有一个random.normal
函数,但它更像是样本抽取,不是我想要的准确计算方式。
在 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)。
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
prob = [0.5 0.5 0.5]
prob = [0.59870633 0.63055866 0.69146246]
prob = [0.69146246 0.74750746 0.77337265]
- John Deighan这里有更多信息。
首先,您正在处理冻结分布(在本例中,"frozen"的意思是其参数已设置为特定值)。要创建一个冻结分布:
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's 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's 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's 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
从 Python 3.8
开始,标准库提供了 NormalDist
对象作为 statistics
模块的一部分。
它可以用来获取给定平均值(mu
)和标准偏差(sigma
)的概率密度函数(pdf
- 随机样本 X 接近给定值 x 的可能性):
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
如果您想要找到x取值在[0.5,2]之间的概率,其中x的平均值为1,标准差为2,请按如下操作:
import scipy.stats
scipy.stats.norm(1, 2).cdf(2) - scipy.stats.norm(1,2).cdf(0.5)
pdf()
是不同的。 概率是变量具有特定值的机会,而概率密度是变量接近特定值的机会,也就是说在一个范围内的概率。因此,要获得概率,您需要计算给定区间上概率密度函数的积分。作为一种近似方法,您可以将感兴趣的区间的概率密度乘以该区间,这将给出实际概率。import numpy as np
from scipy.stats import norm
data_start = -10
data_end = 10
data_points = 21
data = np.linspace(data_start, data_end, data_points)
point_of_interest = 5
mu = np.mean(data)
sigma = np.std(data)
interval = (data_end - data_start) / (data_points - 1)
probability = norm.pdf(point_of_interest, loc=mu, scale=sigma) * interval
维基百科上引用的公式不能用于计算正态概率。为了计算概率,您需要编写一个数值积分逼近函数,使用该公式。
该公式计算概率密度函数的值。由于正态分布是连续的,因此必须计算积分以获得概率。维基百科网站提到了CDF,但对于正态分布没有闭合形式。
multivariate_normal.pdf(x, mean= mean_vec, cov=cov_matrix)
来计算它。如果要计算均值而不是比例,请相应地更改z的公式
编辑:
以下是链接中的内容:
import scipy.stats as stats
import math
def one_sample_ztest_pop_proportion(tail, p, pbar, n, alpha):
#Calculate test stat
sigma = math.sqrt((p*(1-p))/(n))
z = round((pbar - p) / sigma, 2)
if tail == 'lower':
pval = round(stats.norm(p, sigma).cdf(pbar),4)
print("Results for a lower tailed z-test: ")
elif tail == 'upper':
pval = round(1 - stats.norm(p, sigma).cdf(pbar),4)
print("Results for an upper tailed z-test: ")
elif tail == 'two':
pval = round(stats.norm(p, sigma).cdf(pbar)*2,4)
print("Results for a two tailed z-test: ")
#Print test results
print("Test statistic = {}".format(z))
print("P-value = {}".format(pval))
print("Confidence = {}".format(alpha))
#Compare p-value to confidence level
if pval <= alpha:
print("{} <= {}. Reject the null hypothesis.".format(pval, alpha))
else:
print("{} > {}. Do not reject the null hypothesis.".format(pval, alpha))
#one_sample_ztest_pop_proportion('upper', .20, .25, 400, .05)
#one_sample_ztest_pop_proportion('two', .64, .52, 100, .05)
你可以直接使用数学库中内置的误差函数,正如他们在网站上所述。
scipy.stats.norm(100, 12).pdf(98)
时,这是否意味着在一个均值为100、标准差为12的分布中得到98的概率是0.032? - Srivatsanrv.cdf(102) - rv.cdf(98)
的计算式,其中rv = scipy.stats.norm(100, 12)
。 - fuglede