Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

polyfit

다항식 곡선 피팅

설명

예제

p = polyfit(x,y,n)y의 데이터에 대한 최적의 피팅(최소제곱 관점에서)인 n차 다항식 p(x)의 계수를 반환합니다. p의 계수는 내림차순으로 나열되고, p의 길이는 n+1입니다.

p(x)=p1xn+p2xn1+...+pnx+pn+1.

[p,S] = polyfit(x,y,n)은 오차 추정값을 구할 목적으로 polyval에 대한 입력값으로 사용할 수 있는 구조체 S도 반환합니다.

예제

[p,S,mu] = polyfit(x,y,n)은 또한 정규화 값으로 구성된, 요소를 2개 가진 벡터인 mu도 반환합니다. mu(1)mean(x)이고 mu(2)std(x)입니다. 이러한 값을 사용하여 polyfitx의 중심을 0에 두고 단위 표준편차를 갖도록 스케일링합니다.

x^=xx¯σx.

이 정규화 변환은 다항식과 피팅 알고리즘의 수치적 속성을 모두 향상시킵니다.

예제

모두 축소

구간 [0,4*pi]에 사인 곡선을 따라 균일한 간격의 점 10개를 생성합니다.

x = linspace(0,4*pi,10);
y = sin(x);

polyfit을 사용하여 이들 점에 7차 다항식을 피팅합니다.

p = polyfit(x,y,7);

좀 더 촘촘한 그리드에서 다항식을 계산하고 결과를 플로팅합니다.

x1 = linspace(0,4*pi);
y1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on
plot(x1,y1)
hold off

구간 [0,1]에 균일한 간격의 점 5개로 구성된 벡터를 만들고, 이들 점에서 y(x)=(1+x)-1을 계산합니다.

x = linspace(0,1,5);
y = 1./(1+x);

이 5개의 점에 4차 다항식을 피팅합니다. 일반적으로, n개 점의 경우 이 점들을 정확히 통과하도록 n-1차 다항식을 피팅할 수 있습니다.

p = polyfit(x,y,4);

0과 2 사이의 더 촘촘한 점 그리드에서 원래 함수와 다항식 피팅을 계산합니다.

x1 = linspace(0,2);
y1 = 1./(1+x1);
f1 = polyval(p,x1);

더 넓은 구간 [0,2]에 함수 값과 다항식 피팅을 플로팅합니다. 다항식 피팅을 얻는 데 사용된 점들을 원으로 강조 표시합니다. 다항식 피팅은 원래 [0,1] 구간에서는 제대로 표시되지만, 이 구간을 벗어나면 피팅된 함수로부터 빠르게 발산합니다.

figure
plot(x,y,'o')
hold on
plot(x1,y1)
plot(x1,f1,'r--')
legend('y','y1','f1')

먼저 구간 [0,2.5] 내에서 균일한 간격의 x 점으로 구성된 벡터를 생성한 다음, 이들 점에서 erf(x)를 계산합니다.

x = (0:0.1:2.5)';
y = erf(x);

6차 근사 다항식의 계수를 확인합니다.

p = polyfit(x,y,6)
p = 1×7

    0.0084   -0.0983    0.4217   -0.7435    0.1471    1.1064    0.0004

피팅이 얼마나 일치하는지 보려면, 데이터 점에서 다항식을 계산하고 데이터, 피팅, 오차를 보여주는 테이블을 생성합니다.

f = polyval(p,x);
T = table(x,y,f,y-f,'VariableNames',{'X','Y','Fit','FitError'})
T=26×4 table
     X        Y          Fit         FitError  
    ___    _______    __________    ___________

      0          0    0.00044117    -0.00044117
    0.1    0.11246       0.11185     0.00060836
    0.2     0.2227       0.22231     0.00039189
    0.3    0.32863       0.32872    -9.7429e-05
    0.4    0.42839        0.4288    -0.00040661
    0.5     0.5205       0.52093    -0.00042568
    0.6    0.60386       0.60408    -0.00022824
    0.7     0.6778       0.67775     4.6383e-05
    0.8     0.7421       0.74183     0.00026992
    0.9    0.79691       0.79654     0.00036515
      1     0.8427       0.84238      0.0003164
    1.1    0.88021       0.88005     0.00015948
    1.2    0.91031       0.91035    -3.9919e-05
    1.3    0.93401       0.93422      -0.000211
    1.4    0.95229       0.95258    -0.00029933
    1.5    0.96611       0.96639    -0.00028097
      ⋮

