MATLAB

polyfit, polyval 함수로 다항곡선 회귀분석하기(Polynomial Curve Fitting)

qlsenddl 2021. 2. 7. 19:23
728x90

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

 위와 같이 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 함수를 이용해서 다항곡석 회귀분석하는 방법을 알아보고자 한다.

 

1. polyfit 함수로 다항식의 계수 구하기

기본 문법(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

 

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

 

728x90