【问题标题】:scipy.stats cdf greater than 1scipy.stats cdf 大于 1
【发布时间】:2021-07-21 21:49:57
【问题描述】:

我正在使用 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]

【问题讨论】:

  • 哪个分布,什么参数?请添加复制者
  • 如果它是 scipy 中的错误,将它放在 scipy 项目的错误跟踪器上可能更合适。我不知道那可能在哪里。

标签: python scipy probability


【解决方案1】:

问题在于您为高斯超几何 (HG) 分布指定的参数,特别是在 params 的第三个元素中,它是 HG 分布中的参数 beta(请参阅 this paper 中的公式 2高斯超几何分布密度的定义)。此参数必须为正,才能使 HG 具有有效的密度。否则,密度不会积分为 1,这正是您的示例中发生的情况。如果 beta 为负,则该分布不是有效的概率分布。

您还可以在 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]

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

【讨论】:

  • 谢谢,这是有道理的,但是我对一个细节很好奇:我从 scipy 的 .fit() 中获取了参数,这意味着 fit() 返回的是无效参数。
  • 你能贴出 fit 方法的代码吗?也许它以不同的顺序返回参数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 2019-04-10
  • 2014-12-20
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2017-05-20
相关资源
最近更新 更多