使用Python实现正态分布、正态分布采样
作者:Master He 发布时间:2023-10-28 06:25:01
多元正态分布(多元高斯分布)
直接从多元正态分布讲起。多元正态分布公式如下:
这就是多元正态分布的定义,均值好理解,就是高斯分布的概率分布值最大的位置,进行采样时也就是采样的中心点。而协方差矩阵在多维上形式较多。
协方差矩阵
一般来说,协方差矩阵有三种形式,分别称为球形、对角和全协方差。以二元为例:
为了方便展示不同协方差矩阵的效果,我们以二维为例。(书上截的图,凑活着看吧,是在不想画图了)
其实从这个图上可以很好的看出,协方差矩阵对正态分布的影响,也就很好明白了这三个协方差矩阵是哪里来的名字了。可以看出,球形协方差矩阵,会产生圆形(二维)或者球形(三维)的等高线,对角协方差矩阵和全协方差矩阵,会产生椭圆形的等高线。更一般地,在一个D维空间中,球形协方差矩阵,会产生一个D维球面等高线;对角协方差矩阵,会产生一个坐标轴对其的椭球型等高线;全协方差矩阵,会在任意位置产生一个坐标轴对其的椭球型等高线。
当协方差矩阵是球形的或者是对角的,单独的变量之间是独立的
协方差分解
时间不足,具体解释以后再补
下面是协方差分解的原理图
变量的线性变换(正态分布采样原理)
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,否则会报错 效果展示:
协方差值的大小对采样的影响:
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()
效果如下:
这里没有设定随机种子店,每次随机数会有所不同。
来源:https://blog.csdn.net/qq_35826213/article/details/85311502
猜你喜欢
- 在/etc/profile.d/简历oracle.sh内容如下在NLS_LANG设置编码ORACLE_HOME=/usr/lib/oracl
- 中文乱码问题当我第一次接触mysql,首先让我难受的是mysql的乱码问题,百度上也有许多有关的解决方案,不过作为亲身受害者,我想很有必要贴
- 所谓天赋(左脑和右脑)也就是你是否有艺术天赋,天赋也许是存在的,这主要在于人类左右脑的分工。左脑主要负责逻辑理解、语言、判断、分类、分析、推
- 问题描述我正在用Python 3.4.1来构建一个Django项目。 manage.py runserver 引发Uni
- 导语"盘子里最后一块肉给你 一 冰激凌的第一口给你 一手机最后的10%电量给你!"哈喽大家好!我是木木子,我要开始给大家
- 如果要在某个数组中删除一个元素,可以直接用的unset,但今天看到的东西却让我大吃一惊<?php$arr = array('a
- SQL防注入代码一<?php /** * 防sql注入 * @author: zhuyubing@gmail.com * */ /**
- 使用router.meta.keepAlive对页面进行缓存需求:1. 从stockList页面到stockInfo页面,从stockInf
- Dreamweaver MX 2004的强大功能以及更加完善的人性化设置已经深受大家喜爱。在此笔者就谈
- 原因:使用git clone项目后,项目根路径是小写英文名称,比如cmdbapi,但是项目里面的import导入自己的相关包时,红色报错解决
- 1.下载与安装Anaconda3首先去官网Anaconda下载网址下载Anaconda3,我安装的版本是Anaconda3 2019.03(
- Python中除了字典,列表,元组还有一个非常好用的数据结构,那就是set了,灵活的运用set可以减去不少的操作(虽然set可以用列表代替)
- 做运维的朋友应该知道,公司IDC机房经常有上架、下架、报修和报废的服务器。如果服务器数量很多的时候很容易造成监控遗漏。  
- 如下所示:from numpy import *import numpy as npimport matplotlib.pyplot as
- python np.dot(a,b)运算规则解析首先我们知道dot运算时不满 * 换律的,np.dot(a, b)与np.dot(b, a)是
- 一、生成日期数据import pandas as pdpd.date_range( )同生成随机数的思想类似,使用pandas库中的函数pd
- SQLSTATESQL SERVER 驱动程序错误描述 HY000所有绑定列都是只读的。必须是可升级的列,以使用 SQLSetPos 或 S
- 生活中我们经常会遇到一些加密算法,今天我们就聊聊这些加密算法的Python实现。部分常用的加密方法基本都有对应的Python库,基本不再需要
- Hello,World,几乎是程序猿学习各种语言的第一个程序,心血来潮,有空拿主流开发语言如何实现,汇总并整理了下.包括大致快速了解下这门语
- 提起数据库,第一个想到的公司,一般都会是Oracle。该公司成立于1977年,最初是一家专门开发数据库的公司。Oracle在数据库领域一直处