IDL/Math

불규칙 분포 데이터를 규칙 격자화된 데이터로 만들기 [3]

이상우_IDL 2018. 1. 30. 00:52
728x90

IDL에서 불규칙 분포 데이터를 규칙 격자화된 데이터로 만들기 위하여 GRIDDATA 함수를 사용하는 방법 및 관련 예제를 지난 회에 이어서 계속 소개하도록 하겠습니다. 오늘은 GRIDDATA 함수에서 다항식 근사(Polynomial Regression 이하 PR로 칭함) 기법을 사용하는 방법 위주로 예제를 통하여 소개하고자 합니다.


그러면 지난 회와 마찬가지로 먼저 원본 데이터를 SCATTERPLOT 함수로 표출해놓고 시작하겠습니다. 가상의 원본 데이터를 생성하는 과정은 이전 게시물들의 초반부에 나와있으므로 여기서는 생략하고 바로 본론으로 들어가겠습니다. 다음과 같이 가로로 긴 그래픽창을 띄우고 원본 데이터부터 맨 좌측에 표출해둡니다.


win3 = WINDOW(DIMENSIONS=[300*4, 300], /NO_TOOLBAR, $

  WINDOW_TITLE='Polynomial Regression')

scp3 = SCATTERPLOT(x, y, SYMBOL='square', /SYM_FILLED, $

  SYM_SIZE=1.2, XRANGE=[0, 1], YRANGE=[0, 1], $

  RGB_TABLE=ct, MAGNITUDE=f>0<5, $

  XTICKLEN=0.001, YTICKLEN=0.001, $

  MARGIN=0, /CURRENT, LAYOUT=[4, 1, 1])



이제 PR 기법을 적용하여 규칙 격자화 처리를 거친 결과 데이터를 생성해서 원본 데이터 그림의 오른쪽 부분에 차례로 채워넣고자 합니다. PR 기법은 데이터 포인트의 전체적인 분포를 x, y로 구성된 다항식으로 근사하는 방식입니다. 지난 회에서 소개했던 RBF 기법의 경우 Spline 내삽을 기반으로 하였다고 한다면, PR 기법의 경우는 다항식 내삽을 기반으로 하였다고 보면 됩니다. GRIDDATA 함수에서는PR 기법을 적용하는데 있어서 차수(Power)가 1, 2, 3이 가능하며, 디폴트는 2차입니다. 각 차수별 기본식은 IDL 도움말에도 나와있는데 다음과 같습니다.



그러면 먼저 기본적인 설정만을 사용하여 PR 기법을 적용해보기로 하겠습니다. 그 과정은 다음과 같습니다.


TRIANGULATE, x, y, tr

gridded_a = GRIDDATA(x, y, f, START=0, DELTA=0.02, DIMENSION=51, $

  TRIANGLES=tr, /POLYNOMIAL_REGRESSION)

HELP, gridded_a

PRINT, MIN(gridded_a), MAX(gridded_a)


여기서는 PR 기법을 사용하기 위하여 /POLYNOMIAL_REGRESSION 키워드를 사용하였습니다. 그런데 한가지 주목할 점이 있는데 바로 TRIANGLES 키워드도 함께 사용되었다는 것입니다. 이 키워드에는 TRIANGULATE 프로시저를 사용하여 산출된 tr이라는 결과가 부여되었습니다. 사실 이러한 방식 자체는 지난 회 게시물에서 Modified Shepards 기법을 소개할 때 언급된 바 있습니다만, TRIANGLES 키워드의 사용이 필수적인 기법 5개 중에 PR은 포함되어 있지 않았습니다. 사실 위의 예제 코드에서는 TRIANGLES 키워드를 사용하지 않아도 문제가 없습니다. 다만 이후에 소개할 다른 키워드들을 사용할 경우에는 TRIANGLES 키워드의 동반 사용이 필수적이기 때문에 여기서부터 사용하기로 하겠습니다. 어쨌든 이 결과를 원본 데이터 그림 바로 오른쪽에 붙여서 표출하면 그 모습은 다음 그림과 같습니다.


im3a = IMAGE(gridded_a, RGB_TABLE=ct, MIN_VALUE=0, MAX_VALUE=5, $

  MARGIN=0, /CURRENT, LAYOUT=[4, 1, 2])



앞서 언급했던 것처럼 여기서는 디폴트 설정만을 사용하여 PR 기법을 적용하였습니다. 따라서 2차항까지만 존재하는 다항식으로 근사된 결과가 표출되었습니다. 나름 그럴싸해 보이긴 하지만, 2차항까지만 존재하는 다항식으로 근사를 하다보니 국부적인 변동은 거의 존재하지 않고 아주 큰 범위의 패턴만 보이는 것을 알 수 있습니다. 사실 PR 기법을 사용할 경우에도 관련 키워드들이 부가적으로 많이 지원되는데, IDL 도움말에서 GRIDDATA 함수에 관한 내용을 보면 PR 기법과 연관된 키워드들이 다음과 같이 소개되어 있습니다.



