我正在尝试使用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))
似乎优化算法不适用于任意数组/矩阵。我必须将平均数组和协方差矩阵打包成一个平面阵列,以便最小化。
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))
显然,当尺寸增加时,这将很快失控,或者在没有封闭形式解决方案的情况下,这将会更加复杂。这里最好做什么?谢谢。