【问题标题】:Discretize normal distribution to get prob of a random variable离散正态分布以获得随机变量的概率
【发布时间】:2021-03-13 10:57:37
【问题描述】:

假设我从一个均值为零的正态分布中随机抽取,标准差由一个向量表示,例如,维度为 3 的向量

scale_rng=np.array([1,2,3])
eps=np.random.normal(0,scale_rng)

我需要根据我绘制上述eps 的一些模拟计算加权平均值。这个平均值的权重是“eps 的概率”(因此我将有一个具有 3 个权重的向量)。对于加权平均,我只是指算术和,其中每个分量乘以权重,即 0 到 1 之间的数字,并且所有权重的总和应为 1。 这种加权平均值应计算如下:我有一个变量的时间序列观察,x。我计算了x 的扩展滚动标准偏差(假设这是scale 中的值)。然后,我从正态分布中提取一个随机变量eps,如上所述,对于x 中的每个时间观察,我将其添加到其中,比如获得y=x+eps。最后,我需要计算y 的加权平均值,其中y 的每个值由“从均值为零且标准差等于scale 的正态分布中提取eps 的每个值的概率加权。

现在,我知道我不能认为这是 pdf 上与随机绘制的值相对应的点,因为正常的随机变量是连续的,因此某个点的 pdf 为零。因此,我发现的唯一解决方案是用一定数量的 bin 离散正态分布,然后找到用上面的代码提取的值实际被绘制的概率。我怎么能在 Python 中做到这一点?

编辑:我找到的解决方案是使用

norm.cdf(eps_it+0.5, loc=0, scale=scale_rng)-norm.cdf(eps_it-0.5, loc=0, scale=scale_rng)

这并不是真正基于离散化,但至少在我看来“概率方面”是可行的。

【问题讨论】:

  • 正态分布具有明确定义的概率密度函数,在 scipy 中显示为stats.norm。为什么不使用它?
  • @SamMason pdf 没有给我计数随机变量等于特定值的概率,而是等于一个区间。此外,pdf 可以在很小的区间内超过 1,这使得它不适合为加权平均生成权重
  • 这不太对,但我不确定如何最好地解释。可以发布一个答案,展示如何使用 PDF 来获得加权平均值。请注意,从法线提取eps,然后通过法线 PDF 进一步加权可能会对您的估计产生意想不到的影响
  • 不幸的是,使用 eps 的 pdf 构建加权平均值不是我的想法,而是其他人,我必须重现这样的结果。不幸的是,我在网上找不到任何进一步的帮助
  • 您知道您的垃圾箱的限制吗?您可能正在寻找不等的 bin 宽度以实现相等的概率,或者固定的 bin 宽度(除了最低和最高,因为法线的范围是无限的)产生不等的概率,或者可能完全是其他东西。我认为您需要在问题中提供更多信息。

标签: python random normal-distribution discretization


【解决方案1】:

这是一个让所有内容保持连续的示例。

import numpy as np
from scipy import stats

# some function we want a monte carlo estimate of
def fn(eps):
  return np.sum(np.abs(eps), axis=1)

# define distribution of eps
sd = np.array([1,2,3])
d_eps = stats.norm(0, sd)

# draw uniform samples so we don't double apply the normal density
eps = np.random.uniform(-6*sd, 6*sd, size=(10000, 3))

# calculate weights (working with log-likelihood is better for numerical stability)
w = np.prod(d_eps.pdf(eps), axis=1)
# normalise so weights sum to 1
w /= np.sum(w)

# get estimate
np.sum(fn(eps) * w)

如果我运行几次,它会给我 4.71、4.74、4.70 4.78。当eps 直接从法线中提取时,我们可以通过使用平均值来验证这是正确的:

np.mean(fn(d_eps.rvs(size=(10000, 3))))

这给了我基本相同的值,但预期的方差更低。例如4.79、4.76、4.77、4.82、4.80。

【讨论】:

  • 鉴于您使用均匀分布,您是否正在使用逆变换?此外,d_eps.rvs() 在这种情况下实现了什么?
  • rvs 只是从分布中抽取随机样本值,在这种情况下,具有 0 均值和 SD 的高斯分布由 sd 指定。我从制服中采样,所以我们从加权平均值中得到与直接采样值相同的答案。如果您真的想从高斯采样然后按高斯加权,您可以这样做,但您会做一些不同的事情,我不确定这将如何/何时有用
最近更新 更多