Lmfit Nan值

时间:2018-10-03 14:45:57

标签: python

我正在尝试分配一个发行版。我使用的模型是:

def quasiParabolic(x, n, sigma):
    fact1 = (1/(2*np.pi*sigma))
    fact2 =((n+1)/n)
    fact = fact1*fact2
    pot1 = 1-(1/n)
    pot2 = ((x**2)/(2*(sigma**2)))
    pot = (pot1*pot2)**n
    return fact*pot

使用的代码是:

#DATA NORMALIZATION
areaData = simps(integr, colPosmm)
y_ = integr/areaData
area2 = simps(y_, colPosmm)
print 'Integral normalized data B2',area2
print ''

#LMFIT
gmodel = Model(quasiParabolic)
params = Parameters()
params.add('n', value=2, min=0)
params.add('sigma', value=1, min=0)

# FIT
result3Q = gmodel.fit(y_, x=colPosmm, params=params)

#SAVE PARAMETERS
for param in result3L.params.values():
    if param.name == 'n':
         nval = param.value
    if param.name == 'sigma':
         sigmaval = param.value

#PARAMETERS REPORT
print '\033[4mQUASIPARAMETRIC MODEL B1 \033[0m'
print(result3Q.fit_report())
print ''

#PLOT FIT
plt.figure(1)
plt.plot(colPosmm, result3Q.best_fit, 'c-', label="Lmfit Quasiparabolic" )
plt.legend()

plt.figure(3)
plt.plot(colPosmm, result3Q.best_fit, 'c-', label="Lmfit Quasiparabolic" )
plt.legend()

当我运行脚本时,它会向我返回此错误:

ValueError: The input contains nan values

我尝试检查nan的值,它们在变量pot(在函数的定义中定义)中。

我还打印了y_和colPosmm以确保没有nan值,所以是。

我也尝试用2代替罐式中的指数n(只是做一个测试),在这种情况下脚本可以工作。

有人可以帮助我吗?谢谢!

1 个答案:

答案 0 :(得分:1)

当在残差数组(模型或要适合该模型的数据)中遇到NaN值时,{p}(1)的 Lmfit和其他拟合方法(IMHO)不能很好地恢复。这确实非常明智:如果存在NaN,则从该值得出的任何值都将为NaN,因此拟合将认为卡方为NaN,并且不知道残差的平方和是否得到了改善

对于您的数据,我想您正在遇到一种情况

scipy

其中pot = (pot1*pot2)**n 为负(对于某些值)。

由于您允许拟合pot1*pot2,因此它将是双精度实数,而不仅仅是整数。当然,

n

x ** n 和非整数NaN的{​​{1}}。

因此,我认为您要么要防止x < 0为负值,要么将n固定为某个整数值。