매트랩(MATLAB)을 사용하면 간편하게 데이터를 함수로 피팅(fitting)할 수 있습니다. 이번 포스팅에서는 이전에 정리한 내용을 바탕으로 MATLAB fit function을 이용한 기본적인 data fitting 방법을 설명하려고 합니다.
매트랩에서 데이터를 원하는 특정 곡선(curve)이나 함수 (function), 표면(surface)으로 피팅(fitting)하는 방법은 여러가지가 있습니다. 일반적으로 다항식(polynomial), 가우시안(Gaussian function), 지수함수(exponential function) 등을 이용해 원하는 데이터를 피팅해야하는 경우가 많습니다. 저의 경우는 복잡한 수식으로 data fitting이 필요해 주로 fitting에 대한 cost function을 만들고 cost function을 minimize하는 fitting parameter를 찾는 방식으로 data fitting을 하고있습니다 (R^2을 최적화 하는 일반적인 방법).
하지만 MATLAB에서 제공하는 Curve Fitting Toolbox를 사용할 수 있는 환경이고, 일반적인 함수를 사용한 피팅을 한다면 'fit' 함수를 사용하여 간단하게 curve, graph 또는 데이터를 원하는 함수와 파라미터로 fitting 할 수 있습니다.
MATLAB Curve Fitting Toolbox가 사용가능한 환경에서 매트랩에서 fit 함수를 이용할 수 있어서 먼저 사용자의 MATLAB에서 fit 함수의 사용가능 여부를 알아야합니다. 사용자가 MATLAB에서 fit 함수를 사용할 수 있는지는 아래와같이 'help'를 이용해 알 수 있습니다 (help 명령어의 경우 다른 MATLAB 함수나 기능의 사용방법 뿐만 아니라 해당 함수의 사용가능 여부를 알려주는 유용한 함수!).
MATLAB Curve Fitting Toolbox는 유료로 제공되는 Toolbox이지만 대학이나 연구기관에서 MATLAB을 제공할때 모든 MATLAB Toolbox(add on)을 제공하므로 보통 사용하는데 큰 문제는 없습니다. (만약 연구실 단위에서 MATLAB을 구매했을 경우에도 Curve Fitting Toolbox는 꼭 같이 구매해야하는 필수적인 툴입니다)
>> help fit
fit을(를) 찾을 수 없습니다.
도움말 브라우저 검색 필드를 사용하여 도움말 문서를 검색하거나
help 메서드를 이용한 "help help" 같은 도움말 명령 옵션을 입력하십시오.
Curve Fitting Toolbox가 깔려있지 않거나, 제공되지 않는 버전의 MATLAB에서는 위와 같이 help fit을 입력했을때 fit을 찾을 수 없다는 문구가 나타나게됩니다. Fit function을 사용할 수 있는 MATLAB에서는 help fit을 입력할 때 아래처럼 fit함수에 대한 설명이 나타납니다.
>> help fit
fit - Fit curve or surface to data
This MATLAB function creates the fit to the data in x and y with the model
specified by fitType.
fitobject = fit(x,y,fitType)
fitobject = fit([x,y],z,fitType)
fitobject = fit(x,y,fitType,fitOptions)
fitobject = fit(x,y,fitType,Name,Value)
[fitobject,gof] = fit(x,y,fitType)
[fitobject,gof,output] = fit(x,y,fitType)
참고 항목 Curve Fitting, confint, feval, fitoptions, fittype, plot,
prepareCurveData, prepareSurfaceData
fit에 대한 함수 도움말 문서 페이지
이름이 fit인 다른 함수
Fit 함수를 사용할 수 있다면, 먼저 fit 함수를 이용해 데이터를 다항식으로 fitting을 시도해보겠습니다. 예시 데이터로 (x,y)=(0,0),(1,2),(2,4),(3,6)를 피팅해보겠습니다. 이상적으로는 y=2x로 fitting 되어야할 좌표 데이터입니다. 입력시 데이터는 꼭 아래와 같은 열 벡터 (column vector) 형태여야 합니다 (MATLAB 도움말 참조).
>> x=[0; 1; 2; 3];
>> y=[0; 2; 4; 6];
Fit 함수를 이용해 다음과같이 데이터를 fitting할 수 있습니다.
>> f=fit(x,y,'poly1')
f =
Linear model Poly1:
f(x) = p1*x + p2
Coefficients (with 95% confidence bounds):
p1 = 2 (2, 2)
p2 = 9.289e-16 (-2.532e-15, 4.39e-15)
'poly1'은 p1이 기울기, p2가 y-절편인 일차 다항식을 이용하여 data를 fitting한다는 의미입니다. n차 linear polynomial로 fitting 하고 싶다면 'polyn' (n은 원하는 다항식의 차수)을 입력하면 됩니다. p1이 2, p2가 약 10^-15 즉, 기울기가 2이고 y절편이 0이라고 생각해도 무방한 값의 fitting parameter가 계산되었기 때문에 문제 없이 data fitting이 되었다고 할 수 있습니다.
Fitting 결과는 아래와 같이 plot하여 시각화 할 수 있습니다.
>> plot(f,x,y)
다만 위의 예시처럼 y절편이 0임을 이미 알고있는 데이터는 p2값을 0으로 설정하고 fitting할 수 있습니다. 아래의 코드처럼 fit 함수의 'fit type' 을 지정하면 (Custom fitting model을 사용), 이와같이 특정 기울기나 y-절편으로 data를 fitting하는 것도 가능합니다.
>> userfit=fittype({'x'})
userfit =
Linear model:
userfit(a,x) = a*x
>> f=fit(x,y,userfit)
f =
Linear model:
f(x) = a*x
Coefficients (with 95% confidence bounds):
a = 2 (2, 2)
Custom fitting model의 사용은 MATLAB fitType 도움말의 'Create Custom Linear Model'이나 'Create Custom Nonlinear Model and ~' 항목을 보면 자세히 안내되어있습니다.
좀 더 나아가 데이터를 가우시안 (Gaussian)과 지수함수 (Exponential) 등의 함수로 피팅 할 수 있습니다. Fit 함수의 fitType을 참고하면 원하는 거의 모든 형태의 함수를 활용해 data fitting이 가능합니다. 이번 포스팅에서는 먼저 간단한 가우시안 (Gaussian) 함수를 이용한 fitting을 예시로 소개하겠습니다. 사용한 예제 데이터는 MATLAB에서 제공되는 titanium이라는 데이터입니다.
>> [x,y]=titanium;
>> x=x';
>> y=y';
위와 같이 데이터를 불러왔다면, fit 함수의 옵션을 'gauss1'으로 입력하여 단일 가우시안(singel Gaussian)으로 data를 fitting할 수 있습니다. 아래와같이 fitType을 gauss1으로 주고 피팅한 뒤 피팅 결과를 확인해봅시다.
>> f=fit(x,y,'gauss1')
f =
General model Gauss1:
f(x) = a1*exp(-((x-b1)/c1)^2)
Coefficients (with 95% confidence bounds):
a1 = 1.048 (0.8881, 1.209)
b1 = 866.5 (829.8, 903.1)
c1 = 259.6 (186.8, 332.5)
일차다항식 피팅의 예시와 마찬가지로 plot을 통해 fitting 결과를 살펴보면, 단일 가우시안 함수가 데이터에 적합한 피팅함수가 아닌것을 확인 할 수 있습니다.
>> plot(f,x,y)
단일 Gaussian으로 fitting은 되나 상당히 정확도가 떨어지므로 Gussian 두 개를 혼합한 함수 (mixed Gaussian model)를 이용하여 데이터를 더욱 정확하게 fitting 해볼 수 있습니다. 여기에서는 가우시안 함수 두개를 사용하는 gauss2를 사용해서 피팅하겠습니다.
(주의 - MATLAB 예제에서는 바로 gauss2를 사용했지마, 실제 실험 데이터를 피팅할 경우 이론모델에 맞게 data fitting을 해야합니다. 이론모델이 없는경우 먼저 적합한 fitting 함수를 찾고, 함수에 대한 논리적인 설명을 제시해야합니다.)
>> f=fit(x,y,'gauss2')
f =
General model Gauss2:
f(x) = a1*exp(-((x-b1)/c1)^2) + a2*exp(-((x-b2)/c2)^2)
Coefficients (with 95% confidence bounds):
a1 = 1.47 (1.426, 1.515)
b1 = 897.7 (897, 898.3)
c1 = 27.08 (26.08, 28.08)
a2 = 0.6994 (0.6821, 0.7167)
b2 = 810.8 (790, 831.7)
c2 = 592.9 (500.1, 685.7)
gauss2가 데이터를 잘 피팅했는지 확인해봅니다.
>> plot(f,x,y)
두개의 가우시안 함수를 선형결합하여 즉, gauss1 대신 gauss2를 사용하여 해당되는 데이터를 정확하게 fitting한 결과를 얻을 수 있었습니다.
다음 포스팅에서는 fit 함수를 이용해 얻어진 fitting parameter와 fitting 결과에 접근하고 활용하는 방법을 설명드리겠습니다.