글목록

2021년 5월 3일

Module 5. Savitzky-Golay smoothing - (1)시작하며

측정된 데이터에는 여러가지 이유로 인해 노이즈가 존재하게 됩니다. 전자기 신호에서는 측정기, 간섭 등에 의한 노이즈가 있겠고, 분석 데이터나 공정 데이터 등에서도 많은 노이즈가 존재합니다.

이러한 노이즈가 많은 상태라면, 여러 조건에서 측정된 데이터를 중첩해서 볼 때, 서로 구분되지 않아 어떠한 관계가 있는지 쉽게 파악하기가 어렵습니다. 따라서, 불필요한 노이즈를 최소화하기 위해 다양한 노이즈 제거 방법, 즉, 데이터를 매끄럽게 만드는 기법(smoothing)들이 개발되었습니다. Matlab과 같은 공학 소프트웨어에서는 패키지로 제작되어 있겠지만, 엑셀에는 그런 것들이 없습니다. 그나마 제공하는 것이 이동평균(moving average)을 구하는 것이 전부입니다.

Smoothing 기법에 대해서는 위키백과를 참조하시면 다양한 기법을 알 수 있습니다.

https://en.wikipedia.org/wiki/Smoothing

Smoothing 기법의 기본 개념은 크게 인접한 값에 가중치를 곱하여 평균을 내는 방법과, 앞의 데이터들에 대한 연장선을 긋는 방법으로 나눌 수 있습니다.

첫번째 방법은 가중치 함수를 어떻게 정의하느냐에 따라 이름이 달라집니다. 예를 들어, 인접한 몇개의 데이터에 대해 산술 평균을 낸다고 하면, 일정 구간의 가중치는 1이고, 나머지 구간은 0인 가중치 함수를 적용한 것입니다. 만약, Gaussian 함수를 가중치 함수로 적용한다면, Fast Fourier Transform filter가 됩니다. 이러한 기법은 Convolution 방법이 되며, 필터의 폭이 넓어질수록 계산량이 많아집니다. 단 Gaussian 필터는 특별히 푸리에 변환을 수반하기 때문에 일반적인 가중치 함수를 곱하는 방법과는 계산 알고리즘이 많이 다릅니다.

어쨋거나, Convolution 기법을 이용할 때, 가중치 함수의 폭이 넓어질수록 함수가 매끄러워지는 경향이 있으며, 데이터의 측정 방향과 무관하게 대칭적이라는 장점은 있으나, 측정된 데이터의 양쪽 끝에 대해서는 가중치 함수 폭의 1/2에 해당하는 구간만큼 오류가 발생되며, 신뢰할 수 없는 결과를 얻게 됩니다.


두번째 방법으로는 이전 데이터에 대한 연장선을 긋는 방법으로, 데이터 양쪽 끝에 대해서도 smoothing 된 데이터를 얻을 수 있다는 장점은 있으나, 동일한 데이터를 가지고 역방향으로 smoothing을 한 결과와 일치하지 않습니다. 대표적인 방법이 엑셀에서도 제공하는 이동평균선(moving average)입니다. 주식 차트에서 1일, 1주일, 3개월, 1년... 주기의 변동선 역시 과거의 데이터로부터 연장선을 그어주는 이동 평균선의 일종입니다.

이동평균선은 향후 예측값이 과거의 어느시간까지 영향을 받을것인지, 영향이 선형적으로 영향을 받을지, 혹은 비선형적으로 영향을 받을지에 따라 역시 가중치 함수를 지정해줄 수 있고, 이 가중치 함수에 따라 예측선이 달라집니다. 또한, 영향을 받는 기간을 얼마나 길게 하느냐에 따라, 예측값이 실측값과 터무니없어지는 경우도 있습니다. 주식 차트의 3년 단위 예측선으로 당장 1주일 후의 주가를 예측한다면, 전혀 맞지 않는 것과 같습니다.

