메인 콘텐츠로 건너뛰기
W&B는 여러 유형의 스무딩을 지원합니다. 이 기능들은 대화형 W&B report에서 직접 확인할 수 있습니다.
여러 스무딩 알고리즘의 데모

시간 가중 지수 이동 평균(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 and Biases가 고려할 포인트 개수를 지정합니다. 포인트들이 x축 상에서 고르게 간격을 두고 배치되어 있지 않다면, 대신 가우시안 스무딩(Gaussian Smoothing)을 사용하는 것이 좋습니다. 앱에서 확인하면 다음과 같습니다:
러닝 평균 스무딩 데모

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

지수 이동 평균(Exponential Moving Average, EMA) 스무딩 알고리즘은 지수 윈도우 함수(exponential window function)를 사용해 시계열 데이터를 스무딩하는 경험적 기법입니다. 기법에 대한 자세한 내용은 Exponential Smoothing을 참고하세요. 값의 범위는 0에서 1입니다. 시계열의 초반 값들이 0으로 치우치지 않도록 편향 보정 항(debias term)이 추가됩니다. 많은 경우 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 버튼을 클릭하세요.
원본 데이터 표시 켜기 또는 끄기