hereと表示されている最小二乗適合(LSF)アルゴリズムを実装する2つの方法を試しました。正確な最小二乗フィットアルゴリズムが必要
最初のコードは、LSFのWolframのページで説明されているように、単にテキストブックの手法です。 2番目のコードは、機械誤差を最小限に抑えるために方程式を再配置します。どちらのコードも私のデータに似た結果をもたらします。私はこれらの結果をMatlabのp = polyfit(x、y、1)関数と比較し、相関係数を使ってフィッティングの「良さ」を測定し、3つのルーチンをそれぞれ比較しました。私は3つの方法すべてが良い結果を生み出しましたが、少なくとも私のデータではMatlabのルーチンが最良の適合性を持っていました(他の2つのルーチンはお互いに同様の結果を出していました)。
Matlabのp = polyfit(x、y、1)関数は、最小二乗問題を解くためにVandermonde行列、V(n×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のルーチンを使うことができません。だから、誰かがより正確な方程式に基づいたアプローチの推奨があるのだろうかと思っています。それは、上記の2つのアプローチよりも丸め誤差/機械の精度などの改善点です。
コメントありがとうございます。前もって感謝します。
QRは方程式系を安定的に解く方法です。あなたのデータが縮退に近づいているならば、SVDはおそらくより良い方法です(計算上は高価ですが)。あなたが示したように、最小二乗問題は決して素朴に扱われるべきではありません。 –