以前は MATLAB を使用していましたが、私が提起した質問に対して、p = polyfit(x,y,1) を使用して、プレート内の散乱データに最適な線を推定できました。C++ でライン フィッティング アルゴリズムを実装するために、どのリソースを利用できるか疑問に思っていました。このテーマには多くのアルゴリズムがあることを理解しています。私にとって、アルゴリズムは高速である必要があり、その間、MATLAB で polyfit 関数の同等の精度を得ることができると期待しています。
7 に答える
ゼロからコーディングすることをお勧めします。これは、C++での非常に単純な実装です。polyfit
ここの式から直接、データから最小二乗近似の切片と勾配の両方をコード化できます(と同じ方法)。
http://en.wikipedia.org/wiki/Simple_linear_regression#Fitting_the_regression_line
これらは閉じた形式の数式であり、ループを使用して簡単に評価できます。より高度な近似を使用している場合は、行列ライブラリまたはより高度なアルゴリズムをお勧めしますが、上記で説明した単純な線形回帰の場合、必要なのはこれだけです。行列と線形代数のルーチンは、そのような問題にはやり過ぎでしょう(私の意見では)。
この実装を使用したり調べたりすることもできます。ここにはドキュメントもあります。
線に合わせるには、次のようにy=param[0]x+param[1]
します。
// loop over data:
{
sum_x += x[i];
sum_y += y[i];
sum_xy += x[i] * y[i];
sum_x2 += x[i] * x[i];
}
// means
double mean_x = sum_x / ninliers;
double mean_y = sum_y / ninliers;
float varx = sum_x2 - sum_x * mean_x;
float cov = sum_xy - sum_x * mean_y;
// ゼロ varx をチェック
param[0] = cov / varx;
param[1] = mean_y - param[0] * mean_x;
トピックの詳細http://easycalculation.com/statistics/learn-regression.php (数式は同じです。N を掛けて割っただけで、サンプル サイズです)。平面を 3D データに合わせたい場合は、同様のアプローチを使用します - http://www.mymathforum.com/viewtopic.php?f=13&t=8793
免責事項: すべての 2 次近似は線形であり、パラメーターのノイズを減らすという意味で最適です。ただし、代わりにデータのノイズを減らすことに関心があるかもしれません。外れ値はソリューションに大きな偏りを与える可能性があるため、無視することもできます。どちらの問題も RANSAC で解決できます。私の投稿を参照してください: