이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

프로그래밍 방식 피팅

다항식 모델에 대한 MATLAB 함수

다음 2개의 MATLAB® 함수는 다항식으로 데이터를 모델링할 수 있습니다.

다항식 피팅 함수

함수

설명

polyfit

polyfit(x,y,n)은 모델과 데이터의 편차 제곱합을 최소화하여(최소제곱 피팅) y 데이터를 피팅하는 n차 다항식 p(x)의 계수를 구합니다.

polyval

polyval(p,x)x에 대해 계산된, polyfit으로 지정된 n차 다항식의 값을 반환합니다.

이 예제에서는 다항식을 사용하여 데이터를 모델링하는 방법을 보여줍니다.

시간 t의 여러 값에 대해 양 y를 측정합니다.

t = [0 0.3 0.8 1.1 1.6 2.3];
y = [0.6 0.67 1.01 1.35 1.47 1.25];
plot(t,y,'o')
title('Plot of y Versus t')

다음 2차 다항식 함수를 사용하여 이 데이터를 모델링해 볼 수 있습니다.

y=a2t2+a1t+a0.

미정 계수 a0, a1, a2는 모델과 데이터의 편차 제곱합을 최소화하여(최소제곱 피팅) 계산됩니다.

polyfit을 사용하여 다항식 계수를 구합니다.

p = polyfit(t,y,2)
p = 1×3

   -0.2942    1.0231    0.4981

MATLAB은 다항식 계수를 내림차순으로 정렬하여 계산합니다.

데이터의 2차 다항식 모델은 다음 방정식으로 지정됩니다.

y=-0.2942t2+1.0231t+0.4981.

균일한 간격의 시간 t2에 대해 다항식을 계산합니다. 그런 다음, 동일한 플롯에 원래 데이터와 모델을 플로팅합니다.

t2 = 0:0.1:2.8;
y2 = polyval(p,t2);
figure
plot(t,y,'o',t2,y2)
title('Plot of Data (Points) and Model (Line)')

데이터 시간 벡터에 대해 모델을 계산합니다.

y2 = polyval(p,t);

잔차를 계산합니다.

res = y - y2;

잔차를 플로팅합니다.

figure, plot(t,res,'+')
title('Plot of the Residuals')

2차 피팅이 데이터의 기본 형태를 대략적으로 따르기는 하지만, 데이터가 놓일 만한 매끄러운 곡선을 캡처하지는 못합니다. 잔차에 패턴이 있는 것 같으며, 이는 다른 모델이 필요할 수도 있음을 나타냅니다. 다음에 나와 있는 5차 다항식은 데이터의 변동을 더 잘 따릅니다.

이번에는 polyfit에서 5차 다항식을 사용하여 예제를 반복해 보겠습니다.

p5 = polyfit(t,y,5)
p5 = 1×6

    0.7303   -3.5892    5.4281   -2.5175    0.5910    0.6000

t2에 대해 다항식을 계산하고 새 Figure 창에서 데이터 위에 피팅을 플로팅합니다.

y3 = polyval(p5,t2);   
figure
plot(t,y,'o',t2,y3)
title('Fifth-Degree Polynomial Fit')

참고

실제 상황을 모델링하려는 경우에는 항상 특정 차수의 모델이 그 상황에서 유의미한지 여부를 고려하는 것이 중요합니다.

비다항식 항이 포함된 선형 모델

이 예제에서는 비다항식 항이 포함된 선형 모델을 사용하여 데이터를 피팅하는 방법을 보여줍니다.

다항식 함수가 데이터에 대해 만족스러운 모델을 생성하지 못하면 비다항식 항이 포함된 선형 모델을 사용해 볼 수 있습니다. 예를 들어, 파라미터 a0, a1, a2에서는 선형이지만 t 데이터에서는 비선형인 다음 함수를 고려해 볼 수 있습니다.

y=a0+a1e-t+a2te-t.

연립 방정식 세트를 구성하여 해를 구하고 파라미터를 구해서 미정 계수 a0, a1, a2를 계산할 수 있습니다. 다음 구문은 설계 행렬을 생성하여 이를 수행합니다. 설계 행렬의 각 열은 응답(모델의 항)을 예측하는 데 사용되는 변수를 나타내고, 각 행은 이러한 변수의 한 관측값에 해당합니다.

ty를 열 벡터로 입력합니다.

t = [0 0.3 0.8 1.1 1.6 2.3]';
y = [0.6 0.67 1.01 1.35 1.47 1.25]';

설계 행렬을 생성합니다.

X = [ones(size(t))  exp(-t)  t.*exp(-t)];

모델 계수를 계산합니다.

a = X\y
a = 3×1

    1.3983
   -0.8860
    0.3085

따라서 데이터의 모델은 다음 방정식으로 지정됩니다.

y=1.3983-0.8860e-t+0.3085te-t.

이제 균일한 간격의 점에 대해 모델을 계산하고 원래 데이터와 함께 모델을 플로팅합니다.

T = (0:0.1:2.5)';
Y = [ones(size(T))  exp(-T)  T.*exp(-T)]*a;
plot(T,Y,'-',t,y,'o'), grid on
title('Plot of Model and Original Data')

다중 회귀

이 예제에서는 다중 회귀를 사용하여 둘 이상의 예측 변수의 함수인 데이터를 모델링하는 방법을 보여줍니다.

