我在试着配合分配。我使用的模型是:
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代替pot公式中的指数n (只是为了做测试),在这个例子中,脚本可以工作。
有人能帮我吗?谢谢!
发布于 2018-10-04 02:25:26
当scipy遇到残差数组中的NaN值(模型或数据适合该模型)时,Lmfit和其他来自该模型的拟合方法不能很好地恢复。这是相当明智的,真的:如果有一个NaN,从这个值导出的任何值都将是NaN,所以拟合者会认为卡方是NaN,并且不知道残差的平方和是否有改进。
对于您的数据,我猜您正遇到一种情况
pot = (pot1*pot2)**n其中pot1*pot2为负值(对于某些值)。
由于您允许安装n,它将是一个双精度的真实,而不仅仅是一个整数。当然,当然,
x ** nNaN表示x < 0和非整数n.
因此,我认为您要么希望防止pot1*pot2为负值,要么将n修正为某个整数值。
https://stackoverflow.com/questions/52629725
复制相似问题