从有界域zipf分布中采样

时间:2015-10-25 14:56:29

标签: python distribution probability sampling

我想从" zipf"来自有界域的分布。

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

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

  

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

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

当域是有限的时,使用这样的a不会有问题,这就是我的应用所需要的。

2 个答案:

答案 0 :(得分:5)

使用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()

的产率 enter image description here

答案 1 :(得分:0)

如果采样性能存在问题,您可以基于拒绝反转采样实施自己的采样方法。您将找到相应的Java实现here