从有界域zipf分布中采样

R B*_*R B 4 python distribution probability sampling

我想从有界域中的"zipf"分发中进行抽样.

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

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

我怎样才能从这种分布中轻松抽样?


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

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

unu*_*tbu 5

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

bounded_zipf = stats.rv_discrete(name='bounded_zipf', values=(x, weights))
Run Code Online (Sandbox Code Playgroud)

例如,

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()
Run Code Online (Sandbox Code Playgroud)

产量 在此输入图像描述