y가 둘 이상의 예측 변수를 갖는 함수이면, 추가 데이터를 수용할 수 있도록 변수 간의 관계를 표현하는 행렬 방정식을 확장해야 합니다. 이를 다중 회귀라고 합니다.

x1x2의 여러 값에 대해 양 y를 측정합니다. 이러한 값을 각각 벡터 x1, x2, y에 저장합니다.

x1 = [.2 .5 .6 .8 1.0 1.1]';
x2 = [.1 .3 .4 .9 1.1 1.4]';
y  = [.17 .26 .28 .23 .27 .24]';

이 데이터의 모델은 다음과 같은 형식이 됩니다.

y=a0+a1x1+a2x2.

다중 회귀는 모델과 데이터의 편차 제곱합을 최소화하여(최소제곱 피팅) 미정 계수 a0, a1, a2를 구합니다.

설계 행렬 X를 생성하여 연립 방정식 세트를 구성하고 해를 구합니다.

X = [ones(size(x1))  x1  x2];

백슬래시 연산자를 사용하여 파라미터를 구합니다.

a = X\y
a = 3×1

    0.1018
    0.4844
   -0.2847

데이터의 최소제곱 피팅 모델은 다음 방정식으로 지정됩니다.

y=0.1018+0.4844x1-0.2847x2.

모델을 검증하기 위해 모델과 데이터의 편차의 절댓값 중 최댓값을 구합니다.

Y = X*a;
MaxErr = max(abs(Y - y))
MaxErr = 0.0038

이 값은 어떤 데이터 값보다도 훨씬 작습니다. 이는 이 모델이 데이터를 정확히 따르고 있음을 나타냅니다.

프로그래밍 방식 피팅

이 예제에서는 MATLAB 함수를 사용하여 다음을 수행하는 방법을 보여줍니다.

1790년부터 1990년까지의 미국 인구 데이터가 들어 있는 census.mat에서 샘플 인구 조사 데이터를 불러옵니다.

load census

그러면 다음 두 개의 변수가 MATLAB 작업 공간에 추가됩니다.

  • cdate는 1790년부터 1990년까지의 연도가 10년 단위로 포함되어 있는 열 벡터입니다.

  • popcdate의 각 연도에 해당하는 미국 인구 숫자로 구성된 열 벡터입니다.

데이터를 플로팅합니다.

plot(cdate,pop,'ro')
title('U.S. Population from 1790 to 1990')

이 플롯은 변수 간에 높은 상관관계가 있음을 나타내는 강한 패턴을 보여줍니다.

상관 계수 계산하기

예제의 이 부분에서는 변수 cdate와 변수 pop 간에 통계적 상관관계가 있는지 확인하여 데이터 모델링의 타당성을 확인합니다. 상관 계수에 대한 자세한 내용은 선형 상관관계 항목을 참조하십시오.

상관 계수 행렬을 계산합니다.

corrcoef(cdate,pop)
ans = 2×2

    1.0000    0.9597
    0.9597    1.0000

행렬의 대각선 요소는 1로서, 각 변수는 자기 자신과 완전한 상관관계를 가짐을 나타냅니다. 비대각선 요소는 1에 매우 가까워, 변수 cdatepop 간에 강한 통계적 상관관계가 있음을 나타냅니다.

데이터에 다항식 피팅하기

예제의 이 부분에서는 MATLAB polyfit 함수와 polyval 함수를 적용하여 데이터를 모델링합니다.

피팅 파라미터를 구합니다.

[p,ErrorEst] = polyfit(cdate,pop,2);

피팅을 계산합니다.

pop_fit = polyval(p,cdate,ErrorEst);

데이터와 피팅을 플로팅합니다.

plot(cdate,pop_fit,'-',cdate,pop,'+');
title('U.S. Population from 1790 to 1990')
legend('Polynomial Model','Data','Location','NorthWest');
xlabel('Census Year');
ylabel('Population (millions)');

이 플롯은 2차 다항식 피팅이 데이터에 대해 적절한 근삿값을 제공하고 있음을 보여줍니다.

이 피팅의 잔차를 계산합니다.

res = pop - pop_fit;
figure, plot(cdate,res,'+')
title('Residuals for the Quadratic Polynomial Model')

잔차의 플롯에 패턴이 있으며, 이는 2차 다항식이 이 데이터 모델링에 적합하지 않을 수도 있음을 나타냅니다.

신뢰한계 플로팅하기와 계산하기

신뢰한계는 예측한 응답에 대한 신뢰구간입니다. 구간의 너비는 피팅의 확실성의 정도를 나타냅니다.

예제의 이 부분에서는 census 샘플 데이터에 polyfitpolyval을 적용하여 2차 다항식 모델에 대한 신뢰한계를 생성합니다.

다음 코드는 많은 수의 샘플에 대해 95% 신뢰구간에 해당하는 ±2Δ 구간을 사용합니다.

피팅과 예측 오차 추정값(델타)을 계산합니다.

[pop_fit,delta] = polyval(p,cdate,ErrorEst);

데이터, 피팅, 신뢰한계를 플로팅합니다.

plot(cdate,pop,'+',...
     cdate,pop_fit,'g-',...
     cdate,pop_fit+2*delta,'r:',...
     cdate,pop_fit-2*delta,'r:'); 
xlabel('Census Year');
ylabel('Population (millions)');
title('Quadratic Polynomial Fit with Confidence Bounds')
grid on

95% 구간은 새로운 관측값이 한도 내에 속할 확률이 95%임을 나타냅니다.