我想从" zipf"来自有界域的分布。
也就是说,假设域是{1,...,N},我希望选择域中的每个元素i,其概率与i ** -a
成比例,其中{ {1}}是分发的参数。
a
提供了一个zipf采样器(numpy.random.zipf),但它不允许我限制域。
如何轻松地从此类发布中抽样?
如果分布参数numpy
大于1,我可以通过拒绝(并重新采样)所有大于a
的样本来使用numpy
采样器。但是,由于它不限制样本范围,因此尝试使用任何较小的N
值都不起作用。
当域是有限的时,使用这样的a
不会有问题,这就是我的应用所需要的。
答案 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()
答案 1 :(得分:0)
如果采样性能存在问题,您可以基于拒绝反转采样实施自己的采样方法。您将找到相应的Java实现here。