위의 2가지 smoothing 기법은, 과거의 측정값만으로 예측해야한다거나, 미래가 현재나 과거에 영향을 줄 수 없다는 기본적인 원리에 입각해서 단방향 smoothing을 해야하는 경우가 있는 반면, 표면의 형상과 같이 시간적인 전/후 관계가 없이 양방향으로 대칭적인 데이터인 경우, 양방향 smoothing을 합니다. 2가지 모두, 시간, 공간적으로 충분히 먼 거리에 있는 데이터가 서로 영향을 주지 않는다는 전제로 가중치 함수를 설계하면 되는 것이지요.


이번에 소개드릴 Savitzky-Golay smoothing은 위의 2가지 범주로 구분하기에는 애매한 기법입니다. 기본 개념은 전체 데이터 중 일정 구간의 데이터로 잘라낸 후, 다항식으로 fitting하고, 해당 지점의 근사값을 구해서 연결하는 방식이 됩니다. 만약 다항식의 차수를 0으로 한다면, 평균이 되고, 1차식으로 하게 되면, 각 구간을 1차식으로 fitting한 근사값을 찾아내는 것입니다. 따라서, 0차식의 Savitzky-Golay smoothing은 가중치 방법의 일종이 되지만, 1차식 이상에서는 어떤 방법에도 속하지 않게 됩니다. 또한, 이 Savitzky-Golay smoothing의 가장 큰 장점이라면, 1차식 이상의 다항식으로 smoothing 과정에서 자동으로 평균 기울기(1차 미분), 2차 미분.. 값을 한꺼번에 구할 수 있다는 점입니다. 

자세한 설명은 위키백과(Savitzky-Golay filter)를 참고하시기 바랍니다. 혹은 https://angeloyeo.github.io/2020/10/21/Savitzky_Golay.html에도 있으니 읽어보시면 개념 정리가 될 것 같습니다.


Savitzky-Golay smoothing은 결국, 일정 구간의 다항식 fitting만 계산할 수 있다면, 엑셀에서도 쉽게 구현이 가능합니다. 따라서, 앞에서 작성한 다항식 fitting 매크로를 약간만 수정하면 노이즈를 쉽게 제거할 수 있습니다.


위의 그림은 엑셀에서 노이즈가 없는 원본 데이터에 임의로 노이즈를 포함한 데이터를 생성하고, Savitzky-Golay smoothing으로 얻은 곡선을 중첩시켜 그린 그래프입니다. Smoothing을 위한 구간을 앞/뒤 25개 데이터인 경우(녹색선)보다, 50개 데이터로 smoothing한 결과(황색선)가 약간 더 매끄러워지는 것을 알 수 있습니다만, 대신 전체 데이터의 양 끝은 그만큼 손실되니, 적정한 필터 크기는 사용자가 조정해야합니다.

참고로, 굳이 이 방법을 먼저 설명드리는 것은.... 단지 다항식 fitting 매크로를 먼저 만들었기 때문이며, Savitzky-Golay filter가 다른 smoothing filter보다 공학/과학적으로 우수해서는 아님을 밝힙니다. 향후에 시간이 되면, FFT 필터, moving average법도 소개하도록 하겠습니다.


ps. Savitzky-Golay smoothing 또는 filter로 검색해보면, 여기서 소개해드리는 소스 코드보다 매우 간단하고 간결하게 나올 것입니다. 통상 이러한 필터링을 거치는 데이터들의 측정 간격(X 데이터 사이의 거리)이 일정한 데이터들에 대해 빠르게 계산하기 위한 경우가 많고, Smoothing에 필요한 데이터 폭이 크지 않기 때문입니다.

사용자들마다 약간의 오차를 감안하더라도 간결하고, 빠른 알고리즘이 필요하신 분들이 있겠고, 이러한 소스 코드들은 구글 검색으로 쉽게 얻으실 수 있습니다. 여기에서 소개해드리는 코드는 X값의 간격이 일정하지 않고, 필터 폭을 원하는대로 설정할 수 있도록 만들다보니 코드가 조금 복잡할 수 있습니다. 그러다보니.. 당연히 연산에 필요한 시간도 더 소요될 수 있음을 감안해서 봐주시가 바랍니다.

댓글 없음:

댓글 쓰기

의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~

많이 본 글 :