그래서 국부적인 변동을 좀 더 반영하기 위하여 관련 키워드들을 사용해보고자 합니다. 먼저 다음과 같이 MAX_PER_SECTOR 키워드를 추가적으로 사용해봅시다.


gridded_b = GRIDDATA(x, y, f, START=0, DELTA=0.02, DIMENSION=51, $

  TRIANGLES=tr, /POLYNOMIAL_REGRESSION, MAX_PER_SECTOR=10)

HELP, gridded_b

PRINT, MIN(gridded_b), MAX(gridded_b)


그리고 이 결과를 앞서 디폴트 설정만으로 얻었던 결과의 오른쪽에 붙여서 표출하면 그 모습은 다음 그림과 같습니다.


im3b = IMAGE(gridded_b, RGB_TABLE=ct, MIN_VALUE=0, MAX_VALUE=5, $

  MARGIN=0, /CURRENT, LAYOUT=[4, 1, 3])



앞서 디폴트 설정만으로 얻었던 결과에 비해서는 국부적인 특성이 좀 더 반영된 모습을 확인할 수 있습니다. MAX_PER_SECTOR 키워드에 들어가는 값의 의미는 각 규칙격자별로 내삽값을 계산하는데 있어서 격자점의 주변으로 가장 가까운 데이터 포인트를 몇 개까지 감안할 것인가에 해당됩니다. 따라서 이 값이 작을수록 더욱 국부적인 변동에 민감한 결과가 얻어지고, 클수록 덜 민감한 결과를 얻게 됩니다. 비교를 위하여 위의 예제코드에서 MAX_PER_SECTOR 키워드에 10 대신 20이란 값을 적용해보면 그 결과는 다음 그림과 같습니다.



앞서 10이었을 경우에 비해서는 국부적인 변동이 약해지고 전체적으로 좀 더 부드러운 결과가 얻어진 것을 볼 수 있습니다. 따라서 이 값은 데이터의 특성에 따라 적절히 조정하면서 결과를 얻으면 됩니다. 이번에는 SEARCH_ELLIPSE 키워드를 사용해보겠습니다. 사실 이 키워드는 낯설지 않습니다. 지난 회에서 Modified Shephards 기법을 소개할 때 이미 한번 등장했던 키워드이며 개념 자체도 같다고 보면 됩니다. 즉 내삽과정에서 각 격자점마다 주변 반경 얼마까지만 고려할지를 정량적으로 설정하는 역할을 합니다. 이 키워드는 다음과 같이 사용하여 결과를 얻으면 됩니다.


gridded_c = GRIDDATA(x, y, f, START=0, DELTA=0.02, DIMENSION=51, $

  TRIANGLES=tr, /POLYNOMIAL_REGRESSION, SEARCH_ELLIPSE=0.3)

HELP, gridded_c

PRINT, MIN(gridded_c), MAX(gridded_c)


이 결과를 앞서 얻었던 결과의 오른쪽에 붙여서 표출하면 그 모습은 다음 그림과 같습니다.


im3c = IMAGE(gridded_c, RGB_TABLE=ct, MIN_VALUE=0, MAX_VALUE=5, $

  MARGIN=0, /CURRENT, LAYOUT=[4, 1, 4])



여기서는 SEARCH_ELLIPSE 키워드의 값을 0.3으로 설정하였는데, 이 키워드 역시 값을 조정해가며 그 결과를 비교해볼까 합니다. 그래서 0.3 대신 0.6으로 설정해보면 그 결과는 다음 그림과 같습니다.



역시 앞서 0.3일 경우와 비교해보면 꽤 달라진 것을 볼 수 있습니다. 이 키워드의 의미상 값이 커질수록 전체적으로 좀 더 부드러운 패턴의 결과를 얻게 될 것이므로, 이러한 비교 결과가 나오는 것은 자연스럽다고 볼 수 있습니다. 이외에도 다른 키워드들이 꽤 여러가지 지원되지만 더 자세한 언급은 생략하기로 하겠습니다.


오늘은 GRIDDATA 함수에서 Polynomial Regression 기법을 적용하는 방법 및 관련 예제들을 살펴보았습니다. GRIDDATA 함수에 관한 게시물 연재는 오늘로서 마감하고자 합니다. 완벽하지는 않지만 어느 정도 충분한 설명이 되었다고 판단이 됩니다. 이 내용을 바탕으로 여러분들이 실전 데이터를 처리하면서 직접 다양한 테스트를 해보시면 좋을 것 같습니다.

LIST