polyfit
다항식 곡선 피팅
설명
예제
삼각 함수에 다항식 피팅
구간 [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차 다항식을 피팅합니다. polyfit
은 year
의 데이터 중심을 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
— 쿼리 점
벡터
쿼리 점으로, 벡터로 지정됩니다. x
의 점은 y
에 포함된, 피팅된 함수 값에 대응합니다. x
가 벡터가 아닌 경우 polyfit
은 이를 열 벡터 x(:)
으로 변환합니다.
x
에 반복되는(또는 거의 반복되는) 점이 있거나 x
에 정규화가 필요할 수도 있는 경우 경고 메시지가 표시됩니다.
데이터형: single
| double
복소수 지원 여부: 예
y
— 쿼리 점에 피팅되는 값
벡터
쿼리 점에 피팅되는 값으로, 벡터로 지정됩니다. y
의 값은 x
에 포함된 쿼리 점에 대응합니다. y
가 벡터가 아닌 경우, polyfit
은 이를 열 벡터 y(:)
으로 변환합니다.
데이터형: single
| double
복소수 지원 여부: 예
n
— 다항식 피팅의 차수
양의 정수 스칼라
다항식 피팅의 차수로, 양의 정수 스칼라로 지정됩니다. n
은 p
의 가장 왼쪽에 있는 계수의 다항식 차수를 지정합니다.
출력 인수
p
— 최소제곱 다항식 계수
벡터
최소제곱 다항식의 계수로, 벡터로 반환됩니다. p
의 길이는 n+1
이며, n
차 다항식의 계수를 거듭제곱 내림차순으로 나타냅니다. x
또는 y
에 NaN
값이 포함되어 있고 n < length(x)
이면 p
의 모든 요소가 NaN
이 됩니다. 데이터 정규화를 위해 3개 출력 인수를 지정하면, 데이터가 정규화되지 않은 경우와 달리 polyfit
은 p
에 서로 다른 계수를 반환합니다.
polyval
을 사용하여 쿼리 점에서 p
를 계산합니다.
S
— 오차 추정값 구조체
구조체
오차 추정값 구조체입니다. 선택 사항인 이 출력 구조체는 주로 오차 추정값을 구하기 위해 polyval
함수에 대한 입력값으로 사용됩니다. S
는 다음 필드를 포함합니다.
필드 | 설명 |
---|---|
R | x 의 방데르몽드 행렬에 대한 QR 분해의 (치환된) 삼각 R 인수 |
df | 자유도 |
normr | 잔차의 노름(Norm) |
y
의 데이터가 확률적 데이터인 경우 p
의 공분산 행렬 추정값은 (Rinv*Rinv')*normr^2/df
입니다. 여기서 Rinv
는 R
의 역행렬입니다.
y
데이터의 오차가 독립적이며 일정한 분산을 갖는 정규분포를 이루는 경우 [y,delta] = polyval(...)
은 예측의 최소 50%를 포함하는 오차 범위를 생성합니다. 즉, y
± delta
에는 향후 x
관측값에 대한 예측값이 최소 50% 포함된다는 의미입니다.
mu
— 정규화 값
요소를 2개 가진 벡터
정규화 값으로, 요소를 2개 가진 벡터로 반환됩니다. mu(1)
은 mean(x)
이고 mu(2)
는 std(x)
입니다. 이러한 값은 x
의 쿼리 점 중심을 0에 두고 단위 표준편차를 적용합니다.
mu
를 polyval
에 대한 네 번째 입력값으로 사용하여 스케일링된 점 (x - mu(1))/mu(2)
에서 p
를 계산합니다.
제한 사항
점 개수가 많은 문제에서,
polyfit
을 사용하여 다항식 피팅의 차수를 늘린다고 항상 더 잘 맞는 피팅이 생성되는 것은 아닙니다. 높은 차수의 다항식은 데이터 점 간 변동폭이 클 수 있으므로, 데이터에 잘 맞지 않는 피팅을 초래할 수 있습니다. 이러한 경우, 대체로 점 간의 변동폭이 더 완만한 낮은 차수의 다항식 피팅을 사용하거나 다른 기법을 문제에 따라 사용할 수 있습니다.기본적으로 다항식은 진동하는 비유계(Unbounded) 함수입니다. 따라서 유계 데이터나 단조(증가 또는 감소) 데이터를 외삽하기에는 적합하지 않습니다.
알고리즘
polyfit
은 x
를 사용하여 n+1
개의 열과 m = length(x)
개의 행을 갖는 방데르몽드 행렬(Vandermonde Matrix) V
를 생성하며, 다음과 같은 선형 시스템을 도출합니다.
여기서 polyfit
은 p = V\y
로 해를 구합니다. 방데르몽드 행렬의 열은 벡터 x
의 지수이므로, 높은 차수의 피팅에서 V
의 조건수가 종종 커지면서 특이 계수 행렬이 생성될 수 있습니다. 이러한 경우 정규화는 시스템의 수치적 속성을 향상시켜 더 안정적인 피팅을 생성할 수 있습니다.
확장 기능
tall형 배열
메모리에 담을 수 없을 정도로 많은 행을 가진 배열을 계산할 수 있습니다.
C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.
사용법 관련 참고 및 제한 사항:
Variable-Sizing Restrictions for Code Generation of Toolbox Functions (MATLAB Coder) 항목을 참조하십시오.
스레드 기반 환경
MATLAB®의 backgroundPool
을 사용해 백그라운드에서 코드를 실행하거나 Parallel Computing Toolbox™의 ThreadPool
을 사용해 코드 실행 속도를 높일 수 있습니다.
이 함수는 스레드 기반 환경을 완전히 지원합니다. 자세한 내용은 스레드 기반 환경에서 MATLAB 함수 실행하기 항목을 참조하십시오.
GPU 배열
Parallel Computing Toolbox™를 사용해 GPU(그래픽스 처리 장치)에서 실행하여 코드 실행 속도를 높일 수 있습니다.
이 함수는 GPU 배열을 완전히 지원합니다. 자세한 내용은 GPU에서 MATLAB 함수 실행하기 (Parallel Computing Toolbox) 항목을 참조하십시오.
분산 배열
Parallel Computing Toolbox™를 사용하여 대규모 배열을 클러스터의 결합된 메모리에 걸쳐 분할할 수 있습니다.
이 함수는 분산 배열을 완전히 지원합니다. 자세한 내용은 분산 배열을 사용하여 MATLAB 함수 실행 (Parallel Computing Toolbox) 항목을 참조하십시오.
버전 내역
R2006a 이전에 개발됨
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)