You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:34:26