为什么向函数添加额外的虚拟参数会使曲线拟合起作用?
Why does adding an extra dummy parameter to a function make curve fitting work?
我一直在尝试使用 scipy 对一些数据进行线性拟合,但我发现拟合与数据相去甚远。为了进一步调查,我尝试使用下面的代码将一条线拟合到一些完全适合一条线的数据,但它仍然不起作用,如图所示。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def func(a,x):
return a*(x+1)
x = np.arange(-5,6)
y = func(1,x)
popt,pcov = curve_fit(func,x,y,p0=[1])
plt.plot(x,y,'x')
plt.plot(x,func(*popt,x),'--')
plt.show()
看到这个失败后,我尝试重新定义函数以添加一个什么都不做的附加参数,令我惊讶的是,我发现它起作用了。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def func(a,b,x):
return a*(x+1)
x = np.arange(-5,6)
y = func(1,0,x)
popt,pcov = curve_fit(func,x,y,p0=[1,0])
plt.plot(x,y,'x')
plt.plot(x,func(*popt,x),'--')
plt.show()
为什么以这种方式重新定义函数,这看起来应该没什么区别,显然解决了这里的问题?
请注意,在进一步尝试之后,我发现这似乎只有在初始猜测 p0
已经设置为正确值时才有效,尽管与虚拟参数的拟合仍然更接近比另一个合适。
此外,虽然我在这里使用了线性函数,但这种行为似乎也出现在其他类型的函数中。
正如用户 Frank Yellin 在评论中所说,您定义函数的方式与 curve_fit
不兼容。
来自docs、curve_fit
:
Assumes ydata = f(xdata, *params) + eps
如果您使用正确的参数顺序定义 func
,您将得到:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def func(x, a):
return a*(x+1)
x = np.arange(-5,6)
y = func(x, 1)
popt,pcov = curve_fit(func,x,y,p0=[1])
plt.plot(x,y,'x')
plt.plot(x,func(x, *popt),'--')
plt.show()
您上面的一些尝试之所以奏效,是因为您用于拟合的特定函数关于参数 几乎 对称,这意味着 a*(x+1)
如果 a
包含您的数据和 x
您的参数,则有意义。
我一直在尝试使用 scipy 对一些数据进行线性拟合,但我发现拟合与数据相去甚远。为了进一步调查,我尝试使用下面的代码将一条线拟合到一些完全适合一条线的数据,但它仍然不起作用,如图所示。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def func(a,x):
return a*(x+1)
x = np.arange(-5,6)
y = func(1,x)
popt,pcov = curve_fit(func,x,y,p0=[1])
plt.plot(x,y,'x')
plt.plot(x,func(*popt,x),'--')
plt.show()
看到这个失败后,我尝试重新定义函数以添加一个什么都不做的附加参数,令我惊讶的是,我发现它起作用了。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def func(a,b,x):
return a*(x+1)
x = np.arange(-5,6)
y = func(1,0,x)
popt,pcov = curve_fit(func,x,y,p0=[1,0])
plt.plot(x,y,'x')
plt.plot(x,func(*popt,x),'--')
plt.show()
为什么以这种方式重新定义函数,这看起来应该没什么区别,显然解决了这里的问题?
请注意,在进一步尝试之后,我发现这似乎只有在初始猜测 p0
已经设置为正确值时才有效,尽管与虚拟参数的拟合仍然更接近比另一个合适。
此外,虽然我在这里使用了线性函数,但这种行为似乎也出现在其他类型的函数中。
正如用户 Frank Yellin 在评论中所说,您定义函数的方式与 curve_fit
不兼容。
来自docs、curve_fit
:
Assumes
ydata = f(xdata, *params) + eps
如果您使用正确的参数顺序定义 func
,您将得到:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def func(x, a):
return a*(x+1)
x = np.arange(-5,6)
y = func(x, 1)
popt,pcov = curve_fit(func,x,y,p0=[1])
plt.plot(x,y,'x')
plt.plot(x,func(x, *popt),'--')
plt.show()
您上面的一些尝试之所以奏效,是因为您用于拟合的特定函数关于参数 几乎 对称,这意味着 a*(x+1)
如果 a
包含您的数据和 x
您的参数,则有意义。