이 구간에서, 보간된 값과 실제 값은 상당히 근사하게 일치합니다. 플롯을 만들어 이 구간 밖에서 외삽 값이 실제 데이터로부터 얼마나 빠르게 발산하는지 표시합니다.

x1 = (0:0.1:5)';
y1 = erf(x1);
f1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on
plot(x1,y1,'-')
plot(x1,f1,'r--')
axis([0  5  0  2])
hold off

1750년에서 2000년 사이의 인구 데이터 테이블을 만들고 데이터 점을 플로팅합니다.

year = (1750:25:2000)';
pop = 1e6*[791 856 978 1050 1262 1544 1650 2532 6122 8170 11560]';
T = table(year, pop)
T=11×2 table
    year       pop   
    ____    _________

    1750     7.91e+08
    1775     8.56e+08
    1800     9.78e+08
    1825     1.05e+09
    1850    1.262e+09
    1875    1.544e+09
    1900     1.65e+09
    1925    2.532e+09
    1950    6.122e+09
    1975     8.17e+09
    2000    1.156e+10

plot(year,pop,'o')

polyfit을 3개의 출력값과 함께 사용하고, 문제의 수치적 속성 향상을 위해 정규화를 사용하여 5차 다항식을 피팅합니다. polyfityear의 데이터 중심을 0에 두고 표준편차 1을 갖도록 스케일링합니다. 이를 통해 피팅 계산 시 조건이 나쁜 방데르몽드 행렬(Vandermonde Matrix)을 방지할 수 있습니다.

[p,~,mu] = polyfit(T.year, T.pop, 5);

polyval을 4개의 입력값과 함께 사용하여 스케일링된 연도 (year-mu(1))/mu(2)에 대해 p를 계산합니다. 원래 연도에 대해 결과를 플로팅합니다.

f = polyval(p,year,[],mu);
hold on
plot(year,f)
hold off

단순 선형 회귀 모델을 일련의 이산 2차원 데이터 점에 피팅합니다.

샘플 데이터 점 (x,y)로 구성된 벡터를 몇 개 만듭니다. 1차 다항식을 데이터에 피팅합니다.

x = 1:50; 
y = -0.3*x + 2*randn(1,50); 
p = polyfit(x,y,1); 

x의 점에서 피팅된 다항식 p를 계산합니다. 결과로 얻은 선형 회귀 모델을 데이터와 함께 플로팅합니다.

f = polyval(p,x); 
plot(x,y,'o',x,f,'-') 
legend('data','linear fit') 

데이터 점 집합에 선형 모델을 피팅하고 95% 예측 구간의 추정값을 포함하는 결과를 플로팅합니다.

샘플 데이터 점 (x,y)로 구성된 벡터를 몇 개 만듭니다. polyfit을 사용하여 1차 다항식을 데이터에 피팅합니다. 선형 피팅의 계수와 오차 추정값 구조체를 반환하는 2개의 출력값을 지정합니다.

x = 1:100; 
y = -0.3*x + 2*randn(1,100); 
[p,S] = polyfit(x,y,1); 

x의 점에서의 p의 1차 다항식 피팅을 계산합니다. polyval이 표준 오차의 추정값을 계산하도록 오차 추정값 구조체를 세 번째 입력값으로 지정합니다. 표준 오차 추정값이 delta에 반환됩니다.

[y_fit,delta] = polyval(p,x,S);

원래 데이터, 선형 피팅, 그리고 95% 예측 구간 y±2Δ를 플로팅합니다.

plot(x,y,'bo')
hold on
plot(x,y_fit,'r-')
plot(x,y_fit+2*delta,'m--',x,y_fit-2*delta,'m--')
title('Linear Fit of Data with 95% Prediction Interval')
legend('Data','Linear Fit','95% Prediction Interval')

입력 인수

모두 축소

