【发布时间】: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