最小二乘: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 中所做的那样。其他部分可能是由于矢量的平滑特性。
我正在尝试实现最小二乘法:
我有:$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 中所做的那样。其他部分可能是由于矢量的平滑特性。