【问题标题】:Scipy MLE fit of a normal distribution正态分布的 Scipy MLE 拟合
【发布时间】:2018-08-21 18:04:45
【问题描述】:

我试图采用this thread 中提出的解决方案来确定简单正态分布的参数。即使修改很小(基于维基百科),结果也很差。有什么建议哪里出错了吗?

import math
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt

def gaussian(x, mu, sig):
    return 1./(math.sqrt(2.*math.pi)*sig)*np.exp(-np.power((x - mu)/sig, 2.)/2)

def lik(parameters):

    mu    = parameters[0]
    sigma = parameters[1]    
    n     = len(x)  
    L     = n/2.0 * np.log(2 * np.pi) + n/2.0 * math.log(sigma **2 ) + 1/(2*sigma**2) * sum([(x_ - mu)**2 for x_ in x ])

    return L



mu0    = 10
sigma0 = 2

x = np.arange(1,20, 0.1)
y = gaussian(x, mu0, sigma0)


lik_model = minimize(lik, np.array([5,5]), method='L-BFGS-B')


mu    = lik_model['x'][0]
sigma = lik_model['x'][1]

print lik_model

plt.plot(x, gaussian(x, mu, sigma), label = 'fit')
plt.plot(x, y, label = 'data')
plt.legend()

拟合输出:

jac: 数组([2.27373675e-05, 2.27373675e-05])

消息:'CONVERGENCE:REL_REDUCTION_OF_F_

成功:是的

x: 数组([10.45000245, 5.48475283])

【问题讨论】:

  • 我会说你的初始 sigma 离最优值太远,然后优化器找不到它。你应该给它一个较小的值,试试1 或更低。这是拟合参数时非常常见的错误。

标签: python scipy curve-fitting gaussian


【解决方案1】:

最大似然法用于将分布的参数拟合到一组据称是来自该分布的随机样本的值。在您的lik 函数中,您使用x 来保存样本,但x 是您设置为x = np.arange(1,20, 0.1) 的全局变量。这绝对不是正态分布的随机样本。

因为您使用的是正态分布,您可以使用已知的最大似然估计公式来检查您的计算:mu 是样本均值,sigma 是样本标准差:

In [17]: x.mean()
Out[17]: 10.450000000000006

In [18]: x.std()
Out[18]: 5.484751589634671

这些值与您对minimize 的调用结果非常匹配,因此您的代码看起来正在运行。

要修改您的代码以按照您期望的方式使用 MLE,x 应该是一个据称是来自正态分布的随机样本的值的集合。请注意,您的数组 y 不是这样的示例。它是网格上概率密度函数 (PDF) 的值。如果将分布拟合到 PDF 样本是您的实际目标,则可以使用曲线拟合函数,例如 scipy.optimize.curve_fit。 如果将正态分布参数拟合到随机样本实际上是您想要做的,那么为了测试您的代码,您应该使用来自具有已知参数的分布的相当大样本的输入。在这种情况下,您可以这样做

x = np.random.normal(loc=mu0, scale=sigma0, size=20)

当我在您的代码中使用这样的x 时,我得到了

In [20]: lik_model.x
Out[20]: array([ 9.5760996 ,  2.01946582])

正如预期的那样,解中的值大约是 10 和 2。

(如果您像我一样使用x 作为您的样本,则必须更改您的 相应地绘制代码。)

【讨论】:

  • 我可以写 x(数据)作为计算可能性的函数的参数吗?
猜你喜欢
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 2021-10-23
  • 2022-01-14
  • 2013-07-03
  • 2021-05-13
  • 1970-01-01
  • 2011-02-23
相关资源
最近更新 更多