如何使用Lmfit和Python解决NaN值错误

如何使用Lmfit和Python解决NaN值错误,python,lmfit,Python,Lmfit,我试图用Lmfit库拟合一组由外部模拟获取并存储在向量中的数据 下面是我的代码: import numpy as np import matplotlib.pyplot as plt from lmfit import Model from lmfit import Parameters def DGauss3Par(x,I1,sigma1,sigma2): I2 = 2.63 - I1 return (I1/np.sqrt(2*np.pi*sigma1))*np.exp(-(

我试图用Lmfit库拟合一组由外部模拟获取并存储在向量中的数据

下面是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from lmfit import Model
from lmfit import Parameters

def DGauss3Par(x,I1,sigma1,sigma2):
    I2 = 2.63 - I1
    return (I1/np.sqrt(2*np.pi*sigma1))*np.exp(-(x*x)/(2*sigma1*sigma1)) + (I2/np.sqrt(2*np.pi*sigma2))*np.exp(-(x*x)/(2*sigma2*sigma2))

#TAKE DATA
xFull = []
yFull = []

fileTypex = np.dtype([('xFull', np.float)])
fileTypey = np.dtype([('yFull', np.float)])
fDatax = "xValue.dat"
fDatay = "yValue.dat"
xFull = np.loadtxt(fDatax, dtype=fileTypex)
yFull = np.loadtxt(fDatay, dtype=fileTypey)

xGauss = xFull[:]["xFull"]
yGauss = yFull[:]["yFull"]

#MODEL'S DEFINITION
gmodel = Model(DGauss3Par)
params = Parameters()
params.add('I1', value=1.66)
params.add('sigma1', value=1.04)
params.add('sigma2', value=1.2)
result3 = gmodel.fit(yGauss, x=xGauss, params=params)

#PLOTS
plt.plot(xGauss, result3.best_fit, 'y-')
plt.show()
当我运行它时,会出现以下错误:

File "Overlap.py", line 133, in <module>
    result3 = gmodel.fit(yGauss, x=xGauss, params=params)
ValueError: The input contains nan values
这些是向量yGauss中的那些(与y轴相关):

我还尝试打印函数返回的值,以查看是否确实存在一些NaN值:

params = Parameters()
params.add('I1', value=1.66)
params.add('sigma1', value=1.04)
params.add('sigma2', value=1.2)
func = DGauss3Par(xGauss,I1,sigma1,sigma2)
print func
但我得到的是:

[0.04835225 0.06938855 0.07735839 0.08040181 0.08366964 0.08718237
 0.09096169 0.09503048 0.0994128  0.10413374 0.10921938 0.11469669
 0.12059333 0.12693754 0.13375795 0.14108333 0.14894236 0.15736337
 0.16637406 0.17600115 0.18627003 0.19720444 0.20882607 0.22115413
 0.23420498 0.24799173 0.26252377 0.27780639 0.29384037 0.3106216
 0.32814069 0.34638266 0.3653266  0.38494543 0.40520569 0.42606735
 0.44748374 0.46940149 0.49176057 0.51449442 0.5375301  0.56078857
 0.58418507 0.60762948 0.63102687 0.65427809 0.6772804  0.69992818
 0.72211377 0.74372824 0.76466232 0.78480729 0.80405595 0.82230355
 0.83944875 0.85539458 0.87004937 0.88332762 0.89515085 0.90544838
 0.91415806 0.92122688 0.92661155 0.93027889 0.93220625 0.93220625
 0.93027889 0.92661155 0.92122688 0.91415806 0.90544838 0.89515085
 0.88332762 0.87004937 0.85539458 0.83944875 0.82230355 0.80405595
 0.78480729 0.76466232 0.74372824 0.72211377 0.69992818 0.6772804
 0.65427809 0.63102687 0.60762948 0.58418507 0.56078857 0.5375301
 0.51449442 0.49176057 0.46940149 0.44748374 0.42606735 0.40520569
 0.38494543 0.3653266  0.34638266 0.32814069 0.3106216  0.29384037
 0.27780639 0.26252377 0.24799173 0.23420498 0.22115413 0.20882607
 0.19720444 0.18627003 0.17600115 0.16637406 0.15736337 0.14894236
 0.14108333 0.13375795 0.12693754 0.12059333 0.11469669 0.10921938
 0.10413374 0.0994128  0.09503048 0.09096169 0.08718237 0.08366964
 0.08040181 0.07735839 0.06938855 0.04835225]
所以似乎不存在NaN值,我不明白它返回错误的原因。
有人能帮我吗?谢谢

如果在fit函数中添加打印函数,打印出
sigma1
sigma2
,您会发现

  • DGauss3Par
    在错误发生之前已经计算了几次
  • 两个西格玛变量在错误发生时都有负值
当然,取负值的平方根会导致a
NaN

您应该添加
min
绑定或类似于
sigma1
sigma2
参数,以防止出现这种情况。使用
min=0.0
作为
params.add(…)
的附加参数将获得良好的拟合效果


请注意,对于某些分析,为拟合参数设置显式边界可能会使这些分析无效。在大多数情况下,您可以,但在某些情况下,您需要检查拟合参数是否允许从负无穷大到正无穷大变化,或者是否允许有界。

如果向拟合函数添加打印函数,打印出
sigma1
sigma2
,您会发现

  • DGauss3Par
    在错误发生之前已经计算了几次
  • 两个西格玛变量在错误发生时都有负值
当然,取负值的平方根会导致a
NaN

您应该添加
min
绑定或类似于
sigma1
sigma2
参数,以防止出现这种情况。使用
min=0.0
作为
params.add(…)
的附加参数将获得良好的拟合效果


请注意,对于某些分析,为拟合参数设置显式边界可能会使这些分析无效。在大多数情况下,您都可以,但在某些情况下,您需要检查拟合参数是否允许从负无穷大到正无穷大变化,或者是否允许有界。

我已经尝试为参数设置一些界,并且它是有效的!这解决了我的问题,非常感谢!我已经尝试给我的参数设置一些界限了,而且它是有效的!这解决了我的问题,非常感谢!
params = Parameters()
params.add('I1', value=1.66)
params.add('sigma1', value=1.04)
params.add('sigma2', value=1.2)
func = DGauss3Par(xGauss,I1,sigma1,sigma2)
print func
[0.04835225 0.06938855 0.07735839 0.08040181 0.08366964 0.08718237
 0.09096169 0.09503048 0.0994128  0.10413374 0.10921938 0.11469669
 0.12059333 0.12693754 0.13375795 0.14108333 0.14894236 0.15736337
 0.16637406 0.17600115 0.18627003 0.19720444 0.20882607 0.22115413
 0.23420498 0.24799173 0.26252377 0.27780639 0.29384037 0.3106216
 0.32814069 0.34638266 0.3653266  0.38494543 0.40520569 0.42606735
 0.44748374 0.46940149 0.49176057 0.51449442 0.5375301  0.56078857
 0.58418507 0.60762948 0.63102687 0.65427809 0.6772804  0.69992818
 0.72211377 0.74372824 0.76466232 0.78480729 0.80405595 0.82230355
 0.83944875 0.85539458 0.87004937 0.88332762 0.89515085 0.90544838
 0.91415806 0.92122688 0.92661155 0.93027889 0.93220625 0.93220625
 0.93027889 0.92661155 0.92122688 0.91415806 0.90544838 0.89515085
 0.88332762 0.87004937 0.85539458 0.83944875 0.82230355 0.80405595
 0.78480729 0.76466232 0.74372824 0.72211377 0.69992818 0.6772804
 0.65427809 0.63102687 0.60762948 0.58418507 0.56078857 0.5375301
 0.51449442 0.49176057 0.46940149 0.44748374 0.42606735 0.40520569
 0.38494543 0.3653266  0.34638266 0.32814069 0.3106216  0.29384037
 0.27780639 0.26252377 0.24799173 0.23420498 0.22115413 0.20882607
 0.19720444 0.18627003 0.17600115 0.16637406 0.15736337 0.14894236
 0.14108333 0.13375795 0.12693754 0.12059333 0.11469669 0.10921938
 0.10413374 0.0994128  0.09503048 0.09096169 0.08718237 0.08366964
 0.08040181 0.07735839 0.06938855 0.04835225]