Python:用于最小二乘最小化的curve_fit

时间:2017-09-22 15:10:10

标签: python scipy least-squares

假设我有一个由f参数化的模型t。我希望t的最佳值使∑ₓ (f(x, t) - y(x))²最小化。这是最小二乘优化的目的。

在以下示例中

from numpy import *
from scipy.optimize import curve_fit

x = arange(100)

t_true = 30
y = 1. / (1 + exp(-(x - t_true) / 5.))

f = lambda x, t: [0. if xi < t else 1. for xi in x]
t_opt, t_cor = curve_fit(f, x, y, p0=(20.))

plot(x, y)
plot(x, f(x, t_opt))

print(t_cor)

为什么我会t_opt=20而不是接近t_opt=30

另外,为什么t_cor=inf?我得到的结果是:

enter image description here

其中蓝色是数据,绿色是拟合模型,但我希望看起来像这样:

enter image description here

我确实希望如此,因为来自第二张图像的残差平方和肯定小于第一幅图像的残差平方和显然没有局部最小值,优化可能会卡住。那么为什么没有这个呢?

1 个答案:

答案 0 :(得分:0)

使用以下错误功能的curve_fit周围的{p> least_sq is a wrapper

 def error(params, x, y):
    return np.sum((func(x, params) - y)**2)

在您的问题curve_fit中无效,因为您尝试拟合的等式与您用于生成y的等式非常不同。

在这种情况下适合的推荐函数是(t未知):

def f(x, t):
    return 1. / (1 + exp(-(x - t) / 5.))

使用此推荐的拟合函数,curve_fit将起作用,或者您可以直接使用scipy.optimize.leastsq

import numpy as np
from numpy import exp
from scipy.optimize import leastsq, curve_fit

x = np.arange(100)

t_true = 30

def f(x, t):
    return 1. / (1 + exp(-(x - t) / 5.))

y = f(x, t_true)

def error(t, x, y):
    return np.sum((f(x, t) - y)**2)

t_opt, t_cor = leastsq(error, args=(x, y), x0=1.)
print('least_sq', t_opt, t_cor)

t_opt2, t_cor2 = curve_fit(f, x, y, p0=(0,))
print('curve_fit', t_opt2, t_cor2)

哪个会给你:

least_sq [ 30.00000007] 2
curve_fit [ 30.] [[ 0.]]