【问题标题】:How do you calculate the cdf of a linear transformation of the normal distribution in python?你如何计算python中正态分布的线性变换的cdf?
【发布时间】:2019-11-23 21:16:58
【问题描述】:

我有一个 pdf,它是正态分布的线性变换:

T = 0.5A + 0.5B

Mean_A = 276

Standard Deviation_A = 6.5

Mean_B = 293

Standard Deviation_A = 6

如何在 Python 中计算 T 在 281 和 291 之间的概率?

我已经尝试了以下代码:

mu1 = 276

sigma1 = 6.5

mu2 = 293

sigma2 = 6

normalized = 0.5 * scipy.stats.norm.pdf(x, loc = mu1, scale = sigma1) + 0.5 * scipy.stats.norm.pdf(x, loc = mu2, scale = sigma2)

print(normalized.cdf(291) - normalized.cdf(281))

但这出现了一个错误。

我也试过计算T ~ N(284.5, 19.5625)和的CDF

print(norm.cdf(291 - 284.5/4.422952)) 等,但这给出了一个不正确的答案。

任何帮助将不胜感激!

【问题讨论】:

  • 您是否假设两个正态随机变量AB 是独立的?一般来说,答案将取决于 2 个随机变量的协方差。
  • 也许我把它称为线性变换是不正确的,但我们基本上得到分布遵循上面的公式,即:0.5 * scipy.stats.norm.pdf(x, loc = mu1 , scale = sigma1) + 0.5 * scipy.stats.norm.pdf(x, loc = mu2, scale = sigma2)。我还尝试使用 T ~ N 计算概率,其中 E(T) = 276(0.5)+ 293(0.5) 和 Var(T) = (0.5^2)(6.5^2) + (0.5^2) (6^2) 这也是一个不正确的答案
  • 假设独立,后一种方法很好(参见下面的答案),但您不能按照伪代码建议的方式对 PDF 进行操作。

标签: python scipy probability normal-distribution cdf


【解决方案1】:

您的评论表明您假设变量是独立的,因为在这种情况下,给出的总和的均值和方差与您给出的一样。

然后,您可以通过以下方式定义总和

normalized = scipy.stats.norm(0.5*mu1 + 0.5*mu2, np.sqrt((0.5*sigma1)**2 + (0.5*sigma2)**2))

特别是,像你一样使用cdf 来获得你想要的:

In [27]: normalized.cdf(291) - normalized.cdf(281)                                              
Out[27]: 0.7147892127602181

为了验证这个结果是否符合预期,我们可以运行一个快速模拟:

In [31]: N = 10**7                                                                               

In [32]: rvs = 0.5*np.random.normal(mu1, sigma1, size=N) + 0.5*np.random.normal(mu2, sigma2, size=N)     

In [33]: ((rvs > 281) & (rvs < 291)).mean()                                                              
Out[33]: 0.7148597

确实,这是对上述精确结果的合理近似。

编辑:根据对此答案的评论,OP 实际上对 PDF 为的随机变量感兴趣

PX(x)=[1/(√2πVar1)^e^−(x−μ1)^2/2Var1]∗0.5+[1/(√2πVar2)^e^−(x−μ1)^2 /2Var2]∗0.5

值得注意的是,这不是正态分布变量的线性组合(而且它本身也不是正态分布变量),所以如果在你给出的任何练习中都这样表述,那么他们的措辞不正确。

这种情况更简单:将 PDF 从 281 积分到 291 可以通过积分每个 summand 来完成,而这只是正态分布的 PDF,因此您可以按上述方式进行:

In [43]: n1 = scipy.stats.norm(mu1, sigma1)                                                                       

In [44]: n2 = scipy.stats.norm(mu2, sigma2)                                                                       

In [45]: .5*(n1.cdf(291) - n1.cdf(281) + n2.cdf(291) - n2.cdf(281))                                      
Out[45]: 0.2785306219161424

【讨论】:

  • 这两个答案都被标记为不正确:(。我在第一次尝试时尝试了第二个答案,并且也被标记为不正确。具体来说,给出的 PDF 是 PX(x)=[1/ (√2πVar1)^e^−(x−μ1)^2/2Var1]∗0.5+[1/(√2πVar2)^e^−(x−μ1)^2/2Var2]∗0.5 ,μ1=276,σ1 =6.5,μ2=293,σ2=6K。抱歉,如果这很难阅读,但在我看来,正态高斯分布乘以 0.5 的两倍。不知道我做错了什么,提前谢谢!
  • 很公平,但那不是 0.5A + 0.5B。如果您对该 PDF 进行积分,您只需得到每个高斯积分的总和,大约为 0.2785306219161424。
  • 谢谢!!你如何在 Python 中做到这一点?
  • @b3llegsd 我也用这个更新了答案。
  • 太棒了;如果你觉得答案有用,你可以mark it as accepted
猜你喜欢
  • 1970-01-01
  • 2016-06-11
  • 2014-09-07
  • 1970-01-01
  • 2017-08-19
  • 2021-05-05
  • 2020-03-19
  • 2010-12-25
  • 2021-08-01
相关资源
最近更新 更多