6

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

明らかに、これは、次元が増加したり、閉じた形式の解がないより複雑な分布の場合、すぐに手に負えなくなります。ここで何をするのが最善ですか?ありがとうございました。

4

0 に答える 0