tbc*_*tbc 5 python statistics numpy scipy
生成正态分布的整数集的最佳方法是什么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>)
Run Code Online (Sandbox Code Playgroud)
该二项式分布是正态分布的一个很好的离散近似.也就是说,
Binomial(n, p) ~ Normal(n*p, sqrt(n*p*(1-p)))
Run Code Online (Sandbox Code Playgroud)
所以你可以做到
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();
Run Code Online (Sandbox Code Playgroud)
稍后才遇到这个问题,但如果您想生成任意分布的整数集,请使用逆 CDF(百分位数)作为相关分布,scipy.stats并从中均匀地绘制百分位数。然后只需转换为整数即可:
from scipy.stats import norm
import matplotlib.pyplot as plt
import numpy as np
# Generate 10000 normal random integers with specified mean (loc) and std (scale).
draw = norm.ppf(np.random.random(10000), loc=0, scale=100).astype(int)
plt.hist(draw, bins=20)
Run Code Online (Sandbox Code Playgroud)
连续分布scipy.stats的列表可以在这里找到,离散分布的列表可以在这里找到。
对于上面的示例,您可以直接从所需的分布中提取并转换为整数,但这种方法(从 CDF 中均匀采样百分位数)的优点在于它适用于任何分布,甚至是您只能使用的分布根据数据进行数字定义!
| 归档时间: |
|
| 查看次数: |
7571 次 |
| 最近记录: |