我试图用极大似然估计拟合多元正态分布的参数。
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))
型
显然,当维数增加时,或者对于一些没有封闭形式解的更复杂的分布,这会很快失控,在这里最好怎么做呢?谢谢。
1条答案
按热度按时间dtcbnfnu1#
假设
optimize.minimize
* 确实 * 允许你不加修改地传入mean
和cov
的猜测值--以你想要的任何形状--它会传入相同形状的mean
和cov
数组到你的负对数似然函数。cov
的一些元素会是冗余的,因为它必须是对称的,你需要增加一些约束来保持cov
的正定性。下面的解决方案需要编写特定于分布的函数,用于在决策变量的一维数组和特定于分布的参数之间进行转换,但它可以扩展到任意维数,并且对于
multivariate_normal
,它解决了冗余决策变量的问题并确保了正定性。字符串