我正在尝试实现最小二乘:
我有:$ 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。我只添加了#34;导入numpy作为np"为了您的方便,如果您想测试这些功能。
答案 0 :(得分:4)
这里有三点:
一个是通常更好(更快,更准确)来求解线性方程而不是计算逆。
第二个是在计算解决方案时使用你对方程组的知识(例如系数矩阵是正定的)总是一个好主意,在这种情况下你应该使用numpy.linalg.lstsq
第三个更具体地说是多项式。当使用单项式作为基础时,最终可能会得到一个非常差的条件系数矩阵,这意味着数值误差往往很大。这是因为,例如,矢量x-> pow(x,11)和x-> pow(x,12)非常接近平行。如果要使用正交多项式的基础,您将获得更准确的拟合,并且能够使用更高的度数,例如https://en.wikipedia.org/wiki/Chebyshev_polynomials或https://en.wikipedia.org/wiki/Legendre_polynomials
答案 1 :(得分:0)
我将改进以前的说法。我回答了这个yesterday. 高阶多项式的问题就是龙格现象。人们采用被称为Hermite多项式的正交多项式的原因是,当傅立叶级数方法应用于非周期性信号时,他们试图摆脱Gibbs phenomenon这是一种不利的振荡效应。
如果矩阵的排名很低,你可以在条件下进行改进,正如我在另一篇文章中所做的那样。其他部分可能是由于载体的平滑特性。