首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用iminuit时,python程序的不同输出与相同输入:未定义的行为?

使用iminuit时,python程序的不同输出与相同输入:未定义的行为?
EN

Stack Overflow用户
提问于 2020-08-18 03:38:16
回答 1查看 26关注 0票数 0

我遇到了这种广泛的bug,即iminuit不能收敛于一个朴素的线性模型。然而,真正的问题是,如果我取消注释行"#bins = np.linspace(0,4,25)",程序的结果是不同的,并且它可以收敛。

如果"same input“没有产生"same output",则意味着存在未定义的行为,或分段错误。有什么想法吗?

代码语言:javascript
复制
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

测试输入

test.feather.zip

EN

回答 1

Stack Overflow用户

发布于 2020-08-20 23:07:15

bug已经解决了。虽然使用print看起来是一样的,但类型是不同的:

代码语言:javascript
复制
data = pd.read_feather('test.feather').rho2.to_numpy()
N,bins = np.histogram(data,bins=24,range=(0,4))

vs

代码语言:javascript
复制
bins = np.linspace(0,4,25)

第一个返回float32,第二个返回float64iminuit需要用数值方法计算梯度,因此cost函数的输出精度要求至少为float64

最佳解决方案是

代码语言:javascript
复制
data = pd.read_feather('test.feather').rho2.to_numpy().astype('float64')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63457531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档