为何我的numpy polyfit拟合结果不符合预期?代码问题排查
代码错误分析与修正
你的代码存在两个关键问题,导致拟合曲线呈现异常状态:
1. 多项式次数设置错误
你明确要做2次多项式拟合,但代码中deg = 1指定的是线性拟合(1次多项式),完全不符合需求。需要将deg改为2。
2. 绘图时x数组未排序
原x数组并非按从小到大排列,直接用原x计算拟合值并绘图,会让曲线在无序的x点之间来回连接,出现图中混乱的折线效果。解决方式是先对x排序,再基于排序后的x计算拟合y值。
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt deg = 2 # 修改为2次多项式 fig, ax = plt.subplots(1, facecolor="white") fig.set_size_inches(5,4) x = [0.843291,0.873922,0.903581,0.93344,0.961478,0.990968, 1.019434,1.047562,1.075373,1.102883,1.130106,1.157059, 1.183751,1.210195,1.236399,1.262376,1.288134,1.313679, 1.339022,1.364167,1.389123,1.413896,1.438492,1.462916, 1.505685,1.57998,1.690303,1.730423,1.761613,1.791332, 1.63034,1.652749,1.675848,1.698821,1.721672,1.744402] y = [291000000,291000000,292000000,291000000,290000000,290000000, 290000000,290000000,289000000,289000000,288000000,288000000, 288000000,287000000,287000000,287000000,287000000,286000000, 286000000,286000000,285000000,285000000,284000000,284000000, 284000000,283000000,283000000,282000000,282000000,281000000, 280000000,280000000,279000000,278000000,277000000,277000000] ax.scatter(x, y, label="data", c="black", alpha=0.8) # 拟合多项式 poly = np.poly1d(np.polyfit(x, y, deg=deg)) # 对x排序并计算拟合值 x_sorted = np.sort(x) y_fit = poly(x_sorted) # 用排序后的x绘图 ax.plot(x_sorted, y_fit, label='fit', c="black", alpha=0.5) ax.legend() plt.show()
补充说明
np.polyfit本身不要求x有序,但绘图时必须用有序的x值,才能得到连续平滑的拟合曲线。- 修改
deg=2后,拟合结果会符合你想要的2次多项式形式。
内容的提问来源于stack exchange,提问作者Nima
相关产品推荐
相关产品推荐

