scipy curve_fit在简单的线性拟合中失败了吗?

Rob*_*ert 1 python numpy mathematical-optimization curve-fitting scipy

我打算做一个简单的线性拟合具有两个numpy的阵列y1y2长度54各自的。该函数定义如下:

def f(x,b):
    return b*x
Run Code Online (Sandbox Code Playgroud)

数据绘制在这里:

在此处输入图片说明

然后我尝试通过以下方式拟合:

popt, pcov = scop.curve_fit(f,y2,y1)  # yes y1 and y2 are in right order
Run Code Online (Sandbox Code Playgroud)

结果: popt = 1., pcov = inf

我尝试过p0 = -833,结果差不多是多少,但这给了我popt = -833, pcov = inf

我使用示例函数尝试了一些示例数据:

x = np.array(range(10))
y = x**2 + 3
def fu(x,b):
    return x**2 + b
po, pc = scop.curve_fit(fu,x,y)
print po, pc
Run Code Online (Sandbox Code Playgroud)

结果很好:3和2e-33

有人对第一次审判出了什么问题有想法吗?我还没有发现任何有用的东西或与我的问题有关的信息...

ali*_*i_m 5

NaN值将产生毫无意义的结果-您需要在进行任何拟合之前将其从数据中排除。您可以使用布尔索引来执行此操作:

valid = ~(np.isnan(y1) | np.isnan(y2))
popt, pcov = scop.curve_fit(f, y2[valid], y1[valid])
Run Code Online (Sandbox Code Playgroud)

如评论中所述,在scipy版本中,低于0.15.0的版本 curve_fit将自动检查您输入数组中的NaN和Infs,ValueError如果找到则将引发a 。可以选择使用check_finite参数禁用此行为。

根据您的问题和评论,我假设您必须使用旧版本-您可能应该考虑升级。