7

システム パフォーマンス データを測定してデータベースに保存しています。これらのデータ ポイントから、時間をかけて折れ線グラフを描いています。その性質上、これらのデータ ポイントには少しノイズがあります。すべての点が局所平均値から少なくとも少しずれています。折れ線グラフをある点から次の点までまっすぐに描くと、ギザギザのグラフが生成されます。1 ピクセルあたり > 10 データ ポイントのような大きな時間スケールでは、このノイズは幅の狭いギザギザの線領域に圧縮されます。たとえば、小さいスケールの場合のように 1 ピクセルではなく 20 ピクセルの高さになります。

ラインのスムージング、アンチエイリアシング、単純化などについて読んだことがあります。しかし、私が見つけたものはすべて、何か他のものについてのもののようです.

アンチエイリアシングは必要ありません。.NET は、画面上に線を描画するときに既にアンチエイリアシングを行っています。

私は単純化を望んでいません。極端な値を表示したままにしておく必要があります。少なくともそれらのほとんどです。

スプライン曲線の方向に進んでいると思いますが、説明されているものが私が望むものであるかどうかを評価するためのサンプル画像はあまり見つかりませんでした. Google ブックスで非常に科学的な本を見つけましたが、半ページの数式でいっぱいで、今は読み通すのが好きではありませんでした...

例として、Linux/Gnome のシステム モニター アプリケーションを見てみましょう。最近の CPU / メモリ / ネットワークの使用状況を滑らかな線で描画します。これは少し単純化しすぎているかもしれませんが、試してみて、微調整できるかどうかを確認してください。

私は C# コードを好みますが、外部参照なしで C# に移植できる限り、アルゴリズムや他の言語のコードも問題ありません。

4

5 に答える 5

6

データの平滑化を行うことができます。実際のデータを使用する代わりに、Savitzky-Golayfilterのようにピークを維持する単純な平滑化アルゴリズムを適用します。

ここで係数を取得できます

最も簡単な方法は次のとおりです。

私がリンクしたウェブサイトから上位の係数を取得します。

// For np = 5 = 5 data points
var h = 35.0;
var coeff = new float[] { 17, 12, -3 }; // coefficients from the site
var easyCoeff = new float[] {-3, 12, 17, 12, -3}; // Its symmetrical
var center = 2; // = the center of the easyCoeff array

//ここで、データのすべてのポイントについて、平滑化されたポイントを計算します。

smoothed[x] = 
   ((data[x - 2] * easyCoeff[center - 2]) +
    (data[x - 1] * easyCoeff[center - 1]) +
    (data[x - 0] * easyCoeff[center - 0]) +
    (data[x + 1] * easyCoeff[center + 1]) +
    (data[x + 2] * easyCoeff[center + 2])) / h;

最初の2ポイントと最後の2ポイントは、5ポイントを使用するとスムーズにできません。

データをより「スムーズ」にしたい場合は、より大きなデータポイントを使用して係数を試すことができます。

これで、「平滑化された」データに線を引くことができます。np =ポイント数が大きいほど、データはスムーズになります。ただし、ピーク精度も低下しますが、いくつかのポイントを単純に平均化した場合はそれほどではありません。

于 2010-12-08T16:32:40.323 に答える
2

グラフィックス コードでこれを修正することはできません。データにノイズが多い場合、使用するライン スムージング アルゴリズムの種類に関係なく、グラフにもノイズが発生します。最初にデータをフィルタリングする必要があります。元のデータから補間された点を含む 2 番目のデータ セットを作成します。最小二乗法は一般的な手法です。平均化は簡単に実装できますが、極値を隠す傾向があります。

于 2010-12-08T16:04:29.140 に答える
1

あなたが探しているのは、「スプライン」を提供するルーチンだと思います。スプラインを説明するリンクは次のとおりです。

http://en.wikipedia.org/wiki/Spline_(数学)

その場合、スプライン ライブラリの推奨事項はありませんが、最初の Google 検索でたくさん見つかりました。

コードがなくて申し訳ありませんが、用語を知っていると検索に役立つことを願っています.

ボブ

于 2010-12-08T15:08:20.380 に答える
0

多くの場合、ネットワーク トラフィックのグラフでは加重平均が使用されます。1 秒に 1 回、長さ 10 の循環リストにサンプリングし、グラフの各サンプルで、サンプルの平均をグラフ化できます。

10個では足りない場合は、さらに多くを保存できます。平均をゼロから再計算する必要もありません。

new_average = (old_average*10 - replaced_sample + new_sample)/10

ただし、10 個すべてを保存したくない場合は、次のように概算できます。

new_average = old_average*9/10 + new_sample/10

多くのルーターは、これを使用してストレージを節約しています。これは、現在のトラフィック レートに向かって指数関数的に増加します。

これを実装する場合は、次のようにします。

new_average = old_average*min(9,number_of_samples)/10 + new_sample/10
number_of_samples++

最初のランプアップを回避します。また、タイマーは1 秒に 1 回正確に起動しないため、各サンプルの時間間隔を実際に反映するように 9/10、1/10 の比率を調整する必要があります。

于 2010-12-08T16:41:10.750 に答える
0

表示する前に MIN/MAX/AVG を使用して、データ ポイントの数を減らします。見栄えが良くなり、速くなります

于 2010-12-08T15:15:28.167 に答える