[英]numpy, how to generate a normally distributed set of integers
使用numpy
生成正態分布的整數集的最佳方法是什么? 我知道我可以用這樣的東西得到浮點數:
In [31]: import numpy as np
In [32]: import matplotlib.pyplot as plt
In [33]: plt.hist(np.random.normal(250, 1, 100))
Out[33]:
(array([ 2., 5., 9., 10., 19., 21., 13., 10., 6., 5.]),
array([ 247.52972483, 247.9913017 , 248.45287858, 248.91445546,
249.37603233, 249.83760921, 250.29918608, 250.76076296,
251.22233984, 251.68391671, 252.14549359]),
<a list of 10 Patch objects>)
二項分布是正態分布的良好離散近似。 也就是說,
Binomial(n, p) ~ Normal(n*p, sqrt(n*p*(1-p)))
所以你可以做到
import numpy as np
import matplotlib.pyplot as plt
from math import sqrt
bi = np.random.binomial(n=100, p=0.5, size=10000)
n = np.random.normal(100*0.5, sqrt(100*0.5*0.5), size=10000)
plt.hist(bi, bins=20, normed=True);
plt.hist(n, alpha=0.5, bins=20, normed=True);
plt.show();
稍后會遇到這個問題,但是如果你想生成一個任意分布的整數集,請使用相反分布的逆CDF(百分位數),例如scipy.stats
並從中統一繪制百分位數。 然后只需轉換為整數即可完成:
from scipy.stats import norm
import matplotlib.pyplot as plt
# Generate 1000 normal random integers with specified mean and std.
draw = norm.ppf(np.random.random(1000), loc=mean, scale=std).astype(int)
plt.hist(draw)
可以在此處找到scipy.stats
中的連續分布列表, scipy.stats
可以在此處找到 離散分布列表。
對於上面的例子,您可以直接從您想要的分布中繪制並轉換為整數,但這種方法的好處(從CDF統一采樣百分位數)是它適用於任何分布,即使只有一個分布從數據中數字定義!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.