最小二乘:Python

时间:2017-10-11 13:31:59

标签: python python-3.x numpy least-squares

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

我有:$ 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]

第一种方法:

enter image description here

第二种方法:

enter image description here

你知道为什么第一种方法对于大多项式有分歧吗?

P.S。我只添加了#34;导入numpy作为np"为了您的方便,如果您想测试这些功能。

2 个答案:

答案 0 :(得分:4)

这里有三点:

一个是通常更好(更快,更准确)来求解线性方程而不是计算逆。

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

第三个更具体地说是多项式。当使用单项式作为基础时,最终可能会得到一个非常差的条件系数矩阵,这意味着数值误差往往很大。这是因为,例如,矢量x-> pow(x,11)和x-> pow(x,12)非常接近平行。如果要使用正交多项式的基础,您将获得更准确的拟合,并且能够使用更高的度数,例如https://en.wikipedia.org/wiki/Chebyshev_polynomialshttps://en.wikipedia.org/wiki/Legendre_polynomials

答案 1 :(得分:0)

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

如果矩阵的排名很低,你可以在条件下进行改进,正如我在另一篇文章中所做的那样。其他部分可能是由于载体的平滑特性。