假设我有一个由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
?我得到的结果是:
其中蓝色是数据,绿色是拟合模型,但我希望看起来像这样:
我确实希望如此,因为来自第二张图像的残差平方和肯定小于第一幅图像的残差平方和显然没有局部最小值,优化可能会卡住。那么为什么没有这个呢?
答案 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.]]