什么是最小二乘法
最小二乘法,英文叫Least Squares Method,是曲线拟合最常用的数学方法。它的核心思想很简单:让所有数据点到拟合曲线的偏差的平方和最小。
为什么要用偏差的平方和而不是偏差的和呢?因为偏差有正有负,直接加起来正负抵消了,看不出来总的偏差有多大。取平方之后都是正数,就不会抵消了。而且取平方比取绝对值在数学上更容易处理,求导什么的都方便。
数学推导(尽量通俗版)
假设我们要拟合一条直线 y = ax + b,有n个数据点(x₁,y₁), (x₂,y₂), ..., (xₙ,yₙ)。
每个数据点到拟合直线的偏差是:eᵢ = yᵢ - (axᵢ + b)
偏差平方和就是:S = Σeᵢ² = Σ[yᵢ - (axᵢ + b)]²
现在我们要找到让S最小的a和b。怎么找?对S分别关于a和b求偏导数,令其等于0,解方程组就行了。
∂S/∂a = -2Σxᵢ[yᵢ - (axᵢ + b)] = 0
∂S/∂b = -2Σ[yᵢ - (axᵢ + b)] = 0
化简之后就能得到a和b的公式。这个推导过程在教科书上都有,这里就不展开了。重要的是理解思路:让误差的平方和最小。
非线性拟合怎么办
上面说的是线性拟合的情况,那多项式拟合呢?其实多项式拟合本质上也是线性的,因为虽然x有高次项,但系数a是线性的,所以还是可以用最小二乘法直接求解。
真正麻烦的是指数拟合、对数拟合这种,系数不是线性的。这时候一般用迭代法,先给一个初始猜测值,然后逐步调整,直到误差足够小。常用的算法有高斯-牛顿法、Levenberg-Marquardt算法等。这些算法在曲线拟合App里都已经实现了,你不需要自己写代码。
加权最小二乘法
普通最小二乘法假设所有数据点的误差是等价的,但有时候不同数据点的测量精度不一样。比如有些数据是用精密仪器测的,有些是用普通仪器测的,那精密仪器测的数据显然更可靠,在拟合的时候应该给它更高的权重。
加权最小二乘法就是给每个数据点分配一个权重wᵢ,然后把目标函数变成:S = Σwᵢ[yᵢ - f(xᵢ)]²。权重越大,这个数据点在拟合中的影响力就越大。
实际应用中的注意事项
1. 最小二乘法对异常值很敏感,一个偏离很远的点就能把拟合结果拉偏。所以拟合之前先检查数据,去掉明显的异常值。
2. 数据点越多拟合越稳定,但也不是越多越好。关键是数据要有代表性,能覆盖你关心的范围。
3. 如果拟合结果不理想,可能不是最小二乘法的问题,而是你选的模型不对。换个模型试试可能就好了。