多项式逼近遇LinAlgError:维度不兼容,求绘图解决方案
最小二乘法拟合多项式图像报错解决
错误原因分析
第一个报错(LinAlgError: Incompatible dimensions)
代码中m2, c2 = np.linalg.lstsq(m1, s1, rcond = None)[0]属于多余且错误的操作:
m1是(6,2)的矩阵(对应6个样本、2个特征:x和常数项)s1是线性拟合得到的系数数组,形状为(2,),而np.linalg.lstsq要求第二个参数的行数必须与第一个参数的行数一致(即6行),维度不匹配直接触发报错- 实际上
s1已经包含了线性拟合的斜率和截距,无需再次调用拟合函数
第二个报错的问题
代码里s2 = np.linalg.lstsq(m2, s2, rcond = None)[0]同样错误:
s2是二次拟合的系数数组(形状(3,)),m2是(6,3)的矩阵,两者维度不匹配,无法执行拟合计算- 这行代码无实际意义,二次拟合系数已经通过之前的
s2 = np.linalg.lstsq(m2, y, rcond = None)[0]得到,无需重复操作
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt # 实验数据 x = np.array([1.0, 1.2, 1.4, 1.6, 1.8, 2.0]) y = np.array([2.0, 6.0, 4.0, 4.0, 2.0, 5.0]) # 构造线性拟合设计矩阵:[x, 1] m1 = np.vstack((x, np.ones(len(x)))).T # 构造二次拟合设计矩阵:[x², x, 1] m2 = np.vstack((x**2, x, np.ones(len(x)))).T # 最小二乘法求解系数 s1 = np.linalg.lstsq(m1, y, rcond=None)[0] # 线性拟合系数:[斜率m, 截距c] s2 = np.linalg.lstsq(m2, y, rcond=None)[0] # 二次拟合系数:[a, b, c],对应y=ax²+bx+c # 打印系数与标准差 print("线性拟合系数:", s1) print("线性系数标准差:", np.std(s1)) print("二次拟合系数:", s2) print("二次系数标准差:", np.std(s2)) # 生成密集x值,让拟合曲线更平滑 x_fit = np.linspace(min(x)-0.2, max(x)+0.2, 100) # 绘制图像 plt.figure(figsize=(8, 6)) plt.plot(x, y, 'o', label='原始数据', markersize=10) plt.plot(x_fit, s1[0]*x_fit + s1[1], 'r-', label='线性拟合') plt.plot(x_fit, s2[0]*x_fit**2 + s2[1]*x_fit + s2[2], 'b-', label='二次拟合') plt.legend() plt.xlabel('x') plt.ylabel('y') plt.grid(True) plt.show()
代码说明
- 移除了未使用的
pandas相关导入 - 直接从已求解的
s1、s2中提取拟合系数,避免重复拟合导致的维度错误 - 生成密集的
x_fit值绘制拟合曲线,提升曲线平滑度 - 同时展示原始数据、线性拟合、二次拟合结果,满足需求
内容的提问来源于stack exchange,提问作者Chinze
相关产品推荐
相关产品推荐

