使用NumPy获得反向累积密度函数?

时间:2015-12-16 13:56:48

标签: python numpy random probability-density

我对特定密度感兴趣,我需要定期对它进行采样"定期"以某种方式表示其形状(非随机)。

形式上,f是我的密度函数,F是相应的累积密度函数(F' = f),其反函数rF = F^-1确实存在。我有兴趣通过[0, 1]F^-1的常规样本投射到我的变量域中。类似的东西:

import numpy as np
uniform_sample = np.linspace(0., 1., 256 + 2)[1:-1] # source sample
shaped_sample = rF(uniform_sample) # this is what I want to get

是否有专门的方式使用numpy执行此操作,还是应该手动执行此操作?这是'手工'指数法的方法:

l = 5. # exponential parameter
# f = lambda x: l * np.exp(-l * x) # density function, not used
# F = lambda x: 1 - np.exp(-l * x) # cumulative density function, not used either
rF = lambda y: np.log(1. / (1. - y)) / l # reverse `F^-1` function
# What I need is:
shaped_sample = rF(uniform_sample)

我知道,理论上,rF在内部用于在调用np.random.exponential时绘制随机样本(例如,来自[0, 1]的统一随机样本由{{转换} 1}}得到实际结果)。所以我的猜测是rF确实知道它提供的每个发行版的numpy.random函数。

我如何访问它? rF是否提供以下功能:

numpy

np.random.<any_numpy_distribution>.rF

..或者我应该自己推导/近似它们?

2 个答案:

答案 0 :(得分:4)

据我所知,没有办法直接在numpy中这样做。对于累积分布是分析的函数的情况,但它是反函数的,我通常使用样条函数来进行数值反演。

from scipy.interpolate import UnivariateSpline

x = np.linspace(0.0, 1.0, 1000)
F = cumulative_distn(x) #This we know and is analytic

rF = UnivariateSpline(F, x) #This will then be the inverse

请注意,如果您可以手动将F转换为rF,那么应该。此方法仅适用于无法以封闭形式找到逆的情况。

答案 1 :(得分:4)

scipy对numpy.random中所有(我认为)的概率分布都有概率分布对象。

http://docs.scipy.org/doc/scipy/reference/stats.html

所有人都有ppf()方法可以做你想要的。

http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rv_continuous.ppf.html

在你的例子中:

import scipy.stats as st

l = 5. # exponential parameter
dist = st.expon(0., l) # distribution object provided by scipy
f  = dist.pdf # probability density function
F  = dist.cdf # cumulative density function
rF = dist.ppf # percent point function : reverse `F^-1` function
shaped_sample = rF(uniform_sample)
# and much more!