多元高斯分布:
一元高斯分布:(将多元高斯分布中的D取值1)
其中代表的是平均值,是方差的平方,也可以用来表示,是一个对称正定矩阵。
--------------------------------------------------------------------------------------------------------------------------------
一.不同的平均值对二元高斯分布的影响:
平均值不同时,高斯分布的中心不一样。
二. 不同协方差矩阵对于高斯分布的影响:
[[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进行线性变换:,
若Y满足, 则
因此在上面的代码中
---------------------------------------------------------------------------------------------------------------------------------
代码二:由高斯分布的概率密度公式得到高斯分布图像
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')