Ошибка Lmfit: вход содержит значения nan - PullRequest
0 голосов
/ 25 июня 2018

Это мой код:

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

def gaussian(x, amp, cen, wid):
    """1-d gaussian: gaussian(x, amp, cen, wid)"""
    return (amp / (np.sqrt(2*np.pi*wid)) * np.exp(-(x-cen)**2 / (2*wid**2)))

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)

TailCoreLim1 = 40
TailCoreLim2 = 100 


xCore = xFull[TailCoreLim1:TailCoreLim2]["xFull"]
yCore = yFull[TailCoreLim1:TailCoreLim2]["yFull"]

fileTypeCore = np.dtype([('Par', np.float)])
CoreFile = "CorePopt.dat"
CoreVal = np.loadtxt(CoreFile, dtype=fileTypeCore)
CoreI = CoreVal[0:1]["Par"]
CoreSig = CoreVal[1:2]["Par"]

gmodel = Model(gaussian)
result = gmodel.fit(yCore, x=xCore, amp=1.09054634, cen=0, wid=2.47388884)

plt.plot(xCore, yCore, 'bo')
plt.plot(xCore, result.best_fit, 'r-')

print 'CORE REPORT:'
print 'I1 = ', CoreI
print 'Sigma1 = ', CoreSig
print(result.fit_report())


xTailsx = xFull[0:(TailCoreLim1)]["xFull"]
yTailsx = yFull[0:(TailCoreLim1)]["yFull"]

fileTypeTail = np.dtype([('Par', np.float)])
TailFile = "TailPopt.dat"
TailVal = np.loadtxt(TailFile, dtype=fileTypeTail)
TailI = TailVal[0:1]["Par"]
TailSig = TailVal[1:2]["Par"]

gmodel = Model(gaussian)
result = gmodel.fit(yTailsx, x=xTailsx, amp=1.12567603, cen=0, wid=3.01133102)

plt.plot(xTailsx, yTailsx, 'bo')
plt.plot(xTailsx, result.best_fit, 'r-')

xTaildx = xFull[(TailCoreLim2):140]["xFull"]
yTaildx = yFull[(TailCoreLim2):140]["yFull"]

gmodel = Model(gaussian)
result = gmodel.fit(yTaildx, x=xTaildx, amp=1.12567603, cen=0, wid=3.01133102)

plt.plot(xTaildx, yTaildx, 'bo')
plt.plot(xTaildx, result.best_fit, 'r-')

print 'TAIL REPORT:'
print 'I2 = ', TailI
print 'Sigma2 = ', TailSig
print(result.fit_report())

plt.show()

Когда я запускаю его, он возвращает мне эту ошибку: ValueError: Вход содержит значения nan , со ссылкой на эту строку:

result = gmodel.fit(yCore, x=xCore, amp=1.09054634, cen=0, wid=2.47388884)

Кроме того, если в определении гауссовой функции я изменяю значение, оно возвращается следующим образом:

return (amp / (np.sqrt(2*np.pi) * wid)) * np.exp(-(x-cen)**2 / (2*wid**2))

и я пытаюсь запустить скрипт, он работает безлюбая ошибка.

Может кто-нибудь объяснить мне, где проблема, пожалуйста?Спасибо!

1 Ответ

0 голосов
/ 25 июня 2018

В вашем примере много лишнего и ненужного кода, что усложняет его понимание. Но, по сути, вы делаете (или можете легко уменьшить свой код, чтобы вы делали):

xFull = np.loadtxt("xValue.dat", dtype=np.float)
yFull = np.loadtxt("yValue.dat", dtype=np.float)

xCore = xFull[40:100]
yCore = yFull[40:100]

gmodel = Model(gaussian)
result = gmodel.fit(yCore, x=xCore, amp=1.09054634, cen=0, wid=2.47388884)

Возможно появление NaN из-за очень небольшого (почти нулевого) значения wid, хотя я думаю, что это маловероятно - я не помню, чтобы когда-либо видел это.

Или NaN могут исходить из ваших данных - я видел это много раз, и ваш код выглядит очень сфокусированным на манипулировании вашими данными.

Итак, сначала убедитесь, что ваши данные xCore и yCore не содержат NaN. Пока вы работаете над этим, вы можете построить данные и убедиться, что они подобны гауссову, и что ваши начальные значения для amp, cen и wid не слишком отличаются.

Если все выглядит нормально, и вы все еще получаете ошибку NaN ValueError из соответствия, распечатайте значения в вашей функции gaussian(), чтобы попытаться понять, какие значения параметров вызывают NaN.

...