#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")
вывод:
вывод
Тестовый ввод
Ответ №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')