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

Posted

技术标签:

【中文标题】使用 NumPy 获得反向累积密度函数?【英文标题】:Get reverse cumulative density function with NumPy? 【发布时间】:2015-12-16 13:56:47 【问题描述】:

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

形式上,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.exponential 时抽取随机样本,例如(来自[0, 1] 的统一随机样本由rF 转换以获得实际结果)。所以我的猜测是numpy.random 确实知道它提供的每个发行版的rF 函数。

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

np.random.<any_numpy_distribution>.rF

np.random.get_reverse_F(<any_custom_density_function>)

.. 还是我应该自己推导/近似它们?

【问题讨论】:

在 numpy 中你只能用数字来完成,所以最好手动完成(即明确使用逆分布rF 【参考方案1】:

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!

【讨论】:

这看起来很棒!我会看看:) ...太棒了!它开箱即用。干杯!【参考方案2】:

据我所知,没有办法直接在 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,那么您应该。此方法仅适用于在封闭形式中找不到逆的情况。

【讨论】:

足够公平 ;) numpy 是否至少为其提供的每个发行版提供 cumulative_distn(又名 F)? numpy 没有,但scipy.stats 中的分布通常提供方法cdf,这将是累积分布。 太棒了! UnivariateSplinecdf 都将非常有用。干杯:)

以上是关于使用 NumPy 获得反向累积密度函数?的主要内容,如果未能解决你的问题,请参考以下文章

概率密度函数(PDF)和累积概率密度函数(CDF)

标准正态分布的累积密度函数

Python Numpy累积/差异[重复]

在 Python 中计算累积分布函数 (CDF)

概率分布函数和概率密度函数

概率分布函数和概率密度函数