新闻详情

新闻详情

首页 / 资讯中心 / 详情

线性参数最小二乘法处理:原理、代码与避坑指南

发布时间:2026/9/26 12:40:45来源:尧图网络
线性参数最小二乘法处理:原理、代码与避坑指南
简介这是一份面向精密测量、误差理论与数据处理学习的PPT课件围绕最小二乘法在参数估计中的应用展开适合测控、仪器科学与工程类专业学生及需要处理实验数据的初学者。课件系统讲解最小二乘法原理、线性参数最小二乘法的正规方程组、不等权处理与标准差估计并延伸至非线性参数经泰勒展开后迭代求解以及组合测量的典型应用。包含例5-1电容器电容量估计和例5-2新增串联测量后的迭代计算步骤完整便于对照理解公式推导与数值求解过程。资源为单个pptx文件共24页压缩包大小约306KB内容精炼适合课堂辅助或自学复习。内容结构清晰重点突出对理解测量数据拟合、误差传递与最优估计均有帮助。已有60人学习可作为课程讲解和课后巩固的实用材料。1. 线性参数的最小二乘法处理为什么你拟合的直线总在端点先翻车做传感器标定时我常看到这样的现象用Excel拉一条趋势线中间段误差还看得过去两端却“翘起来”。原因多半不是仪表问题而是你在用普通最小二乘法处理线性参数数据时默认了每个点的x准确、y等精度、误差只随y分布。实际测量的温度、压力、位移往往不满足这些假设。这次就围绕“线性参数的最小二乘法处理”这个动作展开从最小二乘法原理到正规方程、从矩阵代码到加权与误差估计最后给出我踩过的坑和验证手段。适合正在做曲线拟合、参数标定、实验数据回归的工程师和学生——你能照着复现也能避开那些让结果“看起来合理”的陷阱。2. 最小二乘法原理从误差平方和最小到正规方程2.1 最小二乘法公式是怎么来的先定目标函数再求偏导最小二乘法的出发点不是“找一条穿过所有点的线”而是在参数空间里找一组值让所有观测到的残差平方和最小。对线性参数模型 y β0 β1 x ε目标函数写为S(β0, β1) Σ_{i1..n} (y_i - β0 - β1 x_i)^2这里的ε是随机误差β0和β1是要估计的线性参数。为什么叫“线性参数”因为模型对β0、β1是线性的即便变量x本身可以是非线性的比如 y β0 β1 x^2也属于线性参数问题。这一点在选模型时特别重要。求最小值的标准做法是对β0和β1求偏导并令导数为零。得到工程上常用的最小二乘法公式β1 Σ[(x_i - x̄)(y_i - ȳ)] / Σ[(x_i - x̄)^2] β0 ȳ - β1 x̄这个公式很多人会背但容易忘记一个重要前提模型残差要有相同的方差等方差假设且x_i的测量误差可以忽略。如果你的数据是压力传感器采集的x电压噪声很小、y压强噪声很大那普通最小二乘公式没问题但如果y是精确给定的阶梯值、x是跳变沿你就要重新考虑变量角色。从偏导到闭式解的推导过程价值在于让你看清“平方”两个字的意义它把正负误差都变成正值同时放大大误差的权重。这也意味着哪怕一个异常点也会强烈拉偏回归线。所以后面第5章的剔异常值步骤不是可选项。实际计算时x̄和ȳ不能随手四舍五入。x数量级很大时x_i - x̄会出现大数减小数抵消丢失有效数字。常见做法是先把x中心化算完斜率再换回去后面第5章会专门讲这个坑。2.2 线性参数模型的矩阵形式把求解变成线性代数问题当参数扩展到多个比如 y β0 β1 x1 β2 x2最小二乘法公式的手写形式会变得很长。更通用的做法是把它写成矩阵形式Y Xβ ε其中 Y 是 n×1 观测向量X 是 n×p 设计矩阵第一列全1后面是各变量观测值β 是 p×1 参数向量。目标函数变成S(β) (Y - Xβ)^T (Y - Xβ)对 β 求导并令其等于零得到正规方程组X^T X β X^T Y只要 X 的列线性无关即 X^T X 可逆参数解就是β_hat (X^T X)^{-1} X^T Y这一步是把最小二乘法原理落成代码的核心。实际编程时不建议直接求逆——用 numpy 的 lstsq 或 solve 更稳定。正规方程本身很简洁但“可逆”这个条件不是自动满足的如果两个特征完全共线X^T X 是奇异矩阵最小二乘解仍有无数个只是数值解法可能给出一个看起来正常的结果实际上参数方差极大。工程上还有个常被忽视的点X^T X 的条件数。条件数大到 1e10 时即使矩阵可逆求逆结果也会被舍入误差淹没。所以检查秩的同时建议看一眼 np.linalg.cond(X.T X)。如果条件数很大优先用基于 SVD 的 lstsq而不是直接求逆。2.3 为什么“线性参数”不等于“直线拟合”多项式与多元情形标题里的“线性参数”只限制参数与误差的关系不限制变量形态。y β0 β1 x β2 x^2 的右边对 β0、β1、β2 是线性的所以它仍然是线性参数模型可以直接套用最小二乘法公式和矩阵解法。同理多元线性回归 y β0 β1 x1 β2 x2 也是线性参数的只要变量间不共线。这带来一个选型上的便利抛物线、三次曲线、双变量平面都可以统一在一套线性参数处理框架里。你不需要为每种曲线单独推导公式只需要构造正确的设计矩阵 X。但也要看清边界如果模型本身变成了 β0 β1 * exp(β2 * x)参数 β2 出现在指数里这就不再是线性参数模型需要非线性最小二乘比如 Levenberg-Marquardt。前者有唯一闭式解后者只能迭代且依赖初值。很多人喜欢在数据弯曲时直接把多项式阶数加到5、6阶结果拟合“完美”但预测一塌糊涂。下面这个表总结了三种情况的处理方式。模型类型参数线性求解方式典型坑直线 y β0 β1 x是正规方程 / 闭式公式端点误差放大多项式 y β0 β1 x β2 x²是矩阵最小二乘高次过拟合指数 y β0·exp(β1 x)否迭代非线性拟合初值敏感、可能不收敛所以你拿到一批数据后第一件事不是套代码而是先判断模型属于哪一行。选型错了后面所有统计检验都失去意义。判断依据也很简单写出数学表达式看未知参数是否都以线性方式出现。只要涉及参数之间的乘除、指数、对数就退出线性参数处理流程。3. 从公式到代码用 Python 实现线性参数的最小二乘法处理3.1 最小可复现实现手写正规方程并用 numpy 验证先给一段最小代码它不依赖 sklearn只靠 numpy 就能完成线性参数的最小二乘法处理。这段代码也是我复盘“最小二乘法公式”时的起点。import numpy as np # 生成带噪声的线性数据真实参数 a2.5, b0.8 rng np.random.default_rng(42) x np.linspace(0, 10, 50) y_true 2.5 0.8 * x y y_true rng.normal(0, 0.5, sizex.shape) # 构造设计矩阵 X第一列全 1 对应截距第二列是 x X np.vstack([np.ones_like(x), x]).T # 方法1直接解正规方程 beta_hat np.linalg.solve(X.T X, X.T y) print(正规方程解:, beta_hat) # 方法2用 lstsq 走 SVD数值更稳 beta_hat2, residuals, rank, s np.linalg.lstsq(X, y, rcondNone) print(lstsq解:, beta_hat2)逻辑说明X.T X 得到 2×2 矩阵X.T y 得到 2×1 向量solve 对可逆矩阵直接求线性解。lstsq 则对 X 做 SVD不要求 X^T X 可逆在秩不足时给出最小范数解。两者的解在正常数据上一致。参数说明里rcondNone 表示按机器精度自动截断奇异值通常保留默认即可。这里需要提醒不要把 y 写成二维列向量否则广播维度会不一致选 x.shape 而不是 (50,1)否则 Vstack 维度会错。这些是新手最容易翻车的地方。我见过有人把 X 写成 [x, np.ones_like(x)]结果顺序反了截距和斜率对调还要花半天找问题。3.2 一次项与多项式回归用 polyfit 和 Vandermonde 矩阵对比如果只是单变量多项式numpy.polyfit 是更直接的工具。它的本质就是构造 Vandermonde 矩阵然后走最小二乘法处理流程只不过把阶数排列顺序封装好了。# 一次拟合 coeff1 np.polyfit(x, y, deg1) print(一次拟合系数(从高次到低次):, coeff1) # 三次拟合对比 coeff3 np.polyfit(x, y, deg3) print(三次拟合系数:, coeff3)polyfit 的第一个参数是自变量第二个是因变量deg 是多项式阶数。注意返回系数是从高阶到低阶排列的所以一次拟合返回的是 [b, a] 而不是 [a, b]和第 3.1 小节结果顺序相反。这个顺序搞反是血泪经验。我做温度标定时就把 polyfit 出来的斜率当截距用导致公式反推时所有值都差一个固定量排查了很久。另外polyfit 还支持 w 参数传入权重对应加权最小二乘法我们在第 4 章会用到。polyfit 内部使用最小二乘求解但它不会直接给你残差、协方差等诊断信息。如果你想看参数的不确定度需要手动调用 np.linalg.lstsq 或使用 statsmodels。为了验证 Vandermonde 矩阵和正规方程的关系可以手动构造# 手动构造三阶拟合的设计矩阵 X3 np.vander(x, N4, increasingFalse) print(Vandermonde矩阵形状:, X3.shape)vander 默认按降幂排列第一列是 x^3最后一列是 1。这就是 polyfit 内部在做的构造。理解这一点你就能把多元线性回归和多项式回归统一到同一套流程。3.3 评价拟合好坏的三个指标残差、R²和参数不确定度拟合完不能只看系数还要做三个检查残差是否围绕0随机分布、决定系数 R² 多大、参数标准差是多少。下面这段代码一次算完。# 用 lstsq 的结果做预测与残差分析 pred X beta_hat2 residual y - pred # 残差平方和与总平方和 ss_res np.sum(residual**2) ss_tot np.sum((y - np.mean(y))**2) r_squared 1 - ss_res / ss_tot # 估计误差方差自由度 n-p n, p X.shape sigma2 ss_res / (n - p) # 参数协方差矩阵sigma2 * (X^T X)^-1 cov_beta sigma2 * np.linalg.inv(X.T X) std_beta np.sqrt(np.diag(cov_beta)) print(R²:, r_squared) print(参数标准差:, std_beta) print(参数协方差矩阵:\n, cov_beta)逻辑说明R² 衡量模型解释了总变异的比例但要注意它只适合线性参数模型且含有截距时取值范围在 0 到 1 之间没有截距时 R² 可能为负。参数标准差来自协方差矩阵对角线开方置信区间一般取 β ± t_{n-p} * std大样本下 t 分布约等于正态分布。这里有一个黑匣子协方差矩阵里的 sigma2 是残差方差的无偏估计前提是模型正确且残差同方差。如果你的数据有异方差这个标准差可能是误导的。所以第 4 章的加权处理不能跳过。还要注意自由度 n-p。p 是设计矩阵列数包含截距。样本量 n 很小时sigma2 的估计波动很大。比如 n 只有 10 时自由度是 8估计出的方差可能偏小n-p 小于 5 时不要过度相信参数标准差。4. 加权与误差传递线性参数最小二乘法的高阶处理4.1 异方差下的加权最小二乘权重矩阵 W 怎么定当每个观测点的噪声 σ_i 不相等时最小二乘法公式应该改成加权版本。目标函数为S(β) (Y - Xβ)^T W (Y - Xβ)其中 W 是对角权重矩阵通常取 W_ii 1 / σ_i^2。求解结果是β_hat (X^T W X)^{-1} X^T W Y实际操作中σ_i 怎么估计常见三种来源仪器精度给出的不确定度、重复测量多次算出的标准差、残差随 x 变化趋势拟合出的标准差。如果没有这些不要硬造权重还是先做普通最小二乘再用残差诊断异方差。# 假设已知每个点的标准差不相等例如测量设备在高范围误差更大 sigma 0.1 0.05 * x # 模拟异方差 w 1 / sigma**2 W np.diag(w) # 加权最小二乘用 solve 解加权正规方程 Xw X * np.sqrt(w[:, None]) yw y * np.sqrt(w) beta_w np.linalg.lstsq(Xw, yw, rcondNone)[0] print(加权最小二乘解:, beta_w)这里的关键 trick 是把权重开方后同时乘到设计矩阵和观测向量上就能复用普通 lstsq。逻辑说明X * np.sqrt(w[:, None]) 的广播需要把 w 从一维变成 n×1否则会沿错误轴广播。这个细节我一开始也搞错过。参数说明sigma 数组要和 x 逐点对应如果某个点的 sigma 特别小权重会很大说明该点对拟合结果影响大。注意不要让权重超过 1e6否则数值上容易把别的点压制掉。4.2 普通最小二乘 vs 加权最小二乘到底差多少用一个对照实验看效果。在异方差数据上分别做普通和加权最小二乘比较参数估计的标准差。# 模拟异方差数据重复1000次蒙特卡洛统计参数方差的减少 rng np.random.default_rng(7) beta_ols_list, beta_wls_list [], [] for _ in range(1000): y_sim 2.5 0.8 * x rng.normal(0, sigma) beta_ols np.linalg.lstsq(X, y_sim, rcondNone)[0] Xw_sim X * np.sqrt(w[:, None]) yw_sim y_sim * np.sqrt(w) beta_wls np.linalg.lstsq(Xw_sim, yw_sim, rcondNone)[0] beta_ols_list.append(beta_ols) beta_wls_list.append(beta_wls) std_ols np.std(beta_ols_list, axis0) std_wls np.std(beta_wls_list, axis0) print(OLS参数标准差:, std_ols) print(WLS参数标准差:, std_wls) print(标准差比值:, std_ols / std_wls)这个试验说明如果异方差明显加权最小二乘的参数估计方差通常更小尤其在噪声大的区域样本被降权后不会强制模型迁就高噪声点。但前提是 sigma 已知并且准确。如果 sigma 估错了加权可能比不加权更差。这就是权重设定的“玄学”它看似严谨实则依赖你对测量系统不确定度的理解。实际项目里我一般先用同型号传感器做重复性实验得到每个量程点的 σ_i。没有重复实验数据时就把残差按 x 分段计算每段残差的标准差来近似 σ_i。这里要留个心眼如果残差标准差本身就来自拟合结果再用它加权存在循环依赖最好做一次迭代加权。4.3 参数误差与置信区间从协方差矩阵读出三个关键值线性参数的最小二乘处理最终不能只给一组系数还要给误差。常见做法是从协方差矩阵中取三样东西参数标准差、相关系数矩阵、参数置信区间。# 计算参数相关系数矩阵 corr_beta cov_beta / np.outer(std_beta, std_beta) print(相关系数矩阵:\n, corr_beta) # 95% 置信区间自由度为 n-p用t分布 from scipy import stats alpha 0.05 t_crit stats.t.ppf(1 - alpha/2, dfn-p) ci_low beta_hat2 - t_crit * std_beta ci_high beta_hat2 t_crit * std_beta print(95%置信区间下界:, ci_low) print(95%置信区间上界:, ci_high)说明相关系数矩阵里截距和斜率的负相关很常见——截距升高、斜率降低互相补偿。这种负相关是正常的但如果绝对值接近 1说明设计矩阵严重病态你需要数据去中心化。置信区间计算依赖自由度 n-p所以样本量少时要用 t 分布而不是 z 分布。如果数据是温度标定你还会遇到一个新问题预测值和拟合参数之间的误差传递。假设用拟合直线反推温度参数的两个不确定性会同时进入预测值。常见做法是用协方差矩阵整体计算预测方差而非简单叠加两条独立误差。这部分我放在第 6 章的验证里一起讲。5. 线性参数最小二乘法常见问题与避坑我从项目里捡回的5条经验5.1 数据没做居中化设计矩阵病态导致参数方差爆炸现象x 取值在 300000 到 300010 之间拟合出的截距和斜率数值巨大且每次运行结果不稳定。原因X^T X 的条件数太大数值求解时舍入误差被放大。你还记得第 2.2 节说的条件数吗这个场景就是典型表现。解决先把 x 减去均值x_center x - x.mean()拟合后换算回原坐标。截距会变但预测值一致。如果你用 lstsq可以在 X 构造前做这一步省得后面再解“为什么参数物理意义不合理”。5.2 一个异常值把拟合线拉飞残差图上全点都“呼呼”超限现象50 个点里有 1 个点偏离真实线 10 倍拟合结果被明显拉向它其他点的残差几乎都超过 3σ。原因最小二乘法对离群点极其敏感因为误差平方操作让大误差的权重呈平方级放大。这不是程序 bug而是算法本身的特性。解决先做一次拟合计算残差剔除超过 3σ 的点再重新拟合。如果异常点超过样本的 10%考虑使用 Huber 回归等鲁棒方法。线性参数处理的主流程里这一条我建议写进自动处理脚本否则标定数据里混进一个坏点整个批次都白做。5.3 多项式阶数越加越高R²漂亮但预测翻车现象deg8 时 R² 接近 0.999但一预测新 x 就剧烈振荡参数协方差矩阵里高阶项的标准差很大。原因过拟合。模型参数数量接近样本数把噪声也学进去了。R² 只看训练数据不能反映泛化能力。解决控制阶数不超过 n/10用交叉验证比较均方误差观察高阶项系数是否显著。如果你的目标是标定而非插值尽量保持物理模型低阶。高阶多项式在端点处的振荡正是标题开篇“端点先翻车”的另一个来源。5.4 y 和 x 数量级差太多lstsq 返回结果对但参数解释失真现象x 是 0~1 的小数y 是几千万的流量值斜率动辄 1e7截距近似为 0看起来“没规律”。原因变量尺度差异大会让数值效应集中在大系数上本质上不影响预测但影响协方差矩阵和显著性判断。参数标准差会显示为不显著导致你以为模型无效。解决把 x 和 y 都做归一化比如 z-score拟合后再还原或者用中心化加尺度化。做流量计时我习惯在代码里记录归一化的均值和标准差这样以后部署到嵌入式设备时能反算回物理量。5.5 加权最小二乘的权重用错把置信区间当标准差用现象某点测量 10 次置信区间很窄于是给了很大权重结果拟合完全迁就这个点其他点被无视。原因置信区间是平均值的不确定度单次观测的标准差要换算后才能使用。直接用均值的标准误作为权重分母等于把重复测量的好处放大到了单点上。解决权重的分母必须是单次观测标准差 σ_i不是均值的标准误 SE。如果你只有每组重复测量数据先计算组内标准差再用 W_i 1/σ_i^2。如果某个点只测了一次估计 σ_i 时就要保守一些不要把权重给满。6. 验证最小二乘处理结果用蒙特卡洛模拟和残差自举别把黑匣子当终点拟合程序写完后不要只跑一次就看结果。我会先造一份“已知真相”的模拟数据用蒙特卡洛重复几百次看参数估计的均值和标准差是否接近理论值。这能同时检验你的代码、数据噪声假设和自由度计算是否全部正确。# 已知真实参数模拟1000次数据并检验估计偏差 true_beta np.array([2.5, 0.8]) n_sim 1000 estimates np.zeros((n_sim, 2)) for i in range(n_sim): y_sim X true_beta rng.normal(0, 0.5, sizex.shape) beta_i np.linalg.lstsq(X, y_sim, rcondNone)[0] estimates[i] beta_i bias estimates.mean(axis0) - true_beta emp_std estimates.std(axis0) print(估计偏差:, bias) print(经验标准差:, emp_std) print(理论标准差:, std_beta) # 第3.3节计算的 std_beta如果 bias 绝对值小于 0.01说明你的代码逻辑无误。如果偏差明显多半是设计矩阵构造错了而不是随机波动。这个流程能让你在用真实数据前就把黑匣子拆开。真实样本不足时可以用残差自举。把拟合残差有放回地重采样加到拟合值上得到新的响应重新拟合并积累参数。这样能给出参数经验分布尤其适合现场无法重复实验的场景。有一次我在现场标定忽视了 x 变量的误差实际 x 是目测读数的导致整个标定结果被客户质疑。后来我用蒙特卡洛模拟把 x 误差也加进去才看清普通最小二乘的估计偏差。工具最终是辅助前提假设要自己检查。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Python 读取 SQLite 数据:TaoToken 统一 Key 接入与 settings.json 配置骨架 2026/9/26 13:39:47

