首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lmfit nan值

Lmfit nan值
EN

Stack Overflow用户
提问于 2018-10-03 14:45:57
回答 1查看 380关注 0票数 0

我在试着配合分配。我使用的模型是:

代码语言:javascript
复制
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

所用的代码是:

代码语言:javascript
复制
#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()

当我运行脚本时,它会返回以下错误:

代码语言:javascript
复制
ValueError: The input contains nan values

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

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

我还尝试用2代替pot公式中的指数n (只是为了做测试),在这个例子中,脚本可以工作。

有人能帮我吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-04 02:25:26

scipy遇到残差数组中的NaN值(模型或数据适合该模型)时,Lmfit和其他来自该模型的拟合方法不能很好地恢复。这是相当明智的,真的:如果有一个NaN,从这个值导出的任何值都将是NaN,所以拟合者会认为卡方是NaN,并且不知道残差的平方和是否有改进。

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

代码语言:javascript
复制
pot = (pot1*pot2)**n

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

由于您允许安装n,它将是一个双精度的真实,而不仅仅是一个整数。当然,当然,

代码语言:javascript
复制
 x ** n

NaN表示x < 0和非整数n.

因此,我认为您要么希望防止pot1*pot2为负值,要么将n修正为某个整数值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52629725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档