다항곡선 회귀분석은 단일 변수에 대한 함숫값을 어떠한 다항식으로 근사할 때 사용한다.
위와 같이 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
'MATLAB' 카테고리의 다른 글
.mat 파일 저장 및 불러오기 (0) | 2021.05.04 |
---|---|
MATLAB 셀(cell) 배열 정의 및 호출하기, 관련 함수 정리 (0) | 2021.03.09 |
MATLAB의 particleswarm 함수로 최적화 문제 풀기(Particle Swarm Optimization) (0) | 2021.01.23 |
MATLAB의 ga 함수로 최적화 문제 풀기(Genetic Algorithm) (0) | 2021.01.23 |
MATLAB으로 KS test(Kolmogorov-Smirnov test) 하기(kstest 함수 사용) (0) | 2021.01.12 |