神经网络|(十)概率论基础知识-正态分布及python仿真
【1】引言
前序学习进程中,已经掌握了二项分布、泊松分布相关知识及其python仿真技巧,相关文章链接为:
神经网络|(八)概率论基础知识-二项分布及python仿真-CSDN博客
神经网络|(九)概率论基础知识-泊松分布及python仿真-CSDN博客
在此基础上,今天进一步学习正态分布。
【2】正态分布
【2.1】分布函数
分布函数:设X是随机变量,x是任意实数,满足F(x)=P(X≤x)的函数就是分布函数。
可以将分布函数理解为一段区间的概率,很显然:
P{x1≤X≤x2}=P(X≤x2)-P(X≤x1)=F(x2)-F(x1)
【2.2】概率密度函数
概率密度函数:如果对于随机随机变量X的分布函数F(x),存在非负可积函数f(x),对于任意实数x有,
则称X为连续型随机变量,f(x)称为X的概率密度函数,简称概率密度。
可以将概率密度函数理解为分布函数的导数,由于分布函数非负,所以概率密度非负。很显然:
【2.3】正态分布
若连续型随机变量X的概率密度函数满足:
其中,
为常数,则称X服从参数为
,
的正态分布,或者也称为高斯分布。
正态分布记作X~N(,
)。
【3】官网教程
使用python语言,调用numpy模块中的np.random.normal()函数,可以实现对正态分布的数学仿真。
numpy.random.normal()函数的官网链接为:
numpy.random.normal — NumPy v2.2 Manual
官网对numpy.random.normal()函数的说明为:
图1 np.random.normal()函数的官网说明
具体的,np.random.normal()函数的参数为:
np.random.normal( mu #均值 sigma #标准差 zise) #样本量
【4】python仿真
使用python仿真有两种方法,第一种方法是直接对正态分布的概率密度函数进行绘图,第二种方法是调用np.random.normal()函数生成一些列随机数,再对这些随机数绘制概率密度图。
【4.1】概率密度函数仿真
首先给出需要的模块:
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块
然后定义正态分布的基本参数:
# 定义正态分布的参数
# 均值
mu1 = 0
# 标准差
sigma1 = 1
sigma2 = 5
这里给出了两个标准差选项,目的是仿真不同标准差时的概率密度函数曲线。
然后定义自变量:
# 绘制正态分布的概率密度函数曲线
x1 = np.linspace(-3, 3, 100)
x2 = np.linspace(-10, 10, 100)
这里定义了两个自变量,目的是仿真不同区间范围的概率密度函数曲线。
然后定义因变量,直接将概率密度函数代入:
p1 = (1 / (np.sqrt(2 * np.pi) * sigma1)) * np.exp(-(x1 - mu1)**2 / (2 * sigma1**2))
p2 = (1 / (np.sqrt(2 * np.pi) * sigma1)) * np.exp(-(x2 - mu1)**2 / (2 * sigma1**2))
p3 = (1 / (np.sqrt(2 * np.pi) * sigma2)) * np.exp(-(x1 - mu1)**2 / (2 * sigma1**2))
p4 = (1 / (np.sqrt(2 * np.pi) * sigma2)) * np.exp(-(x2 - mu1)**2 / (2 * sigma1**2))
之后是画图:
plt.plot(x1, p1, 'k', linewidth=5,label='(-3,3),μ=0,σ=1')
plt.plot(x2, p2, 'r', linewidth=2,label='(-10,10),μ=0,σ=5')
plt.plot(x1, p3, 'g', linewidth=5,label='(-3,3),μ=0,σ=1')
plt.plot(x2, p4, '-b', linewidth=2,label='(-10,10),μ=0,σ=5')
# 添加标题和标签
plt.title('Normal Distribution Simulation')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.legend()
plt.savefig('f(x)-simulation.png')
# 显示图形
plt.show()
代码运行后,获得的图像为:
图2 概率密度函数仿真效果
由图2可见,正态分布的概率密度函数在较大范围上的分布趋势是一致的:
在取均值的时候函数获得极大值,离坐标轴两侧越远的地方,概率密度函数的取值越接近0。
标准差越大,函数的极大值越小。
此时的完整代码为:
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块
# 定义正态分布的参数
# 均值
mu1 = 0
# 标准差
sigma1 = 1
sigma2 = 5
# 绘制正态分布的概率密度函数曲线
x1 = np.linspace(-3, 3, 100)
x2 = np.linspace(-10, 10, 100)
p1 = (1 / (np.sqrt(2 * np.pi) * sigma1)) * np.exp(-(x1 - mu1)**2 / (2 * sigma1**2))
p2 = (1 / (np.sqrt(2 * np.pi) * sigma1)) * np.exp(-(x2 - mu1)**2 / (2 * sigma1**2))
p3 = (1 / (np.sqrt(2 * np.pi) * sigma2)) * np.exp(-(x1 - mu1)**2 / (2 * sigma1**2))
p4 = (1 / (np.sqrt(2 * np.pi) * sigma2)) * np.exp(-(x2 - mu1)**2 / (2 * sigma1**2))
plt.plot(x1, p1, 'k', linewidth=5,label='(-3,3),μ=0,σ=1')
plt.plot(x2, p2, 'r', linewidth=2,label='(-10,10),μ=0,σ=1')
plt.plot(x1, p3, 'g', linewidth=5,label='(-3,3),μ=0,σ=5')
plt.plot(x2, p4, '-b', linewidth=2,label='(-10,10),μ=0,σ=5')
# 添加标题和标签
plt.title('Normal Distribution Simulation')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.legend()
plt.savefig('f(x)-simulation.png')
# 显示图形
plt.show()
【4.2】np.random.normal()函数仿真
np.random.normal()函数仿真和概率密度函数仿真函数的本质区别在于:np.random.normal()函数仿真是按照正态分布的规律生成随机数,然后把随机数的概率密度绘制出来,随机数的分布本身就符合正态分布的规律;而概率密度函数的仿真,是将概率密度函数用图像画出来。
np.random.normal()函数仿真同样需要引入模块和提前定义好需要的参数:
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块
# 定义正态分布的参数
# 均值
mu1 = 0
# 标准差
sigma1 = 1
sigma2 = 5
然后还需要定义一个输出的随机数个数:
# 生成的样本数量
sample_size = 1000
之后生成随机样本数:
# 生成服从正态分布的随机数
samples1 = np.random.normal(mu1, sigma1, sample_size)
samples2 = np.random.normal(mu1, sigma2, sample_size)
因为标准差选了两个,所以生成的随机数也输出了两份。
然后就可以绘制随机数的概率分布直方图:
# 绘制直方图来可视化正态分布
plt.hist(samples1, bins=50, density=True, alpha=0.7, color='b',label='μ=0,σ=1')
plt.hist(samples2, bins=50, density=True, alpha=0.7, color='r',label='μ=0,σ=5')
之后进行图像的细节标注:
# 添加标题和标签
plt.title('Normal Distribution Simulation')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.legend()
plt.savefig('gauss-simulation.png')
# 显示图形
plt.show()
代码运行获得的图像为:
图3 np.random.normal()函数仿真效果
由图3可见,np.random.normal()函数仿真效果和概率密度函数仿真的效果一致:
在取均值的时候函数获得极大值,离坐标轴两侧越远的地方,概率密度函数的取值越接近0。
标准差越大,函数的极大值越小。
此时的完整代码为:
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块
# 定义正态分布的参数
# 均值
mu1 = 0
# 标准差
sigma1 = 1
sigma2 = 5
# 生成的样本数量
sample_size = 1000
# 生成服从正态分布的随机数
samples1 = np.random.normal(mu1, sigma1, sample_size)
samples2 = np.random.normal(mu1, sigma2, sample_size)
# 绘制直方图来可视化正态分布
plt.hist(samples1, bins=50, density=True, alpha=0.7, color='b',label='μ=0,σ=1')
plt.hist(samples2, bins=50, density=True, alpha=0.7, color='r',label='μ=0,σ=5')
# 添加标题和标签
plt.title('Normal Distribution Simulation')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.legend()
plt.savefig('gauss-simulation.png')
# 显示图形
plt.show()
【4.3】对比仿真
进一步,将概率密度函数仿真和np.random.normal()函数仿真放到一起,这里直接给出完整代码:
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块
# 定义正态分布的参数
# 均值
mu1 = 0
# 标准差
sigma1 = 1
sigma2 = 5
# 生成的样本数量
sample_size = 1000
# 生成服从正态分布的随机数
samples1 = np.random.normal(mu1, sigma1, sample_size)
samples2 = np.random.normal(mu1, sigma2, sample_size)
# 绘制直方图来可视化正态分布
plt.hist(samples1, bins=50, density=True, alpha=0.7, color='b',label='μ=0,σ=1')
plt.hist(samples2, bins=50, density=True, alpha=0.7, color='r',label='μ=0,σ=5')
# 绘制正态分布的概率密度函数曲线
x1 = np.linspace(-3, 3, 100)
x2 = np.linspace(-10, 10, 100)
p1 = (1 / (np.sqrt(2 * np.pi) * sigma1)) * np.exp(-(x1 - mu1)**2 / (2 * sigma1**2))
p2 = (1 / (np.sqrt(2 * np.pi) * sigma1)) * np.exp(-(x2 - mu1)**2 / (2 * sigma1**2))
p3 = (1 / (np.sqrt(2 * np.pi) * sigma2)) * np.exp(-(x1 - mu1)**2 / (2 * sigma1**2))
p4 = (1 / (np.sqrt(2 * np.pi) * sigma2)) * np.exp(-(x2 - mu1)**2 / (2 * sigma1**2))
plt.plot(x1, p1, 'k', linewidth=5,label='(-3,3),μ=0,σ=1')
plt.plot(x2, p2, 'r', linewidth=2,label='(-10,10),μ=0,σ=1')
plt.plot(x1, p3, 'g', linewidth=5,label='(-3,3),μ=0,σ=5')
plt.plot(x2, p4, '-b', linewidth=2,label='(-10,10),μ=0,σ=5')
# 添加标题和标签
plt.title('Normal Distribution Simulation')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.legend()
plt.savefig('Normal-simulation.png')
# 显示图形
plt.show()
代码运行获得的图像为:
图4 概率密度函数仿真和np.random.normal()函数仿真效果
由图4可见,概率密度函数仿真和np.random.normal()函数仿真效果在整体上的分布趋势完全一致,这两种仿真都可以用了学习正态分布。
进一步,因为概率密度函数仿真存在只改变自变量期间的设置,为此稍微优化一下代码,获得更具代表性的图像:
图5 概率密度函数仿真和np.random.normal()函数仿真效果-优化
此时的完整代码为:
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块
# 定义正态分布的参数
# 均值
mu1 = 0
# 标准差
sigma1 = 1
sigma2 = 5
# 生成的样本数量
sample_size = 1000
# 生成服从正态分布的随机数
samples1 = np.random.normal(mu1, sigma1, sample_size)
samples2 = np.random.normal(mu1, sigma2, sample_size)
# 绘制直方图来可视化正态分布
plt.hist(samples1, bins=50, density=True, alpha=0.7, color='b',label='μ=0,σ=1')
plt.hist(samples2, bins=50, density=True, alpha=0.7, color='r',label='μ=0,σ=5')
# 绘制正态分布的概率密度函数曲线
x1 = np.linspace(-3, 3, 100)
x2 = np.linspace(-10, 10, 100)
#p1 = (1 / (np.sqrt(2 * np.pi) * sigma1)) * np.exp(-(x1 - mu1)**2 / (2 * sigma1**2))
p2 = (1 / (np.sqrt(2 * np.pi) * sigma1)) * np.exp(-(x2 - mu1)**2 / (2 * sigma1**2))
#p3 = (1 / (np.sqrt(2 * np.pi) * sigma2)) * np.exp(-(x1 - mu1)**2 / (2 * sigma1**2))
p4 = (1 / (np.sqrt(2 * np.pi) * sigma2)) * np.exp(-(x2 - mu1)**2 / (2 * sigma1**2))
#plt.plot(x1, p1, 'k', linewidth=5,label='(-3,3),μ=0,σ=1')
plt.plot(x2, p2, 'g', linewidth=2,label='(-10,10),μ=0,σ=1')
#plt.plot(x1, p3, 'g', linewidth=5,label='(-3,3),μ=0,σ=5')
plt.plot(x2, p4, 'b', linewidth=2,label='(-10,10),μ=0,σ=5')
# 添加标题和标签
plt.title('Normal Distribution Simulation')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.legend()
plt.savefig('Normal-simulation.png')
# 显示图形
plt.show()
【5】总结
回顾了正态分布基础知识,对正态分布进行了python仿真。