一维和二维高斯分布的可视化

本篇主要用python代码实现一维和二维高斯分布的可视化
首先,一维和多为高斯分布的数学公式如下所示:

p 1 ( x ) = 1 2 π σ 2 e x p { 1 2 ( x μ ) 2 σ 2 }
p 2 ( x ) = 1 ( 2 π ) n | Σ | e x p { 1 2 ( x μ ) T Σ 1 ( x μ ) }

然后根据这两个公式写python代码,效果如下:

一维高斯分布 二维高斯分布
这里写图片描述 这里写图片描述
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

class Distribution():
    def __init__(self,mu,Sigma):
        self.mu = mu
        self.sigma = Sigma

    def tow_d_gaussian(self,x):
        mu = self.mu
        Sigma =self.sigma
        n = mu.shape[0]
        Sigma_det = np.linalg.det(Sigma)
        Sigma_inv = np.linalg.inv(Sigma)
        N = np.sqrt((2*np.pi)**n*Sigma_det)

        fac = np.einsum('...k,kl,...l->...',x-mu,Sigma_inv,x-mu)

        return np.exp(-fac/2)/N

    def one_d_gaussian(self,x):
        mu = self.mu
        sigma = self.sigma

        N = np.sqrt(2*np.pi*np.power(sigma,2))
        fac = np.power(x-mu,2)/np.power(sigma,2)
        return np.exp(-fac/2)/N


if __name__=='__main__':

    p1 = Distribution(0,2)
    x = np.linspace(-10,10,100)
    y = p1.one_d_gaussian(x)
    plt.plot(x,y,'b-',linewidth=3)
    # plt.show()

    N = 60
    X = np.linspace(-3,3,N)
    Y = np.linspace(-4,4,N)
    X,Y = np.meshgrid(X,Y)
    mu = np.array([0.,0.])
    Sigma = np.array([[1.,-0.5],[-0.5,1.5]])
    pos = np.empty(X.shape+(2,))
    pos[:,:,0]= X
    pos[:,:,1] = Y

    p2 = Distribution(mu,Sigma)
    Z = p2.tow_d_gaussian(pos)

    fig =plt.figure()
    ax = fig.gca(projection='3d')
    ax.plot_surface(X,Y,Z,rstride=3,cstride=3,linewidth=1,antialiased =True)
    cset = ax.contour(X,Y,Z,zdir='z',offset=-0.15)

    ax.set_zlim(-0.15,0.2)
    ax.set_zticks(np.linspace(0,0.2,5))
    ax.view_init(27,-21)
    plt.show()

猜你喜欢

转载自blog.csdn.net/u012836279/article/details/80051475
今日推荐