我正在尝试使用lmfit,但是参数得到了零星的结果:
import numpy as np
import scipy.stats as sp
from scipy.optimize import curve_fit
from lmfit import minimize, Parameters, Parameter, report_fit
x = [0.01,
0.02,
0.03,
0.04,
0.05,
0.06,
0.07,
0.08,
0.09,
0.1,
0.2,
0.3,
0.4,
0.5,
0.6,
0.7,
0.8,
0.9,
0.99999999,]
#some paramters to try to estimate
sigma1 = 6
scale1 = np.exp(5)
#generate values to use to fit
y = sp.lognorm(sigma1,scale=scale1).ppf(x)
#function set-up to use in lmfit
def invlognorm(params,x,data):
sigma = params['sigma']
mu = params['mu']
model = sp.lognorm(sigma,scale=mu).ppf(x)
return model - data
params = Parameters()
params.add('sigma', value= 1,)
params.add('mu', value= 1, )
# do fit, here with leastsq model
result = minimize(invlognorm,params, method = 'least-squares',args=(x, y))最后检查结果
result.params.pretty_print()
Name Value Min Max Stderr Vary Expr Brute_Step
mu 2.161 -inf inf None True None None
sigma 6.754 -inf inf None True None None但这些都与原始值相差甚远。
在这里发生了什么,以及我如何解决这个问题,给出合理的结果,有帮助吗?
发布于 2018-01-02 15:14:51
您几乎肯定需要更好的sigma和mu参数的起始值。
lognorm().ppf()函数在x=1上发散,给出了巨大的值,这将完全支配任何不合适的度量,如奇方。此外,参数值的微小变化对整体拟合没有实质影响,所有拟合算法都会很快放弃。x=1的巨大价值也会使任何合适的数据对其他数据不敏感。也许您实际上是指一些其他的lognorm方法,例如pdf或cdf?
如果没有,您可能需要“在日志空间”-将数据的日志与模型的日志相匹配。这将降低x=1基准的重要性。
另外,虽然这不是问题的原因,但您的fit实际上并没有像您的评论所指出的那样使用leastsq方法。要使用leastsq (Levenberg-Marquardt方法),请使用:
# do fit, here with leastsq model
result = minimize(invlognorm, params, args=(x, y))使用scipy.optimize.least_squares (实际上使用信任区域反射使用)
# do fit, here with least_squares model
result = minimize(invlognorm,params, method='least_squares', args=(x, y))(注意拼写。您的示例使用了无法识别的least-squares,因此会使用Nelder方法)。
https://stackoverflow.com/questions/48052426
复制相似问题