我想从有界域中的“zipf”分发中进行抽样.
也就是说,假设域是{1,…,N},我想要选择域中的每个元素i,其概率与i ** -a成比例,其中a是a的参数.分配.
numpy提供了一个zipf采样器(numpy.random.zipf),但它不允许我限制域.
How can I easily sample from such distribution?
如果分布参数a大于1,我可以通过拒绝(并重新采样)大于N的所有样本来使用numpy采样器.但是,由于它不限制采样范围,因此尝试使用任何较小的值一个不起作用.
当域是有限的时,应该没有问题,例如,这就是我的应用程序所需要的.
解决方法:
使用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()