python 程序在使用 iminuit 时具有相同输入的不同输出:未定义的行为?
Different output with equal input for python program when using iminuit: undefined behavior?
我遇到了 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")
输出:
output
测试输入
错误已解决。虽然看起来使用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)
第一个returnsfloat32
,第二个returnsfloat64
。 iminuit
需要用数值方法计算梯度,所以cost
函数的输出精度至少需要float64
.
最佳解决方案是
data = pd.read_feather('test.feather').rho2.to_numpy().astype('float64')
我遇到了 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")
输出: output
测试输入
错误已解决。虽然看起来使用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)
第一个returnsfloat32
,第二个returnsfloat64
。 iminuit
需要用数值方法计算梯度,所以cost
函数的输出精度至少需要float64
.
最佳解决方案是
data = pd.read_feather('test.feather').rho2.to_numpy().astype('float64')