正态分布的对数似然

Loglikelihood of normal distribution

我正在尝试使用最小化函数形式 scipy 从正态分布中找到 mu 和 sigma 的最大似然估计。然而,最小化 returns 均值的预期值,但 sigma 的估计值与实际 sigma 相去甚远。

我定义函数 llnorm returns 正态分布的负对数似然,然后从均值 150 和标准差 10 的正态分布中创建随机样本,然后使用优化我试图找到 MLE。

import numpy as np
import math
import scipy.optimize as optimize

def llnorm(par, data):
    n = len(data)
    mu, sigma = par
    ll = -np.sum(-n/2 * math.log(2*math.pi*(sigma**2)) - ((data-mu)**2)/(2 * (sigma**2)))
    return ll

data = 10 * np.random.randn(100) + 150

result = optimize.minimize(llnorm, [150,10], args = (data))

即使数据的均值接近 150 且标准差接近 10,优化 returns 估计的 sigma 值要小得多(接近 0)。

np.random.randn 创建具有 方差 1 (docs here) 的随机高斯分布。由于您的目标是 std 为 10 的分布,因此您需要乘以 10 * 10 而不是

import numpy as np
import math
import scipy.optimize as optimize

def llnorm(par, data):
    n = len(data)
    mu, sigma = par
    ll = -np.sum(-n/2 * math.log(2*math.pi*(sigma**2)) - ((data-mu)**2)/(2 * (sigma**2)))
    return ll

data = 10 * 10 * np.random.randn(100) + 150 

result = optimize.minimize(llnorm, [150,10], args = (data))
print(result)

这给了我:

      fun: 36328.17002555693
 hess_inv: array([[ 0.96235834, -0.32116447],
       [-0.32116447,  0.10879383]])
      jac: array([0., 0.])
  message: 'Optimization terminated successfully.'
     nfev: 44
      nit: 8
     njev: 11
   status: 0
  success: True
        x: array([166.27014352,   9.15113937])

编辑:~9 的输出似乎纯属巧合。还有一些事情需要调查

你的数学有点差:

ll = n*math.log(2*math.pi*(sigma**2))/2 + np.sum(((data-mu)**2)/(2 * (sigma**2)))

ll = np.sum(math.log(2*math.pi*(sigma**2))/2 + ((data-mu)**2)/(2 * (sigma**2)))

首先,我取消了 -(这不是问题),但最重要的是,您要么在总和中保留常数项并且不将其乘以 n,要么取将它乘以 n,...但不能同时乘以两者。