使⽤Python实现正态分布、正态分布采样
多元正态分布(多元⾼斯分布)
直接从多元正态分布讲起。多元正态分布公式如下:
这就是多元正态分布的定义,均值好理解,就是⾼斯分布的概率分布值最⼤的位置,进⾏采样时也就是采样的中⼼点。⽽协⽅差矩阵在多维上形式较多。
协⽅差矩阵
⼀般来说,协⽅差矩阵有三种形式,分别称为球形、对⾓和全协⽅差。以⼆元为例:
为了⽅便展⽰不同协⽅差矩阵的效果,我们以⼆维为例。(书上截的图,凑活着看吧,是在不想画图了)
其实从这个图上可以很好的看出,协⽅差矩阵对正态分布的影响,也就很好明⽩了这三个协⽅差矩阵是哪⾥来的名字了。可以看
出,球形协⽅差矩阵,会产⽣圆形(⼆维)或者球形(三维)的等⾼线,对⾓协⽅差矩阵和全协⽅差矩阵,会产⽣椭圆形的等⾼线。更⼀般地,在⼀个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()
效果如下:
python教程字符串函数
这⾥没有设定随机种⼦店,每次随机数会有所不同。
以上这篇使⽤Python实现正态分布、正态分布采样就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。