매트랩 커브 피팅 함수 - maeteulaeb keobeu piting hamsu

 다항곡선 회귀분석은 단일 변수에 대한 함숫값을 어떠한 다항식으로 근사할 때 사용한다.

매트랩 커브 피팅 함수 - maeteulaeb keobeu piting hamsu

 위와 같이 n차 다항식으로 근사를 한 후 주어진 data sample을 잘 표현하는 다항식 계수들을 추정(estimation)하는 것을 다항곡선 회귀분석 또는 다항식 회귀분석이라고 하고 영어로 polynomial curve fitting이라고 한다. 이 때 회귀 분석을 위해 필요한 data의 개수 N은 근사하고자하는 다항식의 최고 차수가 n개 일 때, n+1보다 많아야 한다. 즉 N ≥ n+1이어야 회귀분석을 통해 다항식의 개수를 구할 수 있다.(구해야 하는 다항식 계수의 갯수가 n+1이고, data sample 1개 당 방정식 1개가 주어지기 때문에 N이 최소한 n+1이 돼야 다항식 계수가 정해질 수 있으므로 당연한 이야기)

 구체적인 다항식 회귀 분석 방법은 수치 해석 책을 보면 알 수 있겠지만 여기에서는 MATLAB 함수를 이용해서 다항곡석 회귀분석하는 방법을 알아보고자 한다.

기본 문법(syntax): p = polyfit(x, y, n)

※ input

x: data의 input값이다.

y: input값에 해당하는 data의 output값이다.

n: 근사할 다항식의 차수(order)이다.

 output

p: 내림차순으로 다항식의 계수들의 값을 가진(고차항 계수부터 상수항 순의 배열) 1차원 배열(vector)이다.

2. polyval 함수로 근사한 다항식의 함숫값 구하기

기본 문법(syntax): f = polyval(p, x)

※ input

x: 근사된 함숫값을 알고 싶은 input값이다.

p: polyfit으로 구해진 다항식의 계수들의 값을 가진 1차원 배열(vector)이다.

 output

f: x값에 대해서 근사된 다항식의 함숫값이다.

-> polyval은 다항식의 계수 정보가 주어졌을 때, 그 다항식의 함숫값을 구해주는 함수이다. 그러므로 굳이 다항식 회귀분석에서만 쓰이는 것이 아니라 그와 비슷한 다른 용도로도 많이 쓰일 수 있다. 여기에서는 주어진 data로 다항식의 계수들을 추정하고 추정된 계수 값들로 어떻게 근사값을 얻는지 보여주기 위해서 해당 함수도 보여주었다.

3. 예시

1) 단순 2차식 

% sample 생성

X = -2:0.5:0;
Y = X.^2 + 2*X - 2;

% 다항식 회귀 분석 및 근사

p = polyfit(X, Y, 2)
newX = -3:0.1:1;
f = polyval(p, newX);

% 그래프 그리기
plot(X, Y, 'o', newX, f)
legend('sample', 'test'), grid on  % 범례 및 격자 생성

>> p = [1.000, 2.000, -2.000]으로 true function과 동일한 계수를 갖는 것을 확인할 수 있다.

>> 결과 plot

매트랩 커브 피팅 함수 - maeteulaeb keobeu piting hamsu

2) 다항식이 아닌 함수 근사

% sample 생성

X = 0:0.1:1;
Y = (6*X-2).^2.*sin(12*X-4);

% 다항식 회귀 분석 및 근사
p = polyfit(X, Y, 9);
newX = 0:0.02:1;
f = polyval(p, newX);
true = (6*newX-2).^2.*sin(12*newX-4); % true 함수

% 그래프 그리기
plot(X, Y, 'o', newX, f, newX, true, '-.')
legend('sample', 'polynomial curve fitting', 'true')

>> 7, 8, 9, 10차로 바꿔가면서 loss가 적은 차수로 변경해볼 수 있다. 다만 sample 수가 11개 이므로 11차 이상의 경우 '경고: 다항식이 고유하지 않습니다. 차수가 데이터 점 개수보다 크거나 같습니다.' 라는 경고 문구가 뜨지만 plot은 가능하다.(다항식의 계수값들이 하나로 결정되지 않아 경고가 뜬 것이고, MATLAB은 그 중에 하나를 골라 plot해준다.)

>> 결과 plot

매트랩 커브 피팅 함수 - maeteulaeb keobeu piting hamsu

우선 Matlab R2014a 버전으로 진행되는 것을 알려드립니다.

matlab에서 curve fitting을 할 때, 쉬운 Tool을 소개하고자 합니다.

matlab의 이전 버전들과 달리 2014버전은 Tool을 직접 앱이라는 탭에서 바로 선택할 수 있게 만들어져 있어서 편합니다.

우선 앱이라는 탭에서 Curve Fitting Tool을 찾아서 실행합니다.
(다른 버전에서 실행하고자 할 때, 앱이라는 탭이 없다면 cftool 을 치시면 Curve Fitting Tool 화면이 뜨게 됩니다.

예시로

x = 1:1:360;

y = sind(x) + cosd(x); 라는 식에 대해서 curve fitting 해보겠습니다.

위의 그림과 같이 변수를 입력시켜놓고 Curve Fitting Tool 버튼을 눌러 Tool을 켭니다.

그럼 아래와 같이 Tool이 나오는데 여기서 x data와 y data를 입력시킨 변수를 각각 넣습니다.

그렇게 되면 가장 오른쪽에 체크되어있는 Auto fit에 의하여 자동으로 fitting이 되는데

이 tool이 좋은 점은 가운데에 fitting 종류를 선택할 수 있다는 점 입니다.(자동으로 안하려면 Auto fit 해제)

저는 Sum of Sine으로 선택하였고 그 결과는 아래와 같습니다.

매트랩 커브 피팅 함수 - maeteulaeb keobeu piting hamsu

Fitting 종류를 선택하면, 선택한 종류에 따라 해당 연산된 식이 아래 바로 출력되어 보여집니다.

그 식에서의 a1, b1, c1에 해당하는 변수들에 대해서 왼쪽 중간 칸에 보시는 것과 같이 계산된 변수들의 값이 보여지는 것을 알 수 있습니다.

Fitting이 잘 되었는지 알 수 있는 척도는 왼쪽 아래에 표현되어 있는 4가지 사항을 보시면 알 수 있습니다.

SSE(Sum of Square Error)와 RMSE(Root Mean Square Error)는 맨 뒤의 error를 나타내기에 0에 가까울 수록 좋다는 뜻 입니다.

R-Square와 Adjusted R-Square는 1에 가까울 수록 더 좋다고 하더군요. 이유는 잘 모르겠습니다. 나중에 추후 수정하기로 하겠습니다.

여러 가지 Fitting 종류들을 직접 선택해보시면서 사용하시면 되겠습니다.