正态(高斯)分布是描述变量值如何分布的概率函数。它是关于其均值的对称分布,其中大多数观测值聚集在均值周围,并且远离均值的值的概率在两个方向上均等地逐渐减小。它是统计学中使用的最重要的概率分布函数,因为它在实际案例场景中具有优势。例如,人口的身高、测量误差等。
正态分布的概率密度函数(pdf)定义为:
其中,μ 是分布的均值或期望,σ 是分布的标准差。
正态分布的平均值为 μ,方差为 σ2。 μ=0 且 σ=1 的正态分布称为标准正态分布。
在 x 处计算的累积分布函数 (cdf) 为随机变量 (X) 的值小于或等于 x 的概率。正态分布的cdf定义为:
NumPy random.normal() 函数返回正态(高斯)分布的随机样本。
语法
numpy.random.normal(loc=0.0, scale=1.0, size=None)
参数
loc | 可选。 指定分布的平均值。 float 或 array_like of floats。默认值为 0.0。 |
scale | 可选。 指定分布的标准差。 float 或 array_like of floats。必须是非负数。默认值为 1.0。 |
size | 可选。 指定输出形状。 int 或 int 元组。如果给定形状为(m, n, k),则绘制m * n * k个样本。如果 size 为 None(默认),并且 loc 和 scale 均为标量,则返回单个值。否则,将抽取 np.broadcast(loc, scale).size 样本。 |
返回值
返回参数化正态分布的样本。 ndarray 或标量。
示例:标准正态分布的值
在下面的示例中,random.normal() 函数用于创建一个矩阵给定形状包含从标准正态分布 N(0, 1) 中抽取的随机值。
import numpy as np
size = (5,3)
sample = np.random.normal(0, 1, size)
print(sample)
上述代码的可能输出可能是:
[[-1.50667135 -2.71170091 -0.30597761]
[ 0.21858771 -0.67194669 0.29402538]
[ 0.12713626 -1.78105631 -0.81233742]
[ 1.18490393 1.29206451 1.1685965 ]
[ 0.08644936 -1.54759699 -0.44458985]]
绘制正态分布
示例:密度图
Matplotlib 是一个 Python 绘图库,可用于绘制概率图使用 hist() 函数计算正态分布的密度函数 (pdf)。
import matplotlib.pyplot as plt
import numpy as np
#修复种子以提高重现性
#结果
np.random.seed(10)
size = 10000
#抽取10000个样本
#标准正态分布
sample = np.random.normal(0, 1, size)
bin = np.arange(-5,5,0.1)
plt.hist(sample, bins=bin, edgecolor='blue')
plt.title("Standard Normal Distribution")
plt.show()
上述代码的输出将是:
示例:比较 pdf
多重概率可以使用 Seaborn kdeplot() 函数以图形方式比较密度函数。在下面的示例中,比较了三个正态分布(均值分别为 0 和标准差分别为 1、2 和 3)的 pdf。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#修复种子以提高重现性
#结果
np.random.seed(10)
size = 1000
#绘制1000个样本
#不同的正态分布
sns.kdeplot(np.random.normal(0, 1, size))
sns.kdeplot(np.random.normal(0, 2, size))
sns.kdeplot(np.random.normal(0, 3, size))
plt.legend([r"$\mu = 0, \sigma = 1$",
r"$\mu = 0, \sigma = 2$",
r"$\mu = 0, \sigma = 3$"])
plt.show()
上述代码的输出将为:
示例:比较 cdfs
可以使用 Seaborn ecdfplot() 函数以图形方式比较多个累积分布函数。在下面的示例中,比较了三个正态分布(均值分别为 0 和标准差分别为 1、2 和 3)的 cdf。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#修复种子以提高重现性
#结果
np.random.seed(10)
size = 1000
#绘制1000个样本
#不同的正态分布
sns.ecdfplot(np.random.normal(0, 1, size))
sns.ecdfplot(np.random.normal(0, 2, size))
sns.ecdfplot(np.random.normal(0, 3, size))
plt.legend([r"$\mu = 0, \sigma = 1$",
r"$\mu = 0, \sigma = 2$",
r"$\mu = 0, \sigma = 3$"])
plt.show()
上述代码的输出将为:
示例:比较 pdf(不同的平均值和标准差)
在下面的示例中,以图形方式比较了具有不同平均值和标准差的三个正态分布。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#修复种子以提高重现性
#结果
np.random.seed(10)
size = 1000
#绘制1000个样本
#不同的正态分布
sns.kdeplot(np.random.normal(0, 1, size))
sns.kdeplot(np.random.normal(3, 2, size))
sns.kdeplot(np.random.normal(6, 3, size))
plt.legend([r"$\mu = 0, \sigma = 1$",
r"$\mu = 3, \sigma = 2$",
r"$\mu = 6, \sigma = 3$"])
plt.show()
上述代码的输出将是: