我已经尝试了实现here显示的最小二乘拟合(LSF)算法的两种方法。
第一个代码就是教科书方法,正如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的例程。所以,我想知道是否有人有更准确的基于方程的方法建议我可以使用这是对上述两种方法的改进,在舍入误差/机器精度等方面。
任何评论都表示赞赏!提前谢谢。
答案 0 :(得分:0)
对于多项式拟合,您可以像现在一样创建Vandermonde矩阵并求解线性系统。
另一个解决方案是使用像Gauss-Newton这样的方法来拟合数据(因为系统是线性的,一次迭代应该没问题)。这些方法之间存在差异。一个可能的原因是Runge's phenomenon。