メインコンテンツへスキップ
W&B は複数のタイプのスムージングをサポートしています。 これらが実際にどのように機能するかは、インタラクティブな W&B レポートで確認できます。
さまざまなスムージング アルゴリズムのデモ

時間加重指数移動平均 (TWEMA) スムージング (デフォルト)

時間加重指数移動平均 (TWEMA) スムージングアルゴリズムは、過去の点の重みを指数関数的に減衰させることで、時系列データを平滑化する手法です。この手法の詳細については、Exponential Smoothingを参照してください。範囲は 0 から 1 です。また、時系列の初期値が 0 に偏らないよう、デバイアス項が追加されています。 TWEMA アルゴリズムは、線上の点の密度 (x軸上の範囲の単位あたりの y 値の数) を考慮します。これにより、特性の異なる複数の線を同時に表示する場合でも、一貫したスムージングを行えます。 この仕組みの内部動作を示すサンプルコードを以下に示します。
const smoothingWeight = Math.min(Math.sqrt(smoothingParam || 0), 0.999);
let lastY = yValues.length > 0 ? 0 : NaN;
let debiasWeight = 0;

return yValues.map((yPoint, index) => {
  const prevX = index > 0 ? index - 1 : 0;
  // VIEWPORT_SCALE はチャートのx軸の範囲に合わせて結果をスケーリングする
  const changeInX =
    ((xValues[index] - xValues[prevX]) / rangeOfX) * VIEWPORT_SCALE;
  const smoothingWeightAdj = Math.pow(smoothingWeight, changeInX);

  lastY = lastY * smoothingWeightAdj + yPoint;
  debiasWeight = debiasWeight * smoothingWeightAdj + 1;
  return lastY / debiasWeight;
});
アプリでは次のようになります (アプリ内) :
TWEMAスムージングのデモ

ガウススムージング

ガウススムージング (またはガウスカーネルスムージング) では、各点の加重平均を計算します。重みには、スムージングパラメーターとして指定した標準偏差を持つガウス分布を用います。スムージング後の値は、各入力 x 値について、その前後にある点に基づいて計算されます。 これはアプリ内では次のように表示されます。
ガウススムージングのデモ

移動平均スムージング

移動平均は、指定した x 値の前後にある一定範囲内の点の平均値で、その点を置き換えるスムージングアルゴリズムです。詳しくは Wikipedia の「Boxcar Filter」 を参照してください。移動平均で選択するパラメーターは、移動平均の計算で考慮する点の数を W&B に指定します。 点が x 軸上で不均一に配置されている場合は、代わりに ガウススムージング を使用することを検討してください。 これはアプリ内では次のように表示されます。
移動平均スムージングのデモ

指数移動平均 (EMA) スムージング

指数移動平均 (EMA) スムージングアルゴリズムは、指数ウィンドウ関数を使って時系列データを平滑化する経験則的な手法です。この手法の詳細については、Exponential Smoothingを参照してください。範囲は 0 から 1 です。時系列の初期の値がゼロ方向に偏らないよう、デバイアス項が追加されます。 多くの場合、EMA スムージングは、先にバケット化してからスムージングするのではなく、履歴全体を走査して適用されます。この方法のほうが、より正確なスムージング結果が得られることがよくあります。 ただし、次のような場合は、EMA スムージングは代わりにバケット化の後に適用されます。
  • サンプリング
  • グループ化
  • 非単調な x 軸
  • 時間ベースの x 軸
以下は、この仕組みが内部でどのように動作するかを示すサンプルコードです。
  data.forEach(d => {
    const nextVal = d;
    last = last * smoothingWeight + (1 - smoothingWeight) * nextVal;
    numAccum++;
    debiasWeight = 1.0 - Math.pow(smoothingWeight, numAccum);
    smoothedData.push(last / debiasWeight);
アプリではこのように表示されます:
EMAスムージングのデモ

元のデータを非表示

デフォルトでは、スムージングされていない元のデータが、背景に薄い線としてプロットに表示されます。これを非表示にするには、Show Original をクリックします。
元のデータの表示と非表示を切り替える