高斯分布的性质(代码)

多元高斯分布:

p(\boldsymbol{x} \mid \boldsymbol{\mu}, \boldsymbol{\Sigma})=\frac{1}{(2 \pi)^{D / 2}|\boldsymbol{\Sigma}|^{1 / 2}} \exp \left\{-\frac{1}{2}(\boldsymbol{x}-\boldsymbol{\mu})^{T} \boldsymbol{\Sigma}^{-1}(\boldsymbol{x}-\boldsymbol{\mu})\right\}

一元高斯分布:(将多元高斯分布中的D取值1)

p(x)=\frac{1}{\sigma \sqrt{2 \pi}} \exp (-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^{2})

 其中\mu代表的是平均值,\sigma^2是方差的平方,也可以用\Sigma来表示,\Sigma是一个对称正定矩阵。

 --------------------------------------------------------------------------------------------------------------------------------

一.不同的平均值\mu对二元高斯分布的影响:

平均值不同时,高斯分布的中心不一样。

二. 不同协方差矩阵\Sigma对于高斯分布的影响:

                     [[2,0],[0,2]]                                   [[2,1],[1,2]]                              [[2,-1],[-1,2]]

 1.各向同性的,协方差矩阵的对角线上的值相等,非对角线上的值为0,它的概率密度函数画出来就是一个圆。

2.正相关的,概率密度函数主要分布在第一,三象限。

3.负相关的,概率密度函数主要分布在第二,四象限。

--------------------------------------------------------------------------------------------------------------------------------

代码一:由一个高斯分布得到另一个高斯分布。

import numpy as np
import matplotlib.pyplot as plt
C = np.array([[2.0,1.0],[1.0,2]])
eigv, eigV= np.linalg.eig(C)
print("eigv:",eigv)
print("eigV:",eigV)
A = np.linalg.cholesky(C)
print(A)
print(A @ A.T)

X = np.random.randn(1000,2) # X是符合均值为0,方差为1的标准高斯分布
print("var of X:",np.var(X))
Y = X @ A.T
print(X.shape)
print(Y.shape)

fig, ax = plt.subplots(figsize=(5,5))
ax.scatter(X[:,0], X[:,1], c="c", s=4)
ax.scatter(Y[:,0], Y[:,1], c="m", s=4)
ax.set_xlim(-6, 6)
ax.set_ylim(-6, 6)
plt.savefig('Multi-variate Gaussian')

Cholesky分解C: C= A*A.T ,然后后一步Y = A * X

相当于对X进行线性变换:X\sim N(\mu,\Sigma),

若Y满足Y = AX + B, 则Y\sim N(A \mu, A \Sigma A^T)

因此在上面的代码中Y \sim N(A\mu,C)

---------------------------------------------------------------------------------------------------------------------------------

 代码二:由高斯分布的概率密度公式得到高斯分布图像

import numpy as np
import matplotlib.pyplot as plt
def gauss2D(x,m,C):
  Ci = np.linalg.inv(C)  #协方差的逆
  dC = np.linalg.det(C) #矩阵的行列式
  num = np.exp(-0.5*np.dot((x-m).T, np.dot(Ci, (x-m))))
  den = 2 * np.pi * (dC**0.5)

  return num/den

def twoDGaussianPlot(nx, ny, m, C):
  x = np.linspace(-6, 6, nx)
  y = np.linspace(-6, 6, ny)
  X, Y = np.meshgrid(x, y, indexing='ij')

  Z = np.zeros([nx,ny])
  for i in range(nx):
    for j in range(ny):
      xvec = np.array([X[i,j], Y[i,j]])
      Z[i,j] = gauss2D(xvec, m, C)
  
  return X, Y, Z

nx, ny = 50, 40
m1 = np.array([0,0]) #平均值是[0,2]
C1 = np.array([[2,-1],[-1,2]], np.float32) #C1是协方差矩阵
Xp, Yp, Zp = twoDGaussianPlot(nx, ny, m1, C1)

print(Zp)

fig, ax = plt.subplots(figsize=(5,5))
plt.contour(Xp,Yp,Zp,5)
plt.axis('equal')
plt.grid()
ax.set_xlim(-5,5)
ax.set_ylim(-5,5)
#自己画的3维图
fig, ax2 = plt.subplots(figsize=(5,5))
ax2 = plt.axes(projection='3d')

xx = Xp.reshape(2000,)
yy = Yp.reshape(2000,)
zz = Zp.reshape(2000,)
ax2.scatter3D(xx,yy,zz,c=zz,cmap='Greens')

猜你喜欢

转载自blog.csdn.net/qq_39696563/article/details/122532377