我想使用 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
),但需要多做一点工作才能提高效率。这似乎很容易实现。我的两个问题是:
上面的实现正确吗?
这对我来说看起来是正确的。基于PR中实现多项式的讨论,SciPy确实实现了一些代码来从多项式狄利克雷生成样本,但该代码只是测试的一部分,而不是公共API。 其中一位审稿人简要介绍了您提到的内容:
可选,可能是后续 PR 添加 RVS 方法(如
https://github.com/scipy/scipy/pull/17211/files#diff-a998a313f078eba79aeb6347a65117e0a0c4542a4d778a4cfd398f1737380a71R3030test_moments
中所示)
从他们引用的测试用例中查找代码,这就是它正在做的事情。
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 开发人员建议此增强功能?
提出问题您可以
,并要求他们解决此问题。 您也可以尝试自己修复。如果你这样做,我仍然建议你先打开一个问题。这将确保您和维护者处于同一页面。
如果您决定自己修复它,我建议您阅读以下内容: