使用Python实现正态分布、正态分布采样

作者:Master He 时间:2023-10-28 06:25:01 

多元正态分布(多元高斯分布)

直接从多元正态分布讲起。多元正态分布公式如下:

使用Python实现正态分布、正态分布采样

这就是多元正态分布的定义,均值好理解,就是高斯分布的概率分布值最大的位置,进行采样时也就是采样的中心点。而协方差矩阵在多维上形式较多。

协方差矩阵

一般来说,协方差矩阵有三种形式,分别称为球形、对角和全协方差。以二元为例:

使用Python实现正态分布、正态分布采样

为了方便展示不同协方差矩阵的效果,我们以二维为例。(书上截的图,凑活着看吧,是在不想画图了)

使用Python实现正态分布、正态分布采样

其实从这个图上可以很好的看出,协方差矩阵对正态分布的影响,也就很好明白了这三个协方差矩阵是哪里来的名字了。可以看出,球形协方差矩阵,会产生圆形(二维)或者球形(三维)的等高线,对角协方差矩阵和全协方差矩阵,会产生椭圆形的等高线。更一般地,在一个D维空间中,球形协方差矩阵,会产生一个D维球面等高线;对角协方差矩阵,会产生一个坐标轴对其的椭球型等高线;全协方差矩阵,会在任意位置产生一个坐标轴对其的椭球型等高线。

当协方差矩阵是球形的或者是对角的,单独的变量之间是独立的

协方差分解

时间不足,具体解释以后再补

下面是协方差分解的原理图

使用Python实现正态分布、正态分布采样

变量的线性变换(正态分布采样原理)

使用Python实现正态分布、正态分布采样

python实现

多元正态分布在python的numpy库中有很方便一个函数:


np.random.multivariate_normal(mean=mean, cov=conv, size=N)

这个函数中,mean代表均值,是在每个维度中的均值。cov代表协方差矩阵,就像上面讲的那种形式,协方差矩阵值的大小将决定采样范围的大小。size代表需要采样生成的点数,此时输出大小为(N*D)的坐标矩阵。

另外,其他参数包括:check_valid,这个参数用于决定当cov即协方差矩阵不是半正定矩阵时程序的处理方式,它一共有三个值:warn,raise以及ignore。当使用warn作为传入的参数时,如果cov不是半正定的程序会输出警告但仍旧会得到结果;当使用raise作为传入的参数时,如果cov不是半正定的程序会报错且不会计算出结果;当使用ignore时忽略这个问题即无论cov是否为半正定的都会计算出结果

tol:检查协方差矩阵奇异值时的公差,float类型。

下面是一个小demo


import numpy as np
import matplotlib.pyplot as plt

mean = np.array([2,1])    # 均值
conv = np.array([[0.5, 0.0],  # 协方差矩阵
    [0.0, 0.5]])
axis = np.random.multivariate_normal(mean=mean, cov=conv, size=200)
x, y = np.random.multivariate_normal(mean=mean, cov=conv, size=1000).T

# print(axis[:])

plt.plot(axis[:, 0], axis[:, 1], 'ro')
plt.show()
plt.plot(x, y, 'ro')
plt.show()

注意,单独取出每个坐标轴的坐标数组时,需要在最后加上.T,否则会报错 效果展示:

使用Python实现正态分布、正态分布采样

协方差值的大小对采样的影响:


mean = np.array([2,1])    # 均值
conv = np.array([[0.5, 0.0],  # 协方差矩阵
    [0.0, 0.5]])

conv2 = np.array([[10, 0.0],  # 协方差矩阵
    [0.0, 10]])
axis = np.random.multivariate_normal(mean=mean, cov=conv, size=200)
x, y = np.random.multivariate_normal(mean=mean, cov=conv2, size=200).T

# print(axis[:])

plt.plot(axis[:, 0], axis[:, 1], 'ro')
plt.show()
plt.plot(x, y, 'ro')
plt.show()

效果如下:

使用Python实现正态分布、正态分布采样

这里没有设定随机种子店,每次随机数会有所不同。

来源:https://blog.csdn.net/qq_35826213/article/details/85311502

标签:Python,正态分布,采样
0
投稿

猜你喜欢

  • 浅析SQL语句中GROUP BY的用法

    2024-01-28 21:36:51
  • Python实现的matplotlib动画演示之细胞自动机

    2022-05-23 15:49:09
  • python实现录制全屏和选择区域录屏功能

    2022-06-18 01:06:33
  • 详解Python发送email的三种方式

    2023-07-01 07:19:28
  • nodejs使用socket5进行代理请求的实现

    2024-05-09 14:49:44
  • python神经网络MobileNet模型的复现详解

    2022-09-24 19:54:14
  • Python使用Pillow实现图像基本变化

    2021-08-26 03:30:23
  • oracle 数据按主键删除慢问题的解决方法

    2024-01-21 17:44:09
  • JS/jQ实现免费获取手机验证码倒计时效果

    2023-09-23 05:21:41
  • python排序函数sort()与sorted()的区别

    2023-09-08 23:38:08
  • 关于MySQL 优化的100个的建议

    2024-01-19 12:31:39
  • 网站中文字的视觉设计

    2008-04-16 13:35:00
  • 1500个绚丽主题 谷歌中国个人风格首页发布

    2008-11-12 11:14:00
  • Python多线程编程(三):threading.Thread类的重要函数和方法

    2021-04-22 09:02:47
  • Python中的取模运算方法

    2023-11-10 04:39:56
  • 实例探究Python以并发方式编写高性能端口扫描器的方法

    2022-01-12 14:38:52
  • 前端开发中的一些用户体验细节

    2010-10-19 12:23:00
  • 轻松实现php文件上传功能

    2023-11-17 04:34:12
  • Mysql出现问题:error while loading shared libraries: libaio解决方案

    2024-01-13 00:12:00
  • python脚本第一行如何写

    2021-03-24 22:56:32
  • asp之家 网络编程 m.aspxhome.com