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

polyfit

다항식 곡선 피팅

구문

p = polyfit(x,y,n)
[p,S] = polyfit(x,y,n)
[p,S,mu] = polyfit(x,y,n)

설명

예제

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개로 구성된 벡터를 만들고, 이들 점에서 을 계산합니다.

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% 예측 구간 를 플로팅합니다.

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

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

쿼리 점에 피팅되는 값으로, 벡터로 지정됩니다. y의 값은 x에 포함된 쿼리 점에 대응합니다.

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

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

출력 인수

모두 축소

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

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

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

필드설명
Rx의 방데르몽드 행렬(Vandermonde Matrix)에 대한 QR 분해의 삼각 인자
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 이전에 개발됨