前面提到的多项式拟合方法都是有n个数据点,这个多项式就是n-1阶。就像下面这个链接里的“例子2:多项式插值”,求解Ab=y。此时A是一个可逆方阵。


YcoFlegs:[数值计算] 条件数zhuanlan.zhihu.com



1. Over-constrained System

但是如果已知数据存在误差,那么如果精确拟合反而会overfitting。此时可以刻意选择一个更小的多项式阶数,如果就用最简单的monomial basis的话,需要求解的问题变成







Python偏最小二乘法 python最小二乘拟合_#代码最小二乘法多项式拟合


其中


是已知数据的input x,


是参数向量,


是已知数据的output。


定义残差residual为



一种非常有效的优化方法是,最小二乘法:找到一组参数b,使得


最小,具体形式为:



最后第二行中间两项相等,是因为


,而且这个计算结果是个有理数



注意,此处因为


是b的二次函数,而且非负,所以必然存在最小值。但不一定是唯一解,比如


,与


无关。


最小化


等价于梯度为零




这组方程叫正规方程组 Normal equations

其中


奇异 当且仅当


是非满秩 rank-deficient矩阵(即,不是所有的列都是线性独立的)


在线性代数中,一个矩阵A 的列秩是 A 的线性无关的纵列的极大数目。类似地,行秩是 A 的线性无关的横行的极大数目。矩阵的列秩和行秩总是相等的,因此它们可以简单地称作矩阵 A 的秩。
wikipedia 秩 (线性代数)

因此理论上最后一步只需要把正规方程组左边的


移到等式右侧,即:



其中


被称为是 伪逆 Pseudoinverse,记作



这里有一个例子:

用11阶的多项式拟合50个samples的


(代码)


Python偏最小二乘法 python最小二乘拟合_Python偏最小二乘法_02

Credit to http://iacs-courses.seas.harvard.edu/courses/am205/schedule/


其中least sq.是调用np的库的结果,normal是用正则方程组求解的结果。

理论很美好,在小数据量的时候没问题,然而直接使用正规方程组求解会在数据量大(e.g. data size > 100)的时候不稳定numerically unstable。原因是 需要对


求逆,而A我们都知道是Vandermonde矩阵的一部分,本身就是poorly conditioned,而


只会更糟糕。解决的方法是使用QR分解,这也是Python MATLAB求解

线性最小二乘 问题的方法。

对动手操作感兴趣的可以看下这个作业题的第五题:

AM205: Assignment 1iacs-courses.seas.harvard.edu

题目大意是用三张不正常的图片去拟合一个线性模型,组合成右下角那个正常的图片。比较有趣的一点是,这里的A矩阵是一个3阶张量,而不是上面推导中的矩阵,因为图片有RGB 3层。但做起来思路是一样的,只不过把矩阵点乘和转置 换成 张量的点乘和转置。


Python偏最小二乘法 python最小二乘拟合_Python偏最小二乘法_03


2. Underdetermined System

和数据量大于参数量的情况相反,另一种情况是,参数量多于数据量,因此已知条件过少。


中的各个矩阵形状如下:


Python偏最小二乘法 python最小二乘拟合_方程组_04

Credit to http://iacs-courses.seas.harvard.edu/courses/am205/schedule/

同样是求解正规方程组


, 但此时因为此时



的rank最大为m(m<n),此时


一定奇异。


一种解决方法是 用拉格朗日乘子,


。注意这个和前面的Eq.4形式有细微的差别。此处的伪逆是


,满足


。因此被称为右逆right inverse,详细可以参考MIT OCW的线代note和video。

Lecture 33: Left and right inverses; pseudoinversocw.mit.edu

另一种简单一点的思路是 加正则项。目标函数现在是



其中




依旧是


的套路,此时结果是:



可以通过选择S的形式来满足


可逆。比如取



还是以函数



区间上为例,取5个点,然后拟合一个11阶的多项式。



Python偏最小二乘法 python最小二乘拟合_方程组_05

Credit to http://iacs-courses.seas.harvard.edu/courses/am205/schedule/

(拟合效果不错)



(条件数太大了)



Python偏最小二乘法 python最小二乘拟合_多项式_06

Credit to http://iacs-courses.seas.harvard.edu/courses/am205/schedule/

(拟合效果很差)



(条件数比较小)


  • :对高阶项的系数更多的惩罚


Python偏最小二乘法 python最小二乘拟合_拟合_07

Credit to http://iacs-courses.seas.harvard.edu/courses/am205/schedule/

(拟合效果很差)



(条件数也比较大小)


  • 拉格朗日乘子(突然冒出来)说,其实它的效果更好:


Python偏最小二乘法 python最小二乘拟合_多项式_08

Credit to http://iacs-courses.seas.harvard.edu/courses/am205/schedule/