Matplotlib多项式回归出现蛛网线条问题求解决方案
解决多项式回归绘图出现蛛网线条的问题
这个问题很常见,根源其实很简单:你的x数组没有按顺序排列,plt.plot()会严格按照数组的索引顺序连接每个数据点,当x是乱序的时候,线条就会在不同x值之间来回跳转,形成你看到的蛛网效果。
修复步骤和代码
要得到平滑的拟合曲线,我们需要生成一组排序且密集的x值,用模型预测这些x对应的y值,再用排序后的x和预测y来绘图。修改后的完整代码如下:
import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures import matplotlib.pyplot as plt # 读取数据部分和原代码一致 df = pd.read_csv('poly_data.csv', delimiter=' ', names=['x', 'y']) x = df['x'].to_numpy() y = df['y'].to_numpy() # 训练3阶多项式回归模型,这部分无需改动 model = LinearRegression() poly = PolynomialFeatures(3) x_poly = poly.fit_transform(x.reshape(-1, 1)) model.fit(x_poly, y.reshape(-1, 1)) # 关键:生成排序且密集的x序列,用于绘制平滑曲线 # 用linspace生成100个从x最小值到最大值的均匀点,数量越多曲线越平滑 x_sorted = np.linspace(x.min(), x.max(), 100) # 注意这里用transform而不是fit_transform,因为poly已经在原始数据上拟合过了 x_sorted_poly = poly.transform(x_sorted.reshape(-1, 1)) y_pred_sorted = model.predict(x_sorted_poly) # 绘图 plt.scatter(x, y, label='Original Data', alpha=0.6) # 原始数据散点,alpha让点更通透 # 如果需要展示原始x对应的预测值,可以保留这个散点,否则可以删掉 plt.scatter(x, model.predict(x_poly), label='Predicted Points', color='orange', alpha=0.6) # 用排序后的x和预测值绘制平滑曲线 plt.plot(x_sorted, y_pred_sorted, color='red', linewidth=2, label='3rd Order Polynomial') plt.title('Polynomial Regression') plt.xlabel('x') plt.ylabel('y') plt.legend() plt.show()
核心要点解释
为什么用排序的x?
原代码中plt.plot(x, model.predict(x_poly))的x是原始数据的乱序数组,plot会按数组的顺序连接点,比如x是[3,1,4,2],线条会从3→1→4→2,自然会出现交叉的蛛网线条。排序后的x是严格递增的,连接起来就是平滑的曲线。为什么用linspace生成密集点?
原始数据的x可能比较稀疏,直接用排序后的原始x绘图,曲线会显得不够平滑。用linspace生成更多的点(比如100个),可以让拟合曲线看起来更流畅。为什么用transform而不是fit_transform?
PolynomialFeatures的fit_transform()会计算特征的统计量(虽然多项式特征不需要,但这是API规范),如果在新的x_sorted上用fit_transform,会重新计算这些统计量,导致和训练模型时的特征转换不一致,预测结果会出错。所以必须用已经拟合好的poly的transform()方法。
内容的提问来源于stack exchange,提问作者Anders Zhou
相关产品推荐
相关产品推荐

