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 应该没有问题,这就是我的应用程序所需要的.
使用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)
| 归档时间: |
|
| 查看次数: |
709 次 |
| 最近记录: |