Python 读取 SQLite 数据:TaoToken 统一 Key 接入与 settings.json 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
昇腾 Atlas 300V 部署 YOLO 实战:从 ONNX 转换到推理调优 2026/9/26 13:39:47

昇腾 Atlas 300V 部署 YOLO 实战:从 ONNX 转换到推理调优

先说结论:Atlas 300V 24G 确实是运算加速卡,但它不是显卡,更不是拿来打游戏、跑 CUDA 的那类卡。很多人第一次看到“24G”这个数字,第一反应都是“那我是不是能直接用它跑大模型了?”,实际拿到手才会发现&a…

阅读更多 →
libcurl与OpenSSL开发库配置指南:32位和64位选型、编译与排错 2026/9/26 13:39:41

libcurl与OpenSSL开发库配置指南:32位和64位选型、编译与排错

简介:这份资源面向需要在 Windows 平台进行 HTTPS 网络通信开发的 C/C 程序员,提供实测可用的 libcurl 与 OpenSSL 动态开发库,同时包含 32 位与 64 位两个版本,可解决跨架构编译时库文件不匹配、链接失败等常见问题。压缩包共 34…

阅读更多 →
treg 与 OpenRouter、MCP 协议:CLI Agent 工具链调度实战指南 2026/9/26 13:39:41

treg 与 OpenRouter、MCP 协议:CLI Agent 工具链调度实战指南

1. 从 "treg" 这个标题说起:一个被低估的 CLI Agent 工具链第一次看到 "treg" 这个词,很多人会以为是某个库的缩写或者拼写错误。但如果你最近在折腾 AI Agent 相关的命令行工具,尤其是围绕 OpenRouter、MCP 协议、Codex…

阅读更多 →
SpringBoot+SSM课堂教学实时评价系统毕业设计实战解析 2026/9/26 13:39:41

SpringBoot+SSM课堂教学实时评价系统毕业设计实战解析

一直有朋友问我,毕业设计选“课堂教学效果实时评价系统”这类题目到底怎么落地,尤其题目里还带了SpringBoot和SSM两个关键词,代码倒是能跑,但一写论文就不知道从哪下笔。我今年刚好完整跟了一个类似的系统,从前期的需求…

阅读更多 →
claude cli 配 TaoToken 后 cc switch 报 There is an issue with the selected model 的排查与配置修正 2026/9/26 13:39:40

claude cli 配 TaoToken 后 cc switch 报 There is an issue with the selected model 的排查与配置修正

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