from scipy.optimize import curve_fit
def func(x, a, b, c):
return a * np.exp(-b * x) + c
x = np.linspace(0,4,5)
y = func(x, 2.5, 1.3, 0.5)
yn = y + 0.2*np.random.normal(size=len(x))
fit ,cov = curve_fit(func, x, yn)
fit
[ 2.67217435 1.21470107 0.52942728] #Variables
y
[ 3. 1.18132948 0.68568395 0.55060478 0.51379141] #Original data
func(x,*fit)
[ 3.20160163 1.32252521 0.76481773 0.59929086 0.5501627 ] #Fit to original + noise
6条答案
按热度按时间evrscar21#
你也可以使用numpy的polyfit:
这使您可以很容易地更改多项式拟合的次数,因为函数
polyfit
采用以下参数np.polyfit(x data, y data, degree)
。显示的是一个线性拟合,其中返回的数组对于任何次数n
都类似于fit[0]*x^n + fit[1]*x^(n-1) + ... + fit[n-1]*x^0
。poly1d
函数允许您将此数组转换为一个函数,该函数返回多项式在任何给定值x
处的值。一般来说,没有一个很好理解的模型外推最多只能得到零星的结果。
指数curve fitting。
bf1o4zei2#
在Python聊天中和你讨论过之后--你将你的数据拟合成指数。这应该给予一个相对较好的指标,因为你不需要长期的外推。
最右侧轴中的红点显示下一个“预测”点。
az31mfrm3#
正如本文answer对一个相关问题所指出的,在scipy的0.17.0版本中,scipy.interpolate.interp1d中有一个选项允许线性外推。
dphi5xsq4#
由于数据近似为线性,因此可以使用linear regression,然后使用
y = w[0]*x + w[1]
(保留链接示例中 y = mx + B 的符号),使用回归结果计算下一个点。如果你的数据不是近似线性的,并且你没有其他的回归理论形式,那么一般的外推(比如多项式或样条)就不太可靠,因为它们可能会超出已知的数据点而变得有点疯狂。例如,请参见公认的答案here。
khbbv19g5#
使用
scipy.interpolate.splrep
:参见How to make scipy.interpolate give an extrapolated result beyond the input range?
tp5buhyn6#
如果您不想依赖
scipy
,下面是使用***only***numpy
的一个有趣示例:它使用普通的
numpy.interp
进行插值,恢复为线性polynomial fit以外推超出边界的值,并使用numpy.piecewise
将它们串在一起。除了
polyval(..., polyfit(...))
,您还可以自己编写线性外推函数,例如:等等。