如何实现最大似然估计类型 2?

How do I implement maximum likelihood estimation type 2?

我正在尝试实现一种经验贝叶斯 ML-II(最大似然估计类型 II)方法,用于根据历史数据估计先验分布参数

其中:

  1. π(θ) 是先验分布的表达式
  2. p(x|θ) 是数据分布的表达式
  3. m(x) 是边际分布的表达式

按照步骤,我需要先积分求出边缘分布的表达式,然后求这个表达式的极值来估计先验分布的参数。 可以使用 scipy.optimize 等方法获得极值。所以问题是我们如何整合它?

下面是使用 symfit 的尝试。例如,我选择从没有协方差的双变量正态分布中抽样。

import numpy as np
import matplotlib.pyplot as plt
from symfit import Model, Fit, Parameter, Variable, integrate, oo
from symfit.distributions import Gaussian
from symfit.core.objectives import LogLikelihood

# Make variables and parameters
x = Variable('x')
y = Variable('y')
m = Variable('m')
x0 = Parameter('x0', value=0.6, min=0.5, max=0.7)
sig_x = Parameter('sig_x', value=0.1)
y0 = Parameter('y0', value=0.7, min=0.6, max=0.9)
sig_y = Parameter('sig_y', value=0.05)

pdf = Gaussian(x=x, mu=x0, sig=sig_x) * Gaussian(x=y, mu=y0, sig=sig_y)
marginal = integrate(pdf, (y, -oo, oo), conds='none')
print(pdf)
print(marginal)

model = Model({m: marginal})

# Draw 10000 samples from a bivariate distribution
mean = [0.59, 0.8]
cov = [[0.11**2, 0], [0, 0.23**2]]
xdata, ydata = np.random.multivariate_normal(mean, cov, 10000).T

# We provide only xdata to the model
fit = Fit(model, xdata, objective=LogLikelihood)
fit_result = fit.execute()
print(fit_result)

xaxis = np.linspace(0, 1.0)
plt.hist(xdata, bins=100, density=True)
plt.plot(xaxis, model(x=xaxis, **fit_result.params).m)
plt.show()

这会为 pdf 和边际分布打印以下内容:

>>> exp(-(-x0 + x)**2/(2*sig_x**2))*exp(-(-y0 + y)**2/(2*sig_y**2))/(2*pi*Abs(sig_x)*Abs(sig_y))
>>> sqrt(2)*sig_y*exp(-(-x0 + x)**2/(2*sig_x**2))/(2*sqrt(pi)*Abs(sig_x)*Abs(sig_y))

对于拟合结果:

Parameter Value        Standard Deviation
sig_x     1.089585e-01 7.704533e-04
sig_y     5.000000e-02 nan
x0        5.905688e-01 -0.000000e+00
Fitting status message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'
Number of iterations:   9
Regression Coefficient: nan

可以看到x0sig_x已经正常获取,但是y相关的参数却获取不到任何信息。我认为在这个例子中这是有道理的,因为没有相关性,但我会让你为那些细节而苦恼 ;)。