当前位置: 首页 > article >正文

神经网络|(十)概率论基础知识-正态分布及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有,

F(x)=\int_{-\infty }^{x}f(t)dt

则称X为连续型随机变量,f(x)称为X的概率密度函数,简称概率密度。

可以将概率密度函数理解为分布函数的导数,由于分布函数非负,所以概率密度非负。很显然:

\int_{-\infty }^{\infty }f(x)=1

P\left \{ x_{1}\leqslant x\leqslant x_{2} \right \}=F(x_{1})-F(x_{2})=\int_{x_{1}}^{x_{2}}f(x)dx

【2.3】正态分布

若连续型随机变量X的概率密度函数满足:

f(x)=\frac{1}{\sqrt{2\pi}\sigma }e^{-\frac{(x-\mu )^{2}}{2\sigma ^{2}}}(-\infty<x<\infty )

其中\mu\sigma为常数,则称X服从参数为\mu\sigma的正态分布,或者也称为高斯分布。

正态分布记作X~N(\mu,\sigma^{^{2}})。

【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仿真。


http://www.kler.cn/a/553204.html

相关文章:

  • EasyExcel 自定义头信息导出
  • Linux-GlusterFS进阶分布式卷
  • 华为最新OD机试真题-通过软盘拷贝文件-Python-OD统一考试(E卷)
  • Vision Transformer图像分类实现
  • Activity 任务栈 taskAffinity 用法
  • 【机器学习与数据挖掘实战】案例14:基于随机森林分类器的汽车公司客户细分预测
  • CMU 15-445 23Fall Lab 总结
  • ​33页PDF | 基于数字化转型的数据指标与标签体系应用架构设计方案
  • JavaScript 前端面试 4(作用域链、this)
  • 【nodejs+mysql2+docker】node后端开发+docker部署简记
  • 让大模型帮我设计crnn网络及可运行demo,gpt4o豆包qwendeepseek-r1
  • jenkins+docker自动发版java后端完整流程
  • draggable+el-tag 拖动元素有div宽度抖动问题
  • pycharm画图程序如何一步一步的调试
  • 技术分享:MyBatis SQL 日志解析脚本
  • Discuz! X3.5 根目录权限设置
  • 软件开源与AI开源的区别
  • Shapr3D在ipad上无法识别鼠标点击问题
  • 机器翻译中的编码器、自注意和解码器
  • 6.编写正排索引切分字符串|倒排索引原理|引入jieba到项目(C++)