首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逆概率密度函数

逆概率密度函数
EN

Stack Overflow用户
提问于 2014-03-08 02:01:55
回答 2查看 5.3K关注 0票数 4

用什么方法计算正态分布的概率密度函数?我用正态概率密度函数来求出:

代码语言:javascript
复制
from scipy.stats import norm
norm.pdf(1000, loc=1040, scale=210)
0.0018655737107410499

在给定的正态分布中,我如何计算出0.0018的概率对应于1000?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-08 02:15:07

从概率密度到分位数不可能有1:1映射。

由于正态分布的PDF是二次型的,所以可以有2,1或零分位数,它们具有特定的概率密度。

更新

实际上,要从分析中找到根源并不难。正态分布的PDF由:

经过一些重新安排,我们得到:

代码语言:javascript
复制
(x - mu)**2 = -2 * sigma**2 * log( pd * sigma * sqrt(2 * pi))

如果RHS上的判别式< 0,则没有真正的根。如果它等于零,就有一个根(其中x= mu),当它>0时有两个根。

把它放在一起变成一个函数:

代码语言:javascript
复制
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)

这使所需的分位数在四舍五入误差范围内:

代码语言:javascript
复制
from scipy.stats import norm
pd = norm.pdf(1000, loc=1040, scale=210)
print get_quantiles(pd, 1040, 210)
# (1000.0000000000001, 1079.9999999999998)
票数 4
EN

Stack Overflow用户

发布于 2014-03-08 02:47:02

代码语言:javascript
复制
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.]

存在着达到任意值无限次的分布。(例如,在长度为1/2、1/4、1/8等的无限间隔序列上,值为1的简单函数获得无穷次的值。它是一个分布,因为1/2 + 1/4 + 1/8 +…= 1)

因此,以上fsolve的使用并不能保证找到x的所有值,其中pdf(x)等于某个值,但它可能会帮助您找到一些根。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22264046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档