在下面的非常简单的示例中(拟合一条y=ax+b
已知结果为 `a=b=0 的直线),当 x 变量以 float32 类型提供时,SciPy curve_fit 函数会产生错误的结果:
import numpy as np
import scipy.optimize as opt
def func(x, a, b): return a*x + b
x = np.array([0,1])
y = np.array([0,0])
p0 = [0.1, 0.1]
p1 = opt.curve_fit(func, x , y, p0=p0)
p2 = opt.curve_fit(func, np.float64(x), y, p0=p0)
p3 = opt.curve_fit(func, np.float32(x), y, p0=p0)
print '\n p1 = ',p1,'\n p2 = ',p2,'\n p3 = ',p3
产生输出:
p1 = (array([ 0., 0.]), inf)
p2 = (array([ 0., 0.]), inf)
p3 = (array([ 0.1, 0.1]), inf)
为什么最后一个结果(通过 float32-input 获得)与其他两个不同,而且 - 显然 - 错误?显然,curve_fit
甚至没有执行一次迭代,因为拟合结果 p3 等于初始猜测 p0。对我来说,这似乎是一个错误......