scipy.stats cdf 大于 1

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

我正在使用 scipy.stats,对于某些分布,我需要 CDF 达到给定值 x,我知道 PDF 可以大于 1,因为它们不是概率而是密度,因此即使特定值更大,它们也应该积分为 1 ,但 CDF 永远不应大于 1,当在 scipy.stats 上运行 cdf 函数时,有时我会得到像 2.89 这样的值,我完全确定我使用的是 cdf 而不是 pdf(这是我的第一个猜测),这很混乱我的结果和算法因为我需要累积概率,为什么 scipy.stats cdf 返回值大于 1 和/或我应该如何继续修复它?

使用样本分布和参数重现问题的代码(但它也发生在其他人身上):

from scipy import stats
distribution = stats.gausshyper
params = [9.482986347673158, 16.65813644507513, -38.11083665959626, 16.08698932118982, -13.387170754433273, 18.352117022674125]
test_val = [-0.512720,1,1]

arg = params[:-2]
loc = params[-2]
scale = params[-1]

print("cdf:",distribution.cdf(test_val,*arg, loc=loc,scale=scale))
print("pdf:",distribution.pdf(test_val,*arg, loc=loc,scale=scale))

cdf: [2.68047481 7.2027761 7.2027761 ] PDF格式:[2.76857133 2.23996739 2.23996739]

python scipy probability
2个回答
2
投票

问题在于您为高斯超几何 (HG) 分布指定的参数,特别是

params
的第三个元素,即 HG 分布中的参数 beta(请参见本文 中的等式 2高斯超几何分布密度的定义)。此参数 必须为正 才能使 HG 具有有效密度。否则,密度不会积分为 1,这正是您的示例中发生的情况。对于负贝塔,分布不是有效的概率分布。

您还可以在 scipy 文档 here 中找到 beta(表示为 b)必须为正的要求。 将 beta 更改为正参数立即解决您的问题:

from scipy import stats
distribution = stats.gausshyper
params = [9.482986347673158, 16.65813644507513, 38.11083665959626, 16.08698932118982, -13.387170754433273, 18.352117022674125]
test_val = [-0.512720,1,1]

arg = params[:-2]
loc = params[-2]
scale = params[-1]

print("cdf:",distribution.cdf(test_val,*arg, loc=loc,scale=scale))
print("pdf:",distribution.pdf(test_val,*arg, loc=loc,scale=scale))

输出:

cdf: [1. 1. 1.]
pdf: [3.83898392e-32 1.25685346e-35 1.25685346e-35]

,其中所有 cdfs 根据需要积分为 1。另请注意,您的 x 也必须介于 0 和 1 之间,如 scipy 文档中所述here.


0
投票

我找到了 stats.gausshyper 的另一种参数组合,它满足 SciPy 给出的条件,但产生了一个无效的概率密度函数。在代码中,您可以看到 cdf >1。所以,一定有错误,对吧?

import scipy.stats as stats
import matplotlib.pyplot as plt

distribution = stats.gausshyper
params = [52.216138207831264, 1.3126311018266767, 19.57494020511408, 6.006628719585246, -5.347822064195698, 6.309565370694811]

arg = params[:-2]
loc = params[-2]
scale = params[-1]

x = np.linspace(0,1)
plt.plot(x, dist.pdf(x))

print("cdf at 0.5: ",distribution.cdf(0.5, *arg, loc=loc, scale=scale))
© www.soinside.com 2019 - 2024. All rights reserved.