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

Python 使用NumPy获取反向累积密度函数?,python,numpy,random,probability-density,Python,Numpy,Random,Probability Density,我对一个特定的密度感兴趣,我需要以一种代表其形状(不是随机)的方式“有规律地”采样 形式上,f是我的密度函数,f是相应的累积密度函数(f'=f),其反向函数rF=f^-1确实存在。我感兴趣的是通过F^-1将[0,1]中的常规样本转换到我的变量域中。比如: import numpy as np uniform_sample = np.linspace(0., 1., 256 + 2)[1:-1] # source sample shaped_sample = rF(uniform_sample)

我对一个特定的密度感兴趣,我需要以一种代表其形状(不是随机)的方式“有规律地”采样

形式上,
f
是我的密度函数,
f
是相应的累积密度函数(
f'=f
),其反向函数
rF=f^-1
确实存在。我感兴趣的是通过
F^-1
[0,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.index
时内部用于绘制随机样本,例如(来自
[0,1]
的均匀随机样本通过
rF
转换以获得实际结果)。所以我猜,
numpy.random
确实知道它提供的每个发行版的
rF
函数

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

np.random.<any_numpy_distribution>.rF
np.random..rF

np.random.get\u reverse\u F()

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

据我所知,在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
,那么您应该这样做。此方法仅适用于在闭合形式中找不到逆的情况。

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

所有这些都有一个
ppf()
方法,可以满足您的需要

在您的示例中:

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!

在numpy中,您只能通过数字来实现这一点,因此最好手动实现(即明确使用反向分布
rF
),这是非常公平的;)
numpy
是否为其提供的每个发行版至少提供了
累积分布(又称
F
)?
numpy
没有,但中的发行版通常提供了方法
cdf
,这将是累积分布。太棒了!
单变量样条线
cdf
都将非常有用。干杯:)这看起来很棒!我来看看:)。。。令人惊叹的!它只是开箱即用。干杯
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!