python – 从有界域zipf分布中采样

我想从有界域中的“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()

产量
python  – 从有界域zipf分布中采样

上一篇:python绘制图形 青少年编程电子学会python编程等级考试一级真题解析2021-3


下一篇:php – 从变量权重中随机生成组合