用NumPy得到逆累积密度函数?

问题描述 投票:0回答:2

我对特定密度感兴趣,我需要以代表其形状(不是随机)的方式“定期”对其进行采样。

形式上,

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]
的均匀随机样本由
rF
转换以获得实际结果)。所以我的猜测是
numpy.random
确实知道它提供的每个发行版的
rF
函数。

如何访问它?

numpy
是否提供以下功能:

np.random.<any_numpy_distribution>.rF

np.random.get_reverse_F(<any_custom_density_function>)

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

python numpy random probability-density
2个回答
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!

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
,那么您应该。此方法仅适用于无法以封闭形式找到逆矩阵的情况。

© www.soinside.com 2019 - 2024. All rights reserved.