首页 > 解决方案 > 你如何计算python中正态分布的线性变换的cdf?

问题描述

我有一个 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))等,但这得到了一个不正确的答案。

任何帮助将非常感激!

标签: pythonscipyprobabilitynormal-distributioncdf

解决方案


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

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

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

推荐阅读