机器学习-概率分布-高斯分布
接下来介绍最常用的高斯分布,对于一元变量
x
,其高斯分布形式为:
其中, μ 表示均值, σ2 表示方差。
对于
D
维变量
N(x|u,Σ)=1(2π)D/2|Σ|1/2exp{−12(x−u)TΣ−1(x−u)}
高斯分布的参数估计同样也是采用最大似然估计的方法。设有
N
个样本服从该高斯分布
lnp(D|u,Σ)=−ND2ln2π−N2ln|Σ|−12∑n=1N(xn−u)TΣ−1(xn−u)
该对数函数对
u
求导数并令其为0,可得:
0u==Σ−1∑n=1N(xn−u)1N∑n=1Nxn
求 Σ 的过程涉及到矩阵微分生成 1。这里实际上是对 Σ−1 求导
∂∂Σ−1ln|Σ|=−∂∂Σ−1ln|Σ−1|=−ΣT=−Σ(xn−u)TΣ−1(xn−u)=Tr((xn−u)(xn−u)TΣ−1)∂∂Σ−1Tr((xn−u)(xn−u)TΣ−1)=(xn−u)(xn−u)T
因此,
∂∂Σ−1lnp(D|u,Σ)=N2Σ−∑n=1N(xn−u)(xn−u)T=0Σ=1N∑n=1N(xn−u)(xn−u)T
因此,高斯分布的最大似然估计为:
uΣ==1N∑n=1Nxn1N∑n=1N(xn−u)(xn−u)T
用python来实现上述的参数估计过程,用scipy包中的multivariate_normal分布来生成样本,再根据这些样本估计高斯分布的参数。理论推导有点繁琐,但代码实现还是非常简单。我个人的建议,我们不仅仅要知道How,更要知道Why。理论的推导实际就是在追溯Why的过程。
代码
估计高斯分布的参数:
from scipy.stats import multivariate_normal
import numpy as np
x=multivariate_normal.rvs(mean=[0.3,0.5],cov=[[1,0.5],[0.5,1]],size=10000);#从均值为[0.3,0.5],方差为[[1,0.5],[0.5,1]]的二元高斯分布中生成10000个样本
N,d=x.shape
mu = np.mean(x,axis=0)#求均值
x1=x-np.tile(mu,(N,1))
Sigma = np.matmul(x1.transpose(),x1)/N;
print(mu)
print(Sigma)