首页 > 解决方案 > np.polynomial.polynomial.polyfit 似乎不适合 Python 中的数据

问题描述

我正在尝试对 373 个数据点进行简单的线性拟合,但 polyfit 似乎失败了,我不知道为什么。

x = np.reshape(air_sst_new[:,90,180],(373))
y = np.reshape(olr_new[:,90,180],(373))

z = np.polynomial.polynomial.polyfit(x,y,1)

plt.figure()
plt.plot(x,y, '.')
xx = np.linspace(np.min(x),np.max(x))
yy = np.polynomial.polynomial.polyval(xx, z)
plt.plot(xx, yy)

显示原始数据和拟合的图

上面编写的代码在使用令人沮丧的随机生成的点时有效。

example_x = np.random.rand(373,180,360)
example_y = np.random.rand(373,180,360)

x = np.reshape(example_x[:,90,180], (373))
y = np.reshape(example_y[:,90,180], (373))

z = np.polynomial.polynomial.polyfit(x,y,1)

plt.figure()
plt.plot(x,y, '.')
xx = np.linspace(np.min(x), np.max(x))
yy = np.polynomial.polynomial.polyval(xx, z)
plt.plot(xx, yy)

显示随机生成的数据和正确拟合的图

标签: pythonnumpymatplotlibcurve-fitting

解决方案


问题在于您的polyval. z是您的线性拟合系数数组,并且xx是用于绘制拟合的细化网格。

使用过:

z = np.polynomial.polynomial.polyfit(x,y,1)
yy = np.polynomial.polynomial.polyval(xx, z)

应该使用:

z = np.polyfit(x,y,1)
yy = np.polyval(z, xx)

更多详细信息,请参阅此处的官方文档。


推荐阅读