【问题标题】:Sampling from a bounded domain zipf distribution从有界域 zipf 分布中采样
【发布时间】:2015-10-25 14:56:28
【问题描述】:

我想从有界域的“zipf”分布中采样。

也就是说,假设域是 {1,...,N},我希望域 i 中的每个元素以与 i ** -a 成比例的概率被选择,其中 a 是分布参数。

numpy 提供了一个 zipf 采样器 (numpy.random.zipf),但它不允许我限制域。

如何轻松地从此类分布中抽样?


如果分布参数a 大于1,我可以通过拒绝(并重新采样)所有大于N 的样本来使用numpy 采样器。但是,由于它不限制样本范围,因此尝试使用任何较小的 a 值都行不通。

当域是有限的时,使用这样的as 应该没有问题,这就是我的应用程序所需要的。

【问题讨论】:

  • @unutbu - 是的,谢谢。

标签: python distribution probability sampling


【解决方案1】:

使用scipy.stats,您可以创建自定义离散分布:

bounded_zipf = stats.rv_discrete(name='bounded_zipf', values=(x, weights))

例如,

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

N = 7
x = np.arange(1, N+1)
a = 1.1
weights = x ** (-a)
weights /= weights.sum()
bounded_zipf = stats.rv_discrete(name='bounded_zipf', values=(x, weights))

sample = bounded_zipf.rvs(size=10000)
plt.hist(sample, bins=np.arange(1, N+2))
plt.show()

产量

【讨论】:

    【解决方案2】:

    如果采样性能是一个问题,您可以实现自己的基于拒绝反转采样的采样方法。你会找到对应的Java实现here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 2021-03-04
      • 2020-04-28
      • 2017-06-06
      • 2021-08-13
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多