边界的微小变化会更改scipy.optimize.curve_fit的曲线拟合

vu8f3i0k  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(63)

我需要拟合一条曲线到数据,并且首先在我自己创建的图上测试scipy.optimize.curve_fit。令人担忧的是,仅仅稍微改变边界就会影响曲线参数的估计值,这并不能让人很有信心在真实的数据上正确估计。为什么会发生这种情况,我可以使用curve_fit的替代方法吗?
我正在测试的功能(最终需要适合数据)是y = a*(x/b)**9。我在下面的代码中为a = 0.03b = 0.007绘制了它,然后我用curve_适合估计a和B。如果我设定0 < a < 0.1的界限,它会高估a0.0429。如果我设定0 < a < 0.04的界限,它会低估a0.0222。我的实际数据有很多次幂(d),所以我不仅要估计d = 9,还要估计d的范围。如果它们都被低估或高估,这将在最后产生很大的影响。有没有办法可以解决这个问题?

import numpy as np
import matplotlib.pyplot as plt 
from scipy.optimize import curve_fit

d = 9

def func(x,a,b):
    return a*(x/b)**d

x = np.logspace(-3.2,-2,20)

a = 0.03
b = 0.007
print(f"a = {a}, b = {b}")

y = func(x,a,b) 
plt.loglog(x,y)
plt.savefig("test.png")
plt.show()

popt, pcov = curve_fit(func,x,y, bounds = ([0,0.005],[0.04,0.009]))
print(f'a ≈ {popt[0]}, b ≈ {popt[1]}')

字符串


的数据

2w3rbyxf

2w3rbyxf1#

这个方程有无穷多个解,因为参数a和b的作用是一样的.
您可以通过取等式两边的对数并简化来看出这一点:

log(y) = d*log(x) - d*log(b) + log(a)

字符串
例如,如果你有一个解a,B,那么你可以用a除以1000,再用b除以1000的9次方根,这就是一个等价解。

a2 = a / 1000
b2 = b / (1000 ** (1/d))
y = func(x,a,b)
plt.plot(x, y)
y = func(x,a2,b2)
plt.plot(x, y)
print(f'a ≈ {a2}, b ≈ {b2}')


如果函数有多个等效拟合,则curve_fit可能会拾取其中的任何一个。

相关问题