메인 콘텐츠로 건너뛰기
W&B는 여러 유형의 평활화를 지원합니다: 대화형 W&B 리포트에서 이러한 기능을 실시간으로 확인해 보세요.
다양한 평활화 알고리즘 데모

시간 가중 지수 이동 평균(TWEMA) 스무딩 (기본값)

시간 가중 지수 이동 평균(Time Weighted Exponential Moving Average, TWEMA) 스무딩 알고리즘은 이전 포인트의 가중치를 지수적으로 감소시키는 방식으로 시계열 데이터를 스무딩하는 기법입니다. 기법에 대한 자세한 내용은 Exponential Smoothing을 참조하세요. 범위는 0에서 1 사이입니다. 시계열의 초기 값들이 0 쪽으로 치우치지 않도록 편향 제거(de-bias) 항이 추가되어 있습니다. 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 값의 앞뒤 구간에 있는 포인트들의 평균으로 해당 포인트를 대체하는 스무딩 알고리즘입니다. 자세한 내용은 위키피디아의 “Boxcar Filter”를 참고하세요. 이동 평균에 대해 선택한 파라미터는 이동 평균에서 고려할 포인트 개수를 Weights & Biases에 알려 줍니다. x축에서 포인트 간 간격이 고르지 않다면 대신 Gaussian Smoothing을 사용하는 것을 고려하세요. 앱에서 확인하면 다음과 같이 표시됩니다:
이동 평균 스무딩 데모

지수 이동 평균(EMA) 스무딩

지수 이동 평균(EMA) 스무딩 알고리즘은 지수 창 함수(exponential window function)를 사용해 시계열 데이터를 스무딩하는 경험적 기법입니다. 이 기법에 대한 자세한 내용은 Exponential Smoothing을 참조하세요. 값의 범위는 0에서 1 사이입니다. 시계열의 초기 값들이 0 쪽으로 치우치지 않도록 편향 보정(debias) 항을 추가합니다. 많은 경우 EMA 스무딩은 먼저 버킷팅을 한 뒤에 적용하는 대신, 전체 히스토리를 한 번에 훑으면서 적용합니다. 이렇게 하면 더 정확한 스무딩이 되는 경우가 많습니다. 다음과 같은 상황에서는 EMA 스무딩이 버킷팅 이후에 적용됩니다:
  • 샘플링
  • 그룹화
  • 식(Expressions)
  • 단조가 아닌 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을 클릭하세요.
Turn on or off original data