scipy.stats.dirichlet_multinomial.rvs 在哪里?

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

我想使用 SciPy 从 Dirichlet-multinomial 分布中抽取样本。不幸的是,似乎

scipy.stats.dirichlet_multinomial
没有定义其他分布用来生成随机样本的
rvs
方法。

我认为这相当于单个样本的以下内容:

import scipy.stats as sps

def dirichlet_multinomial_sample(alpha, n, **kwargs):
    kwargs['size'] = 1 # force size to 1 for simplicity
    p = sps.dirichlet.rvs( alpha=alpha, **kwargs )
    return sps.multinomial.rvs( n=n, p=p.ravel(), **kwargs )

可以类似地绘制多个样本(即

size > 1
),但需要多做一点工作才能提高效率。这似乎很容易实现。我的两个问题是:

  • 上面的实现正确吗?
  • 如果是,我如何向 SciPy 开发人员建议此增强功能?
python scipy statistics
1个回答
0
投票

上面的实现正确吗?

这对我来说看起来是正确的。基于PR中实现多项式的讨论,SciPy确实实现了一些代码来从多项式狄利克雷生成样本,但该代码只是测试的一部分,而不是公共API。 其中一位审稿人简要介绍了您提到的内容:

可选,可能是后续 PR 添加 RVS 方法(如
test_moments

中所示)


从他们引用的测试用例中查找代码,这就是它正在做的事情。

https://github.com/scipy/scipy/pull/17211/files#diff-a998a313f078eba79aeb6347a65117e0a0c4542a4d778a4cfd398f1737380a71R3030

rng = np.random.default_rng(28469824356873456) n = rng.integers(1, 100) alpha = rng.random(size=5) * 10 dist = dirichlet_multinomial(alpha, n) # Generate a random sample from the distribution using NumPy m = 100000 p = rng.dirichlet(alpha, size=m) x = rng.multinomial(n, p, size=m)

这看起来本质上与您正在做的事情相同,只是使用等效的 NumPy API 而不是 SciPy API。请参阅 
1

2 讨论的另一个症结是这是否需要 SciPy 提高最低版本。

问题是,如果没有 NumPy 1.22(多项形状参数的向量化),它会变得缓慢且麻烦,但这应该是 SciPy 下一个版本之前支持的最低版本,所以应该没问题。

自此消息以来,SciPy 已更改为最低版本 1.23.5,这意味着这不再是问题。

如果是,我如何向 SciPy 开发人员建议此增强功能?

您可以
提出问题

,并要求他们解决此问题。 您也可以尝试自己修复。如果你这样做,我仍然建议你先打开一个问题。这将确保您和维护者处于同一页面。

如果您决定自己修复它,我建议您阅读以下内容:

    贡献者快速入门指南
  • 在本地运行 SciPy 测试
  • 另一个多元
  • rvs()
  • 的实现,例如
    multivariate_normal.rvs()
  • 这个帖子
  • 中的评论特别提到了rvs()
    
        
© www.soinside.com 2019 - 2024. All rights reserved.