3

おそらく簡単な質問ですが、今のところ簡単な解決策を見つけることができませんでした。私は非常に特殊なユースケースのための単純な画像認識ソフトウェアに取り組んでいます。

与えられているのは、おそらく直線上にある点の束です。ただし、一部のポイントが誤って配置され、線から離れています。特に線の端の近くでは、ポイントが多かれ少なかれ不正確になる可能性があります。

例:

   X            // this guy is off
         X      // this one even more
 X              // looks fine
 X
  X
      X         // a mistake in the middle
  X
     X          // another mistake, not as bad as the previous
   X
    X
   X
    X
         X      // we're off the line again

線の一般的な方向は既知であり、この場合は垂直です。この例の実際の線は、実際には垂直で、わずかに斜めに傾斜しています。

無限の線(つまり、勾配とオフセット)にのみ関心があり、端点の位置は重要ではありません。

追加情報(重要かどうかはわかりません)として、2つのポイントを水平に並べることはできません。例:

   X
   X
    X
   X X   // cannot happen
    X
     X

パフォーマンスは重要ではありません。私はC#で作業していますが、どの言語でも、一般的なアイデアでも問題ありません。

4

3 に答える 3

4

線形回帰を介して適合する最小二乗法を探していると思います

于 2011-04-19T10:55:40.773 に答える
3

マイクはぴったりです!以下を使用してください。

double[] xVals = {...};
double[] yVals = {...};

double xMean = 0;
double yMean = 0;
double Sxy = 0;
double Sxx = 0;
double beta0, beta1;
int i;

for (i = 0; i < xVals.Length; i++)
{
   xMean += xVals[i]/xVals.Length;
   yMean += yVals[i]/yVals.Length;
}

for (i = 0; i < xVals.Length; i++)
{
   Sxy += (xVals[i]-xMean)*(yVals[i]-yMean);
   Sxx += (xVals[i]-xMean)*(xVals[i]-xMean);
}

beta1 = Sxy/Sxx;
beta0 = yMean-beta1*xMean;

傾きとしてbeta1を使用し、y切片としてbeta0を使用してください。

于 2011-04-19T11:20:12.727 に答える
3

外れ値がないことがわかっている場合は、線形回帰(他の人が述べているように)が適しています。

外れ値がある場合、私のお気に入りの方法の1つは、中央値の中央値の線の方法です。http: //education.uncc.edu/droyster/courses/spring00/maed3103/Median-Median_Line.htm

基本的に、ポイントをX値で並べ替えてから、ポイントを3つの等しいサイズのグループ(最小値、中値、最大値)に分割します。最終的な勾配は、小グループの中央値と大グループの中央値を通る線の勾配です。中央値の中央値は、他の中央値とともに使用され、最終的なオフセット/切片を計算します。

これは、いくつかのグラフ電卓に見られる単純なアルゴリズムです。

3つの中央値を取ることにより、外れ値(左端、右端、上端、下端のいずれか)を完全に無視します。

下の画像は、2つの大きな外れ値を持つデータセットの線形回帰と中央値-中央値の線を示しています。

線形回帰と中央値-中央値

于 2011-04-20T05:58:02.130 に答える