Main Content

프로그래밍 방식 피팅

다항식 모델에 대한 MATLAB 함수

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

다항식 피팅 함수

함수

설명

polyfit

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

polyval

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

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

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

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

다항식 함수가 데이터에 대해 만족스러운 모델을 생성하지 못하면 비다항식 항이 포함된 선형 모델을 사용해 볼 수 있습니다. 예를 들어, 파라미터 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')

Figure contains an axes object. The axes object with title Plot of Model and Original Data contains 2 objects of type line. One or more of the lines displays its values using only markers

다중 회귀

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

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')

Figure contains an axes object. The axes object with title U.S. Population from 1790 to 1990 contains a line object which displays its values using only markers.

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

상관 계수 계산하기

예제의 이 부분에서는 변수 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)');

Figure contains an axes object. The axes object with title U.S. Population from 1790 to 1990, xlabel Census Year, ylabel Population (millions) contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Polynomial Model, Data.

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

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

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

Figure contains an axes object. The axes object with title Residuals for the Quadratic Polynomial Model contains a line object which displays its values using only markers.

잔차의 플롯에 패턴이 있으며, 이는 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

Figure contains an axes object. The axes object with title Quadratic Polynomial Fit with Confidence Bounds, xlabel Census Year, ylabel Population (millions) contains 4 objects of type line. One or more of the lines displays its values using only markers

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