我正在尝试使用MLE拟合多元正态分布的参数。
import numpy as np
from scipy.stats import norm
from scipy.optimize import minimize
from scipy.stats import multivariate_normal as mnorm
def estimation(obs,fun,init,method='Nelder-Mead'):
mle = lambda param: -np.sum(fun(*[obs,param])) ## negate since we will minimize
result = minimize(mle,init,method=method)
return result.x
拟合单变量正态分布是可以的:
obs = np.random.normal(1,4,50000)
ini = [0,1]
print(estimation(obs,lambda ob,p:norm.logpdf(ob,p[0],p[1]),ini))
但在多元方面遇到了一些问题(分配数组给变量时出错):
obs_m = np.random.multivariate_normal([0,0],[[1,0],[0,100]],50000)
ini_m = [[0,0],[[1,0],[0,100]]]
print(estimation(obs_m,lambda ob,p:mnorm.logpdf(ob,p[0],p[1],ini_m))
看起来优化算法不适用于任意数组/矩阵。我必须将均值数组和协方差矩阵解包成一个平坦的数组,然后传递给 minimize 函数。
ini_m = [0,0,1,0,0,100]
print(estimation(obs_m,lambda ob,p:mnorm.logpdf(ob,[p[0],p[1]],[[p[2],p[3]],[p[4],p[5]]]),ini_m))
显然,当维度增加或某些更复杂的分布没有封闭形式解时,这种情况很快就会失控。在这里应该怎么办呢?谢谢。