n元高斯分佈函數
n元高斯分佈函數公式:
其中是元變量
導入相關包
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
生成高斯分佈數據
def Gaussian_Distribution(N=2, M=1000, m=0, sigma=1):
'''
Parameters
----------
N 維度
M 樣本數
m 樣本均值
sigma: 樣本方差
Returns
-------
data shape(M, N), M 個 N 維服從高斯分佈的樣本
Gaussian 高斯分佈概率密度函數
'''
mean = np.zeros(N) + m # 均值矩陣,每個維度的均值都爲 m
cov = np.eye(N) * sigma # 協方差矩陣,每個維度的方差都爲 sigma
# 產生 N 維高斯分佈數據
data = np.random.multivariate_normal(mean, cov, M)
# N 維數據高斯分佈概率密度函數
Gaussian = multivariate_normal(mean=mean, cov=cov)
return data, Gaussian
二元高斯散點圖
'''二元高斯散點圖'''
data, _ = Gaussian_Distribution(N=2, M=10000)
x, y = data.T
plt.scatter(x, y)
plt.show()
一元高斯概率分佈圖 (單變量)
'''一元高斯概率分佈圖'''
_, Gaussian = Gaussian_Distribution(N=1, M=1000, sigma=0.1)
x = np.linspace(-1,1,1000)
# 計算一維高斯概率
y = Gaussian.pdf(x)
plt.plot(x, y)
plt.show()
二元高斯概率分佈圖 (雙變量)
M = 1000
data, Gaussian = Gaussian_Distribution(N=2, M=M, sigma=0.1)
# 生成二維網格平面
X, Y = np.meshgrid(np.linspace(-1,1,M), np.linspace(-1,1,M))
# 二維座標數據
d = np.dstack([X,Y])
# 計算二維聯合高斯概率
Z = Gaussian.pdf(d).reshape(M,M)
'''二元高斯概率分佈圖'''
fig = plt.figure(figsize=(6,4))
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='seismic', alpha=0.8)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
二元高斯概率分佈圖水平面投影
'''二元高斯概率分佈圖水平面投影'''
plt.figure()
plt.xlabel("X")
plt.ylabel("Y")
x, y = data.T
plt.plot(x, y, 'ko', alpha=0.3)
plt.contour(X, Y, Z, alpha =1.0, zorder=10);
plt.show()