algorithm - 需要精确的最小二乘拟合算法

标签 algorithm least-squares

我已经尝试了两种实现最小二乘拟合 (LSF) 算法的方法,如图 here .

第一个代码只是教科书方法,如 Wolfram 在 LSF 上的页面所述。第二个代码重新排列方程式以最小化机器错误。这两种代码对我的数据产生相似的结果。我将这些结果与 Matlab 的 p=polyfit(x,y,1) 函数进行了比较,使用相关系数来衡量拟合的“优度”并比较了 3 个例程中的每一个。我观察到虽然所有 3 种方法都产生了良好的结果,但至少对于我的数据而言,Matlab 的例程最适合(其他 2 种例程彼此具有相似的结果)。

Matlab 的 p=polyfit(x,y,1) 函数使用 Vandermonde 矩阵、V(n x 2 矩阵)和 QR 因式分解来解决最小二乘问题。在 Matlab 代码中,它看起来像:

V = [x1,1; x2,1; x3,1; ... xn,1]  % this line is pseudo-code
[Q,R] = qr(V,0);
p = R\(Q'*y);      % performs same as p = V\y

我不是数学家,所以我不明白为什么会更准确。尽管差异很小,但在我的例子中,我需要从 LSF 中获取斜率并将其乘以一个大数,因此精度的任何提高都会显示在我的结果中。

由于我无法进入的原因,我无法在工作中使用Matlab的例程。所以,我想知道是否有人有我可以使用的更准确的基于方程的方法建议,它是对上述两种方法的改进,在舍入误差/机器精度/等方面。

任何评论表示赞赏!提前致谢。

最佳答案

对于多项式拟合,您可以创建 Vandermonde矩阵并求解线性系统,正如您已经完成的那样。

另一种解决方案是使用类似 Gauss-Newton 的方法来拟合数据(因为系统是线性的,一次迭代就可以了)。方法之间存在差异。一个可能的原因是 Runge's phenomenon .

关于algorithm - 需要精确的最小二乘拟合算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4328642/

相关文章:

algorithm - 算法在最坏情况下的运行时间

algorithm - 划分整数集

algorithm - 什么更大 : O(mn) OR O((m^2)/n)?

python - 用 numpy 最小二乘法拟合线性表面

python - python中的多元曲线拟合用于估计椭圆形状的参数和阶数

Python:具有非线性最小二乘的双曲线高斯拟合

algorithm - 以最有效的方式将几个预先排序的列表合并到一个联合列表中(并获取其中的顶部元素)

为图表选择代表性样本的算法

opencv - 为什么直接线性变换 (DLT) 不能给出最佳的相机外部参数?

python - 如何使用 scipy.optimize.least_squares 计算标准偏差误差