1. 从“无解”到“最优解”:为什么我们需要最小二乘法?
咱们搞技术的,尤其是做算法、数据分析或者搞硬件建模的朋友,肯定都遇到过这种头疼事儿:辛辛苦苦建了一堆方程,想要求解几个关键参数,结果一算,发现方程的数量比未知数还多,直接“无解”了。这感觉就像你拿着10把不同的尺子去量同一张桌子的长度,每把尺子给出的读数都略有不同,你该信哪个?这时候,最小二乘法就像一位经验丰富的裁判,它不是简单地宣布“比赛无效”,而是帮你从这些互相矛盾的数据里,找出一个让所有人都“最服气”的答案——那个最优的近似解。
我刚开始接触这个问题时,也犯过迷糊。比如在做传感器数据融合的时候,多个传感器对同一个物理量(比如温度)进行测量,每个传感器都有误差,得到的方程数(测量次数)自然就多于未知数(真实的温度值)。直接解方程组是行不通的,但你又不能随便扔掉一些数据。最小二乘法的核心思想就特别接地气:我不强求每个方程都严格成立,但我要求所有方程的“残差”(就是预测值和观测值之间的差距)的平方和最小。这个“平方和最小”就是“最优”的数学定义,它意味着整体误差被控制在了最小的范围内。
所以,这篇文章不是来给你推导一堆吓人的数学公式的。我想做的,是把我这十多年在AI模型调优和智能硬件参数标定中,用最小二乘法踩过的坑、总结的实战策略,用最直白的话分享给你。我们会从最基础的线性方程组开始,讲到齐次方程那个“讨厌”的尺度模糊问题,最后攻坚非线性的复杂场景。你会发现,从numpy.linalg.lstsq的一行代码,到需要小心翼翼调参的列文伯格-马夸尔特算法,背后都是一脉相承的“最优”思想。准备好了吗?我们这就开始,一步步把这个强大的工具变成你工具箱里最趁手的那一个。
2. 线性方程组最小二乘解:三种方法,我该选哪个?
线性场景是最常见,也是最基本的。我们把问题写成标准的矩阵形式 Ax = y。这里的 A 是系数矩阵(比如你的实验条件或特征),x 是待求的参数向量,y 是你的观测结果。当方程数 p 大于未知数 q 时,经典的“超定方程组”就来了。
2.1 核心思路:让误差的平方和最小
既然不能精确满足所有方程,我们就定义一个误差函数 E(x) = ||Ax - y||²。这个竖线双杠表示向量的2-范数,其实就是所有分量差的平方和。最小二乘解 x* 的任务,就是找到那个让 E(x) 最小的 x。
数学上,这个解可以通过令梯度为零推导出来,得到那个著名的正规方程:(AᵀA) x* = Aᵀy。你看,这里的关键矩阵变成了 AᵀA,它是一个 q x q 的方阵(q是未知数个数)。只要 A 的列是满秩的(即特征之间不线性相关),AᵀA 就是可逆的,解可以直接写为:x = (AᵀA)⁻¹ Aᵀy*。
2.2 实战中的三种解法与选择
理论很优美,但落到代码和实际计算上,我们有几条路可以走。原始文章提到了三种方法,这里我结合自己的经验展开说说。
方法一:直接求逆法 就是严格按照公式 x = (AᵀA)⁻¹ Aᵀy* 来算。在Python里,你可能会忍不住这么写:
import numpy as np
x_star = np.linalg.inv(A.T @ A) @ (A.T @ y)
为什么不推荐? 原因有两个。第一,计算矩阵的逆本身是一个计算复杂度很高(O(n³))且数值不稳定的操作。特别是当 A 的条件数很大(即矩阵接近奇异)时,求逆会放大误差,结果可能严重失真。第二,多此一举。我们最终目的是解方

3815

被折叠的 条评论
为什么被折叠?



