我应该使用什么方法来计算正态分布的反概率密度函数?我正在使用scipy来计算正态分布的概率密度函数:
from scipy.stats import norm
norm.pdf(1000, loc=1040, scale=210)
0.0018655737107410499
如何确定在给定的正态分布中,0.0018的概率对应于1000?
我应该使用什么方法来计算正态分布的反概率密度函数?我正在使用scipy来计算正态分布的概率密度函数:
from scipy.stats import norm
norm.pdf(1000, loc=1040, scale=210)
0.0018655737107410499
如何确定在给定的正态分布中,0.0018的概率对应于1000?
概率密度与分位数之间不存在1:1的映射关系。
由于正态分布的概率密度函数是二次函数,因此可能存在2个、1个或0个分位数具有特定的概率密度。
实际上,解析地找到根并不难。正态分布的概率密度函数为:
稍加整理即可得:
(x - mu)**2 = -2 * sigma**2 * log( pd * sigma * sqrt(2 * pi))
如果右侧的判别式小于0,则没有实数根。如果等于零,则存在一个根(其中x=mu),如果大于0,则存在两个根。
将所有内容组合成一个函数:
import numpy as np
def get_quantiles(pd, mu, sigma):
discrim = -2 * sigma**2 * np.log(pd * sigma * np.sqrt(2 * np.pi))
# no real roots
if discrim < 0:
return None
# one root, where x == mu
elif discrim == 0:
return mu
# two roots
else:
return mu - np.sqrt(discrim), mu + np.sqrt(discrim)
from scipy.stats import norm
pd = norm.pdf(1000, loc=1040, scale=210)
print get_quantiles(pd, 1040, 210)
# (1000.0000000000001, 1079.9999999999998)
import scipy.stats as stats
import scipy.optimize as optimize
norm = stats.norm(loc=1040, scale=210)
y = norm.pdf(1000)
print(y)
# 0.00186557371074
print(optimize.fsolve(lambda x:norm.pdf(x)-y, norm.mean()-norm.std()))
# [ 1000.]
print(optimize.fsolve(lambda x:norm.pdf(x)-y, norm.mean()+norm.std()))
# [ 1080.]
fsolve
并不能保证找到所有满足 pdf(x)
等于某个特定值的 x
,但它可能会帮助您找到 一些 根。
0.0018
不是概率,它是概率密度。你想要使用反向概率密度函数做什么?我从未见过在统计学中它被使用过。更常见的事情是寻找累积密度函数(cdf)的反函数,它可以返回概率。你可以使用norm.ppf
来得到反向cdf。 - Jaime