Разные выходные данные с одинаковыми входными данными для программы python при использовании iminuit: неопределенное поведение?

#python #pandas #iminuit

#python #pandas #iminuit

Вопрос:

Я столкнулся с такими ошибками, что iminuit не может сходиться к наивной линейной модели. Однако реальная проблема в том, что если я раскомментирую строку «#bins = np.linspace(0,4,25)», результат программы будет другим, и он может сходиться.

Если «тот же ввод» не выдает «тот же вывод», это означает, что имеет место неопределенное поведение или ошибка сегментации. Есть идеи?

 import numpy as np
import scipy as sp
import scipy.special
import probfit
import pandas as pd
data = pd.read_feather('test.feather').rho2.to_numpy()
print(data)
N,bins = np.histogram(data,bins=24,range=(0,4))
#bins = np.linspace(0,4,25)
print(bins)
x = (bins[:-1] bins[1:])/2

exposure = 3.8061025098100147
def cost(y0,k):
    global x,exposure,N
    T = (y0 k*x)*exposure
    return -2*np.sum(N*np.log(T)-T-sp.special.loggamma(N 1))

import iminuit
minimizer = iminuit.Minuit(cost,errordef=1,y0=11,k=3,limit_y0=(0,None),limit_k=(0.1,None))
minimizer.migrad()
minimizer.hesse()
minimizer.minos()
display(minimizer.fmin, minimizer.params,minimizer.merrors)
minimizer.draw_mncontour("y0","k")
  

вывод:
вывод

Тестовый ввод

test.feather.zip

Ответ №1:

Ошибка устранена. Хотя при использовании это выглядит print одинаково, типы отличаются:

 data = pd.read_feather('test.feather').rho2.to_numpy()
N,bins = np.histogram(data,bins=24,range=(0,4))
  

против

 bins = np.linspace(0,4,25)
  

Первый возвращает float32 , а второй возвращает float64 . iminuit Необходимо вычислить градиент численными методами, поэтому точность вывода cost функции должна быть как минимум float64 .

Лучшее решение — это

 data = pd.read_feather('test.feather').rho2.to_numpy().astype('float64')