最小二乘:Python

Least Squares: Python

我正在尝试实现最小二乘法:

我有:$y=\theta\omega$

最小二乘解为\omega=(\theta^{T}\theta)^{-1}\theta^{T}y

我试过:

import numpy as np    
def least_squares1(y, tx):
        """calculate the least squares solution."""
        w = np.dot(np.linalg.inv(np.dot(tx.T,tx)), np.dot(tx.T,y))

        return w

问题是这个方法很快变得不稳定 (小问题没关系)

我意识到,当我将结果与这个最小二乘计算进行比较时:

 import numpy as np 
 def least_squares2(y, tx):
        """calculate the least squares solution."""
        a = tx.T.dot(tx)
        b = tx.T.dot(y)
        return np.linalg.solve(a, b)

比较两种方法: 我试图用 12 次多项式拟合数据 [1, x,x^2,x^3,x^4...,x^12]

第一种方法:

第二种方法:

你知道为什么第一种方法对大多项式发散吗?

P.S。如果您想测试功能,我只是为了方便您添加 "import numpy as np"。

这里有三点:

一个是求解线性方程通常比计算逆方程更好(更快、更准确)。

第二个是,在计算解时使用您对方程组的了解(例如,系数矩阵是正定的)总是一个好主意,在这种情况下您应该使用 numpy.linalg.lstsq

第三个更具体地讲多项式。当使用单项式作为基础时,您可能会得到条件非常差的系数矩阵,这意味着数值误差往往很大。这是因为,例如,向量 x->pow(x,11) 和 x->pow(x,12) 几乎是平行的。如果您要使用正交多项式的基础,例如 https://en.wikipedia.org/wiki/Chebyshev_polynomials or https://en.wikipedia.org/wiki/Legendre_polynomials

,您将获得更准确的拟合,并且能够使用更高的次数

我会在之前所说的基础上进行改进。我回答了这个 yesterday. 高阶多项式的问题称为龙格现象。人们之所以采用称为Hermite多项式的正交多项式的原因是他们试图摆脱Gibbs phenomenon,这是傅立叶级数方法应用于非周期信号时的不利振荡效应。

如果矩阵是低秩的,你有时可以在求助于正则化方法的条件下进行改进,就像我在另一个 post 中所做的那样。其他部分可能是由于矢量的平滑特性。