正态分布的对数似然
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
,...但不能同时乘以两者。
我正在尝试使用最小化函数形式 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
,...但不能同时乘以两者。