【发布时间】:2015-04-22 18:35:16
【问题描述】:
我正在使用numpy.random.randn和numpy.random.rand来生成随机数。我对random.randn 和random.rand 之间的区别感到困惑?
【问题讨论】:
我正在使用numpy.random.randn和numpy.random.rand来生成随机数。我对random.randn 和random.rand 之间的区别感到困惑?
【问题讨论】:
docs 中提到了两者的主要区别。链接到Doc rand 和Doc randn
对于 numpy.rand,您会得到由均匀分布生成的随机值在 0 - 1
但是对于 numpy.randn,您会得到从正态分布生成的随机值,均值为 0,方差为 1。
只是一个小例子。
>>> import numpy as np
>>> np.random.rand(10)
array([ 0.63067838, 0.61371053, 0.62025104, 0.42751699, 0.22862483,
0.75287427, 0.90339087, 0.06643259, 0.17352284, 0.58213108])
>>> np.random.randn(10)
array([ 0.19972981, -0.35193746, -0.62164336, 2.22596365, 0.88984545,
-0.28463902, 1.00123501, 1.76429108, -2.5511792 , 0.09671888])
>>>
如您所见,rand 为我提供了 0-1 内的值,
而 randn 为我提供了 mean == 0 和 variance == 1
为了进一步解释,让我生成一个足够大的样本:
>>> a = np.random.rand(100)
>>> b = np.random.randn(100)
>>> np.mean(a)
0.50570149531258946
>>> np.mean(b)
-0.010864958465191673
>>>
您可以看到 a 的平均值接近于使用 rand 生成的0.50。另一方面,b 的平均值接近于使用 randn
0.0
【讨论】:
您可以也通过百分比点函数 (ppf) 用于正态分布,随机变量分布 ~ N(0,1)。这是一种众所周知的方法,可以将任何均匀随机变量 (0,1) 投影到 ppf 上,以获得所需累积分布的随机变量。
在 Python 中,我们可以将这个过程可视化如下:
from numpy.random import rand
import matplotlib.pyplot as plt
from scipy.stats import norm
u = rand(100000) # uniformly distributed rvs
z = norm.ppf(u) # ~ N(0,1) rvs
plt.hist(z,bins=100)
plt.show()
【讨论】: