我有一些可以成功绘制图形的数据点,但是现在我想对数据拟合曲线。我调查了其他stackoverflow答案,发现了一些问题,但似乎无法实现它们。我知道该功能是反向S型。
我想使用这个希尔方程:https://imgur.com/rYqEASm
到目前为止,我尝试使用curve_fit()
包中的scipy
函数来查找参数,但是我的代码总是会中断。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
x = np.array([1, 1.90, 7.70, 30.10, 120.40, 481.60, 1925.00, 7700.00])
y = np.array([4118.47, 4305.79, 4337.47, 4838.11, 2660.76, 1365.05, 79.21, -16.40])
def fit_hill(t,b,s,i,h):
return b + ((t-b)/(1 + (((x * s)/i)**-h)))
plt.plot(x,y, 'o')
plt.xscale('log')
plt.show()
params = curve_fit(fit_hill, x, y)
[t,b,s,i,h] = params[0]
答案 0 :(得分:1)
fit_hill应该具有6个参数。 (请参阅https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html)
fit_hill(x,t,b,s,i,h)。 您应该尝试对参数进行初步猜测。
例如,在您的模型中,当x = 0时,值为t。因此,您可以将x = 0处的值设置为t的估算值。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
x = np.array([1, 1.90, 7.70, 30.10, 120.40, 481.60, 1925.00])
y = np.array([4118.47, 4305.79, 4337.47, 4838.11, 2660.76, 1365.05, 79.21])
def fit_hill(x,t,b,s,i,h):
return b + ((t-b)/(1 + (((x * s)/i)**-h)))
plt.plot(x,y, 'o')
popt,pcov = curve_fit(fit_hill, x, y,(4118,200,1,1900,-2))
plt.plot(x,fit_hill(x,*popt),'+')
plt.xscale('log')
plt.show()
您是否绘制了模型以可视化它是否适合您的数据?
只能在s / i中使用的s和i可以用模型中的一个变量替换。