Python 使用列表和数组进行scipy.optimize.curve_拟合的不同结果

Python 使用列表和数组进行scipy.optimize.curve_拟合的不同结果,python,arrays,numpy,scipy,Python,Arrays,Numpy,Scipy,尝试使用scipy.optimize.curve_fit来拟合一组使用3参数指数函数的二维元素,如果将包含数据的列表视为列表或numpy数组,我会得到截然不同的结果。MWE在下面 最终拟合参数值a b c为: 对于使用列表exp3p执行计算的函数,以及: 对于使用numpy数组exp\u 3p\u np的函数 我很确定这与使用数组时的浮点精度有关,但如果我能从对此有更多知识的人那里得到确认并可能获得更多信息,那就太好了 加 这显然是一个scipy 0.12.0问题,这是我在尝试此操作时在系统中安

尝试使用scipy.optimize.curve_fit来拟合一组使用3参数指数函数的二维元素,如果将包含数据的列表视为列表或numpy数组,我会得到截然不同的结果。MWE在下面

最终拟合参数值a b c为:

对于使用列表exp3p执行计算的函数,以及:

对于使用numpy数组exp\u 3p\u np的函数

我很确定这与使用数组时的浮点精度有关,但如果我能从对此有更多知识的人那里得到确认并可能获得更多信息,那就太好了

这显然是一个scipy 0.12.0问题,这是我在尝试此操作时在系统中安装的版本。我升级到0.14.0,再次运行代码,现在两个函数返回完全相同的值

MWE


@但是x不是标量,它总是一个列表。函数exp_3p和'exp_3p_np确实返回数组,但它们被最终返回popt、pcov数组的curve_fit'函数捕获。该函数是标量函数,但x不是,它是列表或“向量”。文档中的示例使用的函数func使用一个数组扩展数据,如exp_3p_np does np.asarrayx。这些名字确实有点让人困惑,我现在就改一下。真奇怪。你能告诉我你在运行哪个版本的python、numpy、scipy和matplotlib吗?当我将其更改为np.asarrayx,dtype=np.float32时,我得到了非常糟糕的答案,即使在曲线拟合调用中添加了初始猜测p0。matplotlib==1.4.2,numpy==1.8.2,scipy==0.14.1,python==3.4.2我获得了与abc numpy结果对应的两个版本的相同结果。我在Debian amd64上安装了Python 2.7.9、Numpy 1.8.2和Scipy 0.14.1。
FINAL abc: [  1.39852692e-10   1.00000000e+00   1.39020816e-01]
FINAL abc numpy: [ 0.00826326  0.18603007 -0.02641734]
import numpy as np
from scipy.optimize import curve_fit

def exp_3p(x, a, b, c):
    return a * np.exp(b * x) + c

def exp_3p_np(x, a, b, c):
    return a * np.exp(b * np.asarray(x)) + c


x = [11.250861, 11.750861, 12.250861, 12.750861, 13.250861, 13.750861,
    14.250861, 14.750861, 15.250861, 15.750861, 16.250861, 16.750861,
    17.250861, 17.750861, 18.250861, 18.750861, 19.250861, 19.750861, 20.250861,
    20.750861, 21.250861, 21.750861]
y = [0.045588760000000006, 0.046796000000000004, 0.0556935, 0.0634055,
    0.083095124999999992, 0.092670656249999997, 0.098264620000000011,
    0.086176929999999999, 0.1062696625, 0.124142703125, 0.13172655,
    0.13762596999999999, 0.17699458749999999, 0.200194234375,
    0.19936675000000001, 0.24553768749999999, 0.28308924000000002, 0.3130945,
    0.35024002999999998, 0.39341382000000003, 0.40971550000000001,
    0.40854391000000001]

popt, pcov = curve_fit(exp_3p, x, y)
print '\nFINAL abc:', popt

popt, pcov = curve_fit(exp_3p_np, x, y)
print '\nFINAL abc numpy:', popt