오늘은 IDL에서 Multi-Linear Regression, 즉 다중 선형 회귀법이라는 기법을 사용하는 방법과 관련 예제를 함께 소개해보기로 하겠습니다. 이 기법 자체에 대해서는 아시는 분들은 다 아실 것으로 생각을 합니다. 그냥 선형 회귀법(Linear Regression)이 X, Y 데이터 사이의 관계를 가장 잘 맞추는 직선의 식을 얻는 기법이라면, 다중 선형 회귀법은 Y를 결정하는데 있어서 X1, X2, X3 등과 같이 다양한 인자들이 함께 연관되는 경우에 해당됩니다. 기하학적으로 본다면, 그냥 X와 Y의 관계라면 XY 2차원 공간상에 존재하는 직선이 되겠지만, 한 단계 더 나아가서 X1, X2, Y의 관계인 경우에는 XYZ 3차원 공간상에 존재하는 평면이 될 것입니다. 물론 그보다 더 나아간다면 기하학적으로 가시적으로는 나타내기가 불가능하겠지요.
설명을 위하여 다음과 같은 예제를 가정해보겠습니다. 이미 날씨가 많이 쌀쌀해졌지만 몇 달 전까지만 해도 너무나 뜨거웠던 여름을 떠올려 봅시다. 이 예제에서는 어떤 편의점에서 아이스크림의 판매량이 낮 최고 기온 및 그 지역 유동인구와 어떤 식으로 연관이 되는가를 따져보고자 합니다. 물론 여기 나온 수치들은 예제를 만들기 위하여 제가 마음대로 가정한 값들일 뿐 실제는 아닙니다. 그래도 나름 그럴싸한 값들을 생각해 보았습니다.
이 예제에서는 아이스크림 판매 갯수가 결과값인 Y에 해당됩니다. 그리고 이 값이 낮 최고기온(X1)과 그 지역의 유동인구(X2) 두 인자에의해 결정된다고 가정합니다. 즉, Y를 산출하는데 있어서 X1, X2에 선형(Linear)으로 의존한다고 보고, 이러한 다중 선형 관계를 식으로 다음과 같이 나타낼 수 있습니다.
Y = A0 + A1*X1 + A2*X2
결국 우리가 다중 선형 회귀법을 사용하여 이 문제를 해결한다는 것은, 이 식의 계수들인 A0, A1, A2를 산출하는 작업이 됩니다. IDL에서는 이러한 작업을 수행하는데 있어서 REGRESS라는 함수를 사용하면 됩니다. 이 REGRESS 함수는 사용해 본 유저들도 있으실 것 같은데, 대개 X, Y 선형 회귀에서 자주 언급이 되는 편입니다. 물론 X, Y 선형 회귀 작업에 있어서는 REGRESS 또는 LINFIT 함수를 사용하면 됩니다. 하지만 REGRESS 함수의 경우는 원래 목적 자체가 이미 다중 선형 회귀입니다. IDL 도움말에도 그렇게 나와 있습니다. 그래서 오늘같은 경우는 REGRESS 함수를 필수적으로 사용해야 합니다.
그러면 다중 선형 회귀 작업을 본격적으로 진행하기에 앞서서 먼저 위의 예제에서 제시된 X1, X2, Y 값들을 정의하고 그림으로 먼저 나타내 보겠습니다. 이 과정은 다음과 같이 구현해 보았습니다.
x1 = [19, 22, 26, 31, 30, 24]
x2 = [70, 150, 360, 590, 220, 490]
y = [31, 45, 68, 118, 52, 88]
win = WINDOW(DIMENSIONS=[800, 600])
pl = PLOT3D(x1, x2, y, SYM_OBJECT=ORB(), SYM_SIZE=2, SYM_COLOR=[0, 38, 255], $
XRANGE=[15, 40], YRANGE=[0, 800], ZRANGE=[0, 180], ZTICKINTERVAL=30, $
LINESTYLE=6, XTITLE='Temperature', YTITLE='Population', ZTITLE='Count', $
/CURRENT)
여기서는 데이터 값들을 담은 배열들을 정의하고 이를 가시화하는데 있어서 PLOT3D라는 그래픽 함수를 사용하였는데요. 데이터 포인트들이 X1, X2, Y 축들로 구성되는 3차원 공간상에 존재하기 때문에, 이를 제대로 가시화하기 위해서는 2차원용 PLOT 함수 대신 3차원용 PLOT3D 함수를 사용하는 것이 좋습니다. 표출된 그림은 다음과 같습니다.
여기서는 제가 스냅샷만 보여드리고 있지만, 여러분들이 실제로 IDL에서 표출해보면 그 모습을 마우스 드래그로 이리저리 돌려볼 수 있습니다. 그러면 데이터 포인트들이 3차원 공간상에서 어떻게 흩어져 있는가를 좀 더 구체적으로 살펴볼 수 있습니다. 직접 해보시기 바랍니다. 이제 다음 단계에서는 다중 선형 회귀를 수행하는데 이를 위하여 REGRESS 함수를 사용하게 됩니다. 이 과정 자체는 사실 간단합니다. 그 내용은 다음과 같습니다.
xx = [TRANSPOSE(x1), TRANSPOSE(x2)]
coeff = REGRESS(xx, y, CONST=const, CORRELATION=cor, STATUS=st)
PRINT, 'Status :', st
PRINT, 'Correlation :', cor
HELP, coeff
PRINT, const, coeff
여기서는 REGRESS 함수의 사용에 앞서서 XX라는 배열을 새로 정의하였습니다. 이는 X1, X2 배열을 합쳐서 2 by N 형태의 배열로 XX를 만들어준 것인데, 다중 선형 회귀의 목적으로 REGRESS 함수를 사용할 때에는 X 데이터가 이와 같은 형태로 투입되어야 하기 때문입니다. 실제 회귀 작업 자체는 위 내용에서 맨 앞 두 줄이면 끝납니다. 그 이후의 PRINT문들은 주요 결과값들을 보기 위한 목적입니다. 여기서 REGRESS 함수가 돌려주는 결과인 coeff는 다중 선형 회귀식을 구성하는 계수들(A1, A2)에 해당되고, 이 식의 상수항 값인 A0는 REGRESS 함수의 CONST 키워드에 부여된 변수를 통해서 받도록 되어 있습니다. 따라서 위의 연산을 통해서 얻은 const, coeff 등이 바로 우리가 원하는 핵심적인 결과값들입니다.
그런데 이렇게 식의 계수들을 산출한 것만으로는 아직 성에 차지 않습니다. 기본적으로 이 식은 기하학적으로는 X1, X2, Y 공간상의 평면에 해당됩니다. 따라서 이 평면의 모습을 실제로 가시화할 수가 있습니다. 이 과정은 다음과 같이 구현해 보았습니다.
xf1 = [15:40:1]
xf2 = [0:750:30]
surf = FLTARR(N_ELEMENTS(xf1), N_ELEMENTS(xf2))
FOR j = 0, N_ELEMENTS(xf2)-1 DO BEGIN
FOR i = 0, N_ELEMENTS(xf1)-1 DO BEGIN
surf[i, j] = const + coeff[0, 0]*xf1[i] + coeff[0, 1]*xf2[j]
ENDFOR
ENDFOR
sf = SURFACE(surf, xf1, xf2, TRANSPARENCY=30, /OVERPLOT)
여기서 구현하고자 하는 기하학적 형태는 평면이겠지만 가시화를 위해서는 SURFACE 함수를 사용하였습니다. X1축과 X2축의 일정 영역을 커버하는 격자들의 좌표값들을 xf1, xf2라는 배열로서 생성을 하고, 2차원 격자 형태의 Y값들은 surf라는 배열의 형태로 생성해 놓은 다음, 이 surf 배열의 값들을 위에서 얻은 다중 선형 회귀식을 사용하여 계산합니다. 이 결과를 SURFACE 함수에 투입하면 됩니다. 이와 같은 과정을 통하여 가시화된 평면의 모습은 다음 그림과 같습니다.
이 그림 역시 아까와 마찬가지로 마우스 드래그에 의하여 이리저리 돌려볼 수 있습니다. 그러면 이 평면이 데이터 포인트들을 그런대로 잘 반영하는 최적의 평면임을 확인할 수 있습니다. 이번에는 이 식을 사용하여 내가 원하는 특정한 X1, X2 값에 대한 Y값을 산출해 봅시다. 예를 들어 낯 최고기온이 35도이고 유동인구가 440명일 경우 예상되는 아이스크림 판매량을 계산하고 그 값을 출력해 본다면 그 과정은 대략 다음과 같습니다.
xval1 = 35
xval2 = 440
yval = const + coeff[0, 0]*xval1 + coeff[0, 1]*xval2
PRINT, yval
point = PLOT3D([xval1], [xval2], [yval], SYM_OBJECT=ORB(), SYM_SIZE=2, $
SYM_COLOR='crimson', /DATA, /OVERPLOT)
위 내용을 실행하면 그 결과인 yval의 값이 약 90 정도로 산출됩니다. 즉, 35도라면 기온은 매우 높지만 유동인구 자체가 아주 많은 편이아니기 때문에 이러한 부분들이 회귀식에 반영되어 이러한 값이 얻어진 것입니다. 그리고 하단을 보면 PLOT3D 함수가 또 한번 사용이 되고 있는데요. 이것은 xval1, xval2, yval 값에 해당되는 포인트를 붉은색으로 별도로 표시하기 위한 것입니다. 여기까지 진행된 모습은 다음 그림과 같습니다.
따라서 REGRESS 함수를 사용하여 산출된 다중 선형 회귀식을 사용하여 얼마든지 다른 X1, X2 값들에 대한 Y값을 계산하고 그 위치를 표출하는 것도 가능하다는 것을 확인할 수 있습니다. 그리고 기하학적으로 가시화 자체는 불가능하겠지만 더 많은 종류의 X값 데이터가 있을 경우에도 이 REGRESS 함수를 사용하면 다중 선형 회귀 계산을 비교적 쉽게 수행할 수 있습니다. 다중 선형 회귀법은 최근 들어 관심이 높아지고 있는 인공지능 및 기계학습 분야에서도 기본 원리를 공부할 때 항상 등장하는 개념이기도 합니다. 이러한 맥락에서 이와 같은 내용을 잘 알아두시는 것도 좋을 것 같습니다.
'IDL > Math' 카테고리의 다른 글
DERIV 함수를 활용한 도함수(기울기, 미분) 산출 (0) | 2017.01.02 |
---|---|
시스템 변수 !EXCEPT 소개 (0) | 2016.11.23 |
정규 분포(Normal Distribution) 함수의 테스트 (0) | 2016.10.31 |
RANDOMU 함수를 사용한 난수 생성 (Part 2) (0) | 2016.08.01 |
RANDOMU 함수를 사용한 난수 생성 (Part 1) (0) | 2016.07.28 |