1

グラフ化する必要がある一連のデータ ポイントがいくつかあります。グラフごとに、エラーのためにいくつかのポイントを除外する必要がある場合があります。以下に例を示します。 代替テキスト

丸で囲まれた部分はデータのエラーです。

必要なのは、このデータをフィルタリングして、次のように悪い点を平らな線に置き換えることでエラーを排除するアルゴリズムです。

代替テキスト

エラーポイントの検出に特に優れたアルゴリズムはありますか? 私を正しい方向に向けるヒントはありますか?

編集: エラー ポイントは、両側のデータと一致していないように見えるポイントです。ジャンプ後のデータが一貫しているように見える限り、大きなジャンプが発生する可能性があります。グラフの端にある場合、大きなジャンプはおそらくエラーと見なされます。

4

2 に答える 2

2

これは一般的に解決するのが難しい問題です。最終的な解決策は、プロセスに大きく依存し、状況に固有のものになります。

そうは言っても、データを理解することから始める必要があります。あるサンプルから次のサンプルまで、どのような種類の変動が可能でしょうか? それを使用して、以前のデータ サンプル (およびおそらく将来のデータ サンプル) を使用して、現在のサンプルが偽物であるかどうかを判断できます。次に、次のようなフィルターになります。

    const int MaxQueueLength = 100;           // adjust these two values as necessary
    const double MaxProjectionError = 5;

    List<double> FilterData(List<double> rawData)
    {
        List<double> toRet = new List<double>(rawData.Count);
        Queue<double> history = new Queue<double>(MaxQueueLength); // adjust queue length as necessary
        foreach (double raw_Sample in rawData)
        {
            while (history.Count > MaxQueueLength)
                history.Dequeue();
            double ProjectedSample = GuessNext(history, raw_Sample);
            double CurrentSample = (Math.Abs(ProjectedSample - raw_Sample) > MaxProjectionError) ? ProjectedSample : raw_Sample;
            toRet.Add(CurrentSample);
            history.Enqueue(CurrentSample);
        }
        return toRet;
    }

魔法は、GuessNext 関数を考え出すことです。ここでは、自分の状況に固有の事柄について説明します。データを収集するプロセスについて知っていることをすべて考慮する必要があります。入力が変化する速度に物理的な制限はありますか? データに、簡単にフィルタリングできる既知の悪い値がありますか?

これは、データの 1 次導関数に基づいて機能する GuessNext 関数の簡単な例です (つまり、データの小さな部分だけを見ると、データはほぼ直線であると想定されます)。

double lastSample = double.NaN;
double GuessNext(Queue<double> history, double nextSample)
{
    lastSample = double.IsNaN(lastSample) ? nextSample : lastSample;
    //ignore the history for simple first derivative.  Assume that input will always approximate a straight line
    double toRet = (nextSample + (nextSample - lastSample));
    lastSample = nextSample;
    return toRet;
}

データに特にノイズが多い場合は、GuessNext に渡す前に平滑化フィルターを適用することをお勧めします。データにとって意味のあるものを考え出すには、アルゴリズムに少し時間を費やす必要があります。

サンプル データは、各サンプルが X 値と Y 値の両方を定義するという点でパラメトリックに見えます。上記のロジックを各ディメンションに個別に適用できる場合があります。これは、1 つのディメンションだけが悪い数値を与える場合に適しています。これは、たとえば、1 つのディメンションがタイムスタンプであり、タイムスタンプが時折偽物である場合に特に成功する可能性があります。

于 2010-09-17T20:58:06.397 に答える
0

外れ値を目視で除去できない場合は、 http://www.ipf.tuwien.ac.at/cb/publications/pipeline.pdf のようにクリギング (エラー項を使用) を試してください。これは、時折の極端なノイズを自動的に処理するのに非常にうまく機能しているようです。私は、フランスの気象学者がそのようなアプローチを使用して、データの異常値を除去していることを知っています (たとえば、温度センサーの横にある火災や、風センサーを蹴る何かなど)。

一般的に難しい問題ですのでご注意ください。エラーに関する情報は貴重です。誰かが測定器を蹴った?その場合、問題のあるデータを手動で削除する以外に、多くのことを行うことはできません。あなたのノイズは体系的ですか?それについて(合理的な)仮説を立てることで、多くのことができます。

于 2010-09-17T21:20:01.037 に答える