Python畫高斯分佈圖 (2D, 3D)

n元高斯分佈函數

n元高斯分佈函數公式:

f(x)=1(2π)ndetΣexp(12(xμx)TΣ1(xμx))f(x) = \frac{1}{\sqrt{(2 \pi)^n \det \Sigma}} \exp\left( -\frac{1}{2} (x - \mu_x)^T \Sigma^{-1} (x - \mu_x) \right)

其中xxnn元變量

導入相關包

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()

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章