쿼리 점으로, 벡터로 지정됩니다. x의 점은 y에 포함된, 피팅된 함수 값에 대응합니다. x가 벡터가 아닌 경우 polyfit은 이를 열 벡터 x(:)으로 변환합니다.

x에 반복되는(또는 거의 반복되는) 점이 있거나 x에 정규화가 필요할 수도 있는 경우 경고 메시지가 표시됩니다.

데이터형: single | double
복소수 지원 여부:

쿼리 점에 피팅되는 값으로, 벡터로 지정됩니다. y의 값은 x에 포함된 쿼리 점에 대응합니다. y가 벡터가 아닌 경우, polyfit은 이를 열 벡터 y(:)으로 변환합니다.

데이터형: single | double
복소수 지원 여부:

다항식 피팅의 차수로, 양의 정수 스칼라로 지정됩니다. np의 가장 왼쪽에 있는 계수의 다항식 차수를 지정합니다.

출력 인수

모두 축소

최소제곱 다항식의 계수로, 벡터로 반환됩니다. p의 길이는 n+1이며, n차 다항식의 계수를 지수에 대한 내림차순으로 나타냅니다. x 또는 yNaN 값이 포함되어 있고 n < length(x)이면 p의 모든 요소가 NaN이 됩니다.

polyval을 사용하여 쿼리 점에서 p를 계산합니다.

오차 추정값 구조체입니다. 선택 사항인 이 출력 구조체는 주로 오차 추정값을 구하기 위해 polyval 함수에 대한 입력값으로 사용됩니다. S는 다음 필드를 포함합니다.

필드설명
Rx의 방데르몽드 행렬에 대한 QR 분해의 (치환된) 삼각 R 인수
df자유도
normr잔차의 노름(Norm)

y의 데이터가 확률적 데이터인 경우 p의 공분산 행렬 추정값은 (Rinv*Rinv')*normr^2/df입니다. 여기서 RinvR의 역행렬입니다.

y 데이터의 오차가 독립적이며 일정한 분산을 갖는 정규분포를 이루는 경우 [y,delta] = polyval(...)은 예측의 최소 50%를 포함하는 오차 범위를 생성합니다. 즉, y ± delta에는 향후 x 관측값에 대한 예측값이 최소 50% 포함된다는 의미입니다.

정규화 값으로, 요소를 2개 가진 벡터로 반환됩니다. mu(1)mean(x)이고 mu(2)std(x)입니다. 이러한 값은 x의 쿼리 점 중심을 0에 두고 단위 표준편차를 적용합니다.

mupolyval에 대한 네 번째 입력값으로 사용하여 스케일링된 점 (x - mu(1))/mu(2)에서 p를 계산합니다.

제한 사항

  • 점 개수가 많은 문제에서, polyfit을 사용하여 다항식 피팅의 차수를 늘린다고 항상 더 잘 맞는 피팅이 생성되는 것은 아닙니다. 높은 차수의 다항식은 데이터 점 간 변동폭이 클 수 있으므로, 데이터에 잘 맞지 않는 피팅을 초래할 수 있습니다. 이러한 경우, 대체로 점 간의 변동폭이 더 완만한 낮은 차수의 다항식 피팅을 사용하거나 다른 기법을 문제에 따라 사용할 수 있습니다.

  • 기본적으로 다항식은 진동하는 비유계(Unbounded) 함수입니다. 따라서 유계 데이터나 단조(증가 또는 감소) 데이터를 외삽하기에는 적합하지 않습니다.

알고리즘

polyfitx를 사용하여 n+1개의 열과 m = length(x)개의 행을 갖는 방데르몽드 행렬(Vandermonde Matrix) V를 생성하며, 다음과 같은 선형 시스템을 도출합니다.

(x1nx1n11x2nx2n11xmnxmn11)(p1p2pn+1)=(y1y2ym),

여기서 polyfitp = V\y로 해를 구합니다. 방데르몽드 행렬의 열은 벡터 x의 지수이므로, 높은 차수의 피팅에서 V의 조건수가 종종 커지면서 특이 계수 행렬이 생성될 수 있습니다. 이러한 경우 정규화는 시스템의 수치적 속성을 향상시켜 더 안정적인 피팅을 생성할 수 있습니다.

확장 기능

참고 항목

| | | | | |

R2006a 이전에 개발됨