使用 numpy polyfit 没有得到正确的值

Not getting the right value with numpy polyfit

import numpy as np
from matplotlib import pyplot as plt
a = np.ndarray((2,8))

a[0] = [0,10,21.5,25.2,70,89,112,150] # row for all X values
a[1] = [0,5,10,15,20,25,30,35] # row for all Y values


#Value by curve fitting - 7th order polynomial            
trend = np.polyfit(a[0], a[1], 7)
trendpoly = np.poly1d(trend) #Values of the coefficients of 5th order polynomial
plt.plot(a[0],trendpoly(a[0]))
plt.plot(a[0],a[1])

Y4 = trendpoly(100)
plt.scatter(100,Y4)

print(Y4)

结果图如下所示 - 与数据完美契合。数据和曲线拟合的两条重叠曲线,散点显示 X = 100 处的值,该值偏离曲线拟合

这里出了什么问题?为什么 trendpoly(100) 的值与曲线拟合不一致?

这是overfitting的问题。

多项式的阶数设置得越多,越容易过拟合。 尝试使用 3 或更少的订单来观察变化。

如果绘制整个多项式就可以拟合并分散数据点

trend = np.polyfit(a[0], a[1], 7)
x_line = np.linspace(0,150,1000)
fit = np.polyval(trend, x_line)
plt.scatter(a[0], a[1])
plt.plot(x_line, fit)

您可能会看到一条围绕您的数据点剧烈摆动的曲线。确定拟合多项式次数的方法是 1) 查看您希望数据遵循哪种函数。 2)尝试不同的多项式次数,直到你得到一个不会不合理地振荡的拟合。

如果你有 n 个数据点,次数 >= n-1 的多项式将完美地截取每个数据点,但会远离数据点之间的曲线。

如果您希望您的数据遵循一些非多项式函数,例如 log(x) 或 exp(x)(或者在这种情况下可能是 a * sqrt(b * x)),您可以查看 scipy.curve_fit.