Python生成正态分布的随机数

Posted 微小冷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python生成正态分布的随机数相关的知识,希望对你有一定的参考价值。

文章目录

正态分布

正态分布,最早由棣莫弗在二项分布的渐近公式中得到,而真正奠定正态分布地位的,却是高斯对测量误差的研究。测量是人类与自然界交互中必不可少的环节,测量误差的普遍性,确立了正态分布作用范围的广泛性,或许正因如此,正态分布才又被称为Gauss分布。

np.random中提供了高斯分布、对数高斯分布、标准高斯分布以及逆高斯分布的一元随机数生成器,此外还有多元正态分布生成器。

其中,正态分布、对数正态分布以及逆高斯分布的概率密度函数如下表

normal([loc, scale]) 1 2 π σ 2 exp ⁡ [ − ( x − μ ) 2 2 σ 2 ] \\frac1\\sqrt2\\pi\\sigma^2\\exp[-\\frac(x-\\mu)^22\\sigma^2] 2πσ2 1exp[2σ2(xμ)2]正态分布
lognormal([mean, sigma]) 1 σ x 2 π e − ( ln ⁡ ( x ) − x ) 2 2 σ 2 \\frac1\\sigma x\\sqrt2\\pie^-\\frac(\\ln(x)-x)^22\\sigma^2 σx2π 1e2σ2(ln(x)x)2对数正态分布
wald(mean, scale) λ 2 π x 3 exp ⁡ [ − λ ( x − μ ) 2 2 μ 2 x ] \\sqrt\\frac\\lambda2\\pi x^3\\exp[-\\frac\\lambda(x-\\mu)^22\\mu^2x] 2πx3λ exp[2μ2xλ(xμ)2]逆高斯分布

逆高斯分布的说法容易引发歧义,实际上,逆高斯分布和高斯分布相当于布朗运动研究中的两个视角。在布朗运动中,高斯分布描述的是某一固定时刻距离的分布;而逆高斯分布则是达到固定距离所需时间的分布。

从分布的形式来看,当 λ \\lambda λ趋近于无穷大时,逆高斯分布趋向于高斯分布。

特别地,当 μ = λ = 1 \\mu=\\lambda=1 μ=λ=1时,逆高斯分布又被称为Wald分布,其概率密度函数表达式为

p ( x ) = 1 2 π x 3 exp ⁡ [ − ( x − 1 ) 2 2 x ] p(x)=\\sqrt\\frac12\\pi x^3\\exp[-\\frac(x-1)^22x] p(x)=2πx31 exp[2x(x1)2]

Python生成高斯分布和逆高斯分布

接下来绘制一下高斯分布和逆高斯分布。

import numpy as np
import matplotlib.pyplot as plt
labels = ["Gaussian distribution",
"Inverse Gaussian distribution"]
dists = [np.random.normal,
np.random.wald]
fig = plt.figure()
for i in range(2):
    ax = fig.add_subplot(1,2,i+1)
    xs = dists[i](2,1,size=1000)
    ax.set_title(labels[i])
    plt.hist(xs,100)

plt.show()

效果如下

Python生成多元Gauss分布

多元高斯分布的主要参数仍为期望和方差,但所谓多元分布,在坐标层面的表现就是坐标轴的个数,也就是向量维度。所以N个元素对应N维向量,也就有N个期望;而方差则进化为了协方差矩阵,下面可以画个图演示一下

mean = [0, 0]
cov = [[0, 1], [10, 0]]
x, y = np.random.multivariate_normal(mean, cov, 5000).T

def scatter_hist(x, y, ax_histx, ax_histy):
    ax_histx.tick_params(axis="x", labelbottom=False)
    ax_histy.tick_params(axis="y", labelleft=False)
    binwidth = 0.25
    xymax = max(np.max(np.abs(x)), np.max(np.abs(y)))
    lim = (int(xymax/0.25) + 1) * 0.25
    bins = np.arange(-lim, lim + binwidth, binwidth)
    ax_histx.hist(x, bins=bins)
    ax_histy.hist(y, bins=bins, orientation='horizontal')

fig = plt.figure()
gs = fig.add_gridspec(2, 2,  
    width_ratios=(4, 1),  
    height_ratios=(1, 4))

ax = fig.add_subplot(gs[1, 0])
ax.scatter(x, y, marker='x')

ax_histx = fig.add_subplot(gs[0, 0], sharex=ax)
ax_histy = fig.add_subplot(gs[1, 1], sharey=ax)
scatter_hist(x, y, ax_histx, ax_histy)
plt.show()

效果如下

python生成卡方分布

参考技术A 若n个相互独立的随机变量 ,均服从标准正态分布(也称独立同分布于标准正态分布),则这n个服从标准正态分布的随机变量的平方和

构成一新的随机变量,其卡方分布规律称为 分布(chi-square distribution),其中参数 称为自由度,正如正态分布中均值或方差不同就是另一个正态分布一样,自由度不同就是另一个分布。卡方分布是由正态分布构造而成的一个新的分布,当自由度 很大时, 分布近似为正态分布。 对于任意正整数 , 自由度为 的卡方分布是一个随机变量 的机率分布。

以上是关于Python生成正态分布的随机数的主要内容,如果未能解决你的问题,请参考以下文章

python怎样生成正太分布的随机数

用python生成随机数的几种方法

如何用python生成随机的15行6列的随机数据

python生成卡方分布

Python生成正态分布的随机数

如何在 Python 中为截断的正态分布生成相关随机数?