Scipy 优化 curve_fit 奇怪的行为
Scipy optimize curve_fit weird behavior
我想用指数曲线拟合数据点,但出于某种原因,我从 scipy 的函数 curve_fit 得到了奇怪的结果。这是我的代码:
from scipy.optimize import curve_fit
def f(x,lambda_):
return 100*((1 - np.exp(-lambda_*np.array(x))))
x=[18.75, 30.75]
y=[48.69, 49.11]
lambda_ = curve_fit(f, x, y)[0]
plt.scatter(x, y, color='black')
xx=np.linspace(0, 40)
yy = f(xx, lambda_)
plt.plot(xx,yy)
导致此情节:
虽然显然不是 lambda 使二次误差最小化。有人知道为什么吗?
感谢帮助
与curve_fit
中的起点p0
有关,默认设置为1。
设置p0=[-0.6]
你可以找到更好的解决方案
找到良好起点的一种简单方法是通过数字扫描,例如:
n_trials = 100
err_best = np.inf
lambda_best_ = None
p0_best = None
for _ in range(n_trials):
p0 = np.random.default_rng().uniform(-10, 10)
try:
lambda_ = curve_fit(f, x, y, p0=[p0])[0]
err = ((f(x, lambda_) - y)**2).sum()
#print(err, lambda_)
if err < err_best:
err_best = err
lambda_best_ = lambda_
p0_best = p0
except Exception:
pass
我想用指数曲线拟合数据点,但出于某种原因,我从 scipy 的函数 curve_fit 得到了奇怪的结果。这是我的代码:
from scipy.optimize import curve_fit
def f(x,lambda_):
return 100*((1 - np.exp(-lambda_*np.array(x))))
x=[18.75, 30.75]
y=[48.69, 49.11]
lambda_ = curve_fit(f, x, y)[0]
plt.scatter(x, y, color='black')
xx=np.linspace(0, 40)
yy = f(xx, lambda_)
plt.plot(xx,yy)
导致此情节:
虽然显然不是 lambda 使二次误差最小化。有人知道为什么吗?
感谢帮助
与curve_fit
中的起点p0
有关,默认设置为1。
设置p0=[-0.6]
你可以找到更好的解决方案
找到良好起点的一种简单方法是通过数字扫描,例如:
n_trials = 100
err_best = np.inf
lambda_best_ = None
p0_best = None
for _ in range(n_trials):
p0 = np.random.default_rng().uniform(-10, 10)
try:
lambda_ = curve_fit(f, x, y, p0=[p0])[0]
err = ((f(x, lambda_) - y)**2).sum()
#print(err, lambda_)
if err < err_best:
err_best = err
lambda_best_ = lambda_
p0_best = p0
except Exception:
pass