제 8 장 데이터 분석과 곡선접합 -...

51
8 데이터 분석과 곡선접합

Upload: others

Post on 26-Oct-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

제 8 장

데이터 분석과 곡선접합

데이터 분석

•데이터 정렬과 합: sort와 sum

• MATLAB은 데이터 분석과 처리를 위한 다양한 함수가 있음

• sum은 열의 합들을 포함하는 벡터를 반환

• sort는 행렬의 각 열의 원소들을 오름차순으로 정렬 (내림차순으로 정렬 시 ‘descend' 추가)

• 임의의 NaN 원소들은 가장 높은 부분에 위치 & 복소수 벡터는 절대값 순서

• 보기: 데이터가 벡터로 주어지는 경우

>> x = [4 -8 -2 1 0] x = 4 -8 -2 1 0 >> sort(x) ans = -8 -2 0 1 4 >> sum(x) ans = -5 >> x = [1+i -3-4i 2i 1]; >> sort(x,'descend') ans = -3.0000 - 4.0000i 0 + 2.0000i 1.0000 + 1.0000i 1.0000

• 데이터가 행렬로 주어지는 경우

>> A = [1 3 2;5 -2 4;6 0 3] A = 1 3 2 5 -2 4 6 0 3 >> sum(A) % 각 열의 합 ans = 12 1 9 >> sum(A(1,:)) % 1행의 합 ans = 6 >> sum(A(:,2)) % 2열의 합 ans = 1 >> sort(A) % 각 열들을 정렬 ans = 1 -2 2 5 0 3 6 3 4 >> sort(A(2,:)) % 2행을 정렬 ans = -2 4 5 >> sort(A(:,3)) % 3열을 정렬 ans = 2 3 4

• 최대와 최소: min과 max

• MATLAB 데이터 처리함수들을 행렬에 적용하는 경우 이 함수들은 열들에 대하여 작용

• 각 열의 최대값과 최소값을 포함하는 벡터들을 반환하며 NaN들은 무시

• 최소값과 최대값이 어느 성분에 위치하는지를 지정하는 두 번째 인수를 반환할 수 있음

>> A = [0 -1 2; 1 2 -4; 5 -3 -4] A = 0 -1 2 1 2 -4 5 -3 -4 >> max(A) ans = 5 2 2 >> [m,i] = min(A) m = 0 -3 -4 i = 1 3 2

• 하나의 열에 두 개 이상의 최소값들이 존재하는 경우에는 첫 번째 원소의 지수가 반환

• 행렬에서 가장 작은 원소는 min을 두 번 연이어 적용하여 얻을 수 있음

>> min(min(A)) ans = -4

• 차원이 2보다 큰 배열도 처리 가능

>> min(A(:)) ans = -4

• 함수 max와 min은 제 3의 인수를 통하여 행들에 작용 가능

>> max(A,[],2) ans = 2 2 5

• max(A,[ ],2)에서 2는 두 번째 차원에서의 최대값, 즉 열 지수에서의 최대값을 지정

• 인수가 두 개일 경우 max와 min은 두 인수들의 최대 원소와 최소 원소를 반환하기 때문에

두 번째의 빈 인수 [ ]가 필요

• 복소수 데이터의 경우 max와 min은 sort와 마찬가지로 절대값을 이용하여 크기를 측정

>> max(A,0) ans = 0 0 2 1 2 0 5 0 0

• 평균과 중간값: mean과 median

• mean은 평균, median은 중간값을 구할 때 사용

>> y = [2 -3 5 4 6 0 1 8]; >> mean(y) ans = 2.8750 >> median(y) ans = 3

• 행렬의 경우 mean(A)는 각 열에 대한 평균, mean(A,1)은 A의 1차원(열)에 대한 평균,

mean(A,2)는 A의 2차원(행)에 대한 평균을 계산 (median의 경우도 동일)

>> A = [1 3 2;5 -2 4;6 0 3] A = 1 3 2 5 -2 4 6 0 3

>> mean(A) ans = 4.0000 0.3333 3.0000 >> mean(A,1) ans = 4.0000 0.3333 3.0000 >> mean(A,2) ans = 2.0000 2.3333 3.0000 >> median(A) ans = 5 0 3 >> median(A,1) ans = 5 0 3 >> median(A,2) ans = 2 4 3

• 데이터 값의 차: diff

• diff 함수는 두 데이터 값 사이의 차이를 구할 때 사용

• 길이가 n인 벡터 x에 적용하면 길이가 n-1인 벡터 [x(2)-x(1) x(3)-x(2) ... x(n)-x(n-1)]가 생성

>> x = (1:8).^2 x = 1 4 9 16 25 36 49 64 >> y = diff(x) y = 3 5 7 9 11 13 15 >> z = diff(y) z = 2 2 2 2 2 2

• 실종값 NaN의 처리

• 데이터 분석에 있어서 NaN들은 종종 “실종된 값”, 즉 측정과정의 실수로부터 비롯될 수 있는

이용 불가능한 데이터를 나타내는 데에 사용

• 데이터를 가지고 부동 소수점 계산을 수행하기에 앞서 수반되는 계산으로부터는 NaN이 얻

어질 수 있기 때문에 NaN들을 제거하는 것이 필요

• 이러한 과정은 몇 가지 방법으로 수행할 수 있는데 어느 방법에서나 isnan 함수들이 사용

>> x = [2 1 NaN -1 6], y = x; x = 2 1 NaN -1 6 >> mean(x) ans = NaN >> x = x(~isnan(x)), mean(x) x = 2 1 -1 6 ans = 2 >> y(isnan(y)) = [ ], mean(y) y = 2 1 -1 6 ans =

• 통계분석

• 통계분석의 보기로서 아래와 같이 어느 회사의 나이에 따른 종업원 수 분포를 나타내는 데이터

를 고려함

나이 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

인원수 2 1 0 5 4 6 8 9 7 4 3 3 2 2 0 1 0 1

• 빈도수(인원수)와 나이 범위를 정의

>> freq = [2 1 0 5 4 6 8 9 7 4 3 3 2 2 0 1 0 1]; >> ages = 18:35;

• 나이에 따른 종업원수 분포:

• 함수 empdat를 수행한 결과

>> w = empdat(freq,ages) w = Columns 1 through 19 18 18 19 21 21 21 21 21 22 22 22 22 23 23 23 23 23 23 24 Columns 20 through 38 24 24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 26 26 26 Columns 39 through 57 26 26 26 26 27 27 27 27 28 28 28 29 29 29 30 30 31 31 33 Column 58 35

% empdat.m: 빈도수에 따른 데이터 배열 function x = empdat(empfreq, empage) x = []; for i = 1:length(empfreq) if empfreq(i) > 0 y = empage(i)*ones(1,empfreq(i)); else y = []; end x = [x,y]; end

• 함수 M-파일 empdat.m은 빈도수(인원수) 별로 나이를 배열한 데이터를 생성

• 함수 empdat를 수행하여 얻은 결과에 대한 평균, 중간값, 표준편차를 구함

>> avg = mean(w) avg = 25.0690 >> md = median(w) md = 25 >> sigma = std(w) sigma = 3.4175

• 조정된 빈도수의 막대그래프 :

평균은 약

• 빈도수(인원수)를 조정한 다음 가로축을 나이, 세로축을 조정된 빈도수로 하는 막대그래프로

나타냄

>> area = sum(freq) >> scaledfreq = freq/area; >> bar(ages, scaledfreq), xlabel('나이'), ylabel('조정된 빈도수')

• 데이터 분포곡선:

23 23.5 24 24.5 25 25.5 26 26.5 270

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1exp(-(x-avg)2)

x

• 위의 데이터에 대한 분포곡선은 Gauss 곡선모양을 나타냄

>> x = 23:0.1:27; >> distx = exp(-(x-avg).^2); >> plot(x,distx) >> title('exp(-(x-avg)^2)') >> xlabel x

• 돌출데이터의 처리와 고르기

• 톨게이트 통과차량 :

시간 톨게이트 A 톨게이트 B 톨게이트 C

03:00~04:00 12 11 9

04:00~05:00 8 14 11

05:00~06:00 14 17 20

06:00~07:00 11 13 9

07:00~08:00 43 51 69

08:00~09:00 38 88 115

09:00~10:00 28 36 55

10:00~11:00 12 12 14

11:00~12:00 18 27 30

12:00~13:00 18 19 29

13:00~14:00 17 15 18

14:00~15:00 19 36 48

15:00~16:00 32 47 10

16:00~17:00 42 65 151

17:00~18:00 114 145 257

18:00~19:00 35 58 68

19:00~20:00 13 9 15

20:00~21:00 11 12 15

21:00~22:00 10 9 7

• 3곳의 고속도로 톨게이트에서 매 시간당 통과한 차량의 수를 조사한 것

• 표의 데이터를 다음과 같이 traffic.dat 파일에 저장

• 보기: % traffic.dat: 3개 톨게이트 통과차량 12 11 9 8 14 11 14 17 20 11 13 9 43 51 69 38 88 115 28 36 55 12 12 14 18 27 30 18 19 29 17 15 18 19 36 48 32 47 10 42 65 151 114 145 257 35 58 68 13 9 15 11 12 15 10 9 7

• 데이터의 각 열을 a1, a2, a3에 저장

• 세 번째 열을 대상으로 하는 경우 이 열에 대한 평균( )과 표준편차( )를 구 를 벗어

나는 값을 오류라고 간주한다면 이 값의 위치에 NaN을 삽입

>> a1 = traffic(:,1); a2 = traffic(:,2); a3 = traffic(:,3);

>> mu3 = mean(a3);

>> sig3 = std(a3);

>> peak = (a3-mu3) > 2*sig3; % 돌출데이터를 탐색

>> a3m = a3; % a3를 a3m에 복사

>> a3m(peak) = NaN; % 돌출데이터 위치에 NaN 값을 부여

>> plot(a3m,'o-')

• 돌출 데이터 위치에 NaN을 삽입한 그래프:

0 2 4 6 8 10 12 14 16 18 200

20

40

60

80

100

120

140

160

• MATLAB의 convn(또는 filter) 함수를 이용하여 간단한 고르기(smoothing) 연산을 적용

>> hold on >> span = 3; >> window = ones(span,1)/span; >> sma3m = convn(a3m,window,'same'); >> h = plot(sma3m,'o:'); >> legend('Data','Smoothed data') >> hold off

• (filter 함수를 이용)

>> fma3m = filter(window,1,a3m); >> plot(fma3m,'o:');

• 고르개를 적용한 데이터 그래프:

0 2 4 6 8 10 12 14 16 18 200

20

40

60

80

100

120

140

160

Data

Smoothed data

• MATLAB의 기본적인 데이터 분석함수들:

함수 기능

max 가장 큰 성분

min 가장 작은 성분

mean 평균값

median 중간값

std 표준편차

var 분산

sort 오름차순으로 정렬

sum 원소들의 합

prod 원소들의 곱

cumsum 원소들의 누적합

cumprod 원소들의 누적곱

diff 원소들의 차

분산 데이터의 그래프

• MATLAB의 scatter 함수는 분산된 데이터 점들을 작은 원으로 나타내어 줌

• 앞의 톨게이트 A와 B를 통과하는 차량들을 scatter 함수를 이용

>> load traffic

>> a1 = traffic(:,1); a2 = traffic(:,2);

>> scatter(a1,a2,'filled')

>> xlabel('톨게이트 A'), ylabel('톨게이트 B')

• 두 톨게이트 통과차량의 수:

• 두 변수 a1과 a2 사이의 선형관계의 정도는 공분산(共分散, covariance)에 의하여 측정

• 공분산은 MATLAB 함수 cov를 이용하여 얻음

>> a12 = cov([a1 a2]) a12 = 1.0e+003 * 0.5859 0.7997 0.7997 1.2042

• 위에서 얻어지는 행렬에서 (i,j) 위치의 원소값은 i 번째와 j 번째 변수들의 공분산을 나타냄

• 공분산 값은 변수들의 측정에 이용된 단위에 따라 좌우된다는 단점

• 공분산 값을 표준편차로 나누어 +1과 -1 사이로 조정하여 다시 나타내는 것이 편리

• MATLAB 함수 corrcoef에 의하여 계산

>> R12 = corrcoef([a1 a2]) R12 = 1.0000 0.9520 0.9520 1.0000 >> r12 = R12(1,2) % 상관계수 r12 = 0.9520 >> r12sq = r12^2 % 결정계수 r12sq = 0.9063

• 세 곳의 톨게이트 모두에서의 통과차량에 대한 3차원 분산 그래프는 MATLAB 함수 scatter3

을 이용

>> load traffic >> a1 = traffic(:,1); a2 = traffic(:,2); a3 = traffic(:,3); >> scatter3(a1,a2,a3,'filled') >> xlabel('톨게이트 A'), ylabel('톨게이트 B'), zlabel('톨게이트 C‘)

• 세 톨게이트 통과차량의 수:

• 3차원 분산 그래프에 나타낸 변수들 간의 선형관계의 강도는 eig 함수를 이용하여 공분산 행렬

의 고유치를 계산 >> vars = eig(cov([a1 a2 a3])) vars = 1.0e+003 * 0.0374 0.1183 5.6806 >> scalvar = max(vars)/sum(vars) scalvar = 0.9733

0 100 200 3000 50 100 1500 50 100 150

0

100

200

300

0

50

100

150

0

50

100

150

• 세 톨게이트 통과차량 사이의 관계:

• 고유치들은 데이터의 주성분에 따른 공분산

• scalvar는 데이터의 축을 따라 첫 번째 주성분으로 표현되는 분산비율을 보여줌

• plotmatrix 함수를 이용하면 여러 톨게이트 상호간의 관계를 비교가능

>> clf >> plotmatrix(traffic)

분산 데이터의 삼각화와 안짐작

• MATLAB Command Window(명령어 창)에서 다음을 입력하면 seamount 데이터 집합을 불

러옴

>> load seamount

• seamount 데이터 집합은 남태평양의 Louisville Ridge 상의 48.2 S와 148.8 W에 위치한

LR148.8W로 분류된 바다 속 산의 표면을 나타내는 1984년의 자료

• 최근접점 문제의 해석과 기하학적 분석에서는 다음과 같은 기법들이 사용

볼록한 꼭지

Delaunay 삼각화

Voronoi 도표

• 볼록한 꼭지

• MATLAB의 convhull 함수는 데이터 집합의 볼록한 꼭지를 이루는 점들의 인수를 반환

• seamount 데이터를 불러오고 경도(x)와 위도(y)를 분산 그래프로 나타내어 볼록한 꼭지를 생

성하고 plot을 이용하여 convhull으로부터의 출력을 꼭지를 보여주는 그래프

>> load seamount >> plot(x,y,'.','markersize',10) >> k = convhull(x,y); >> hold on >> plot(x(k),y(k),'-r') >> hold off >> grid on

• seamount 데이터의 꼭지 그래프:

210.8 210.9 211 211.1 211.2 211.3 211.4 211.5 211.6 211.7 211.8-48.45

-48.4

-48.35

-48.3

-48.25

-48.2

-48.15

-48.1

-48.05

-48

-47.95

• 등고선 그래프

• meshgrid, griddata와 contour를 사용하여 seamount 데이터의 등고선 그래프

>> load seamount >> [xi,yi] = meshgrid(210.8:.01:211.8, -48.5:.01:-47.9); >> zi = griddata(x,y,z,xi,yi,'cubic'); >> [c,h] = contour(xi,yi,zi,'b-'); >> clabel(c,h) >> xlabel('Longitude'), ylabel('Latitude')

• seamount 데이터의 등고선 그래프:

-400

0

-4000

-4000

-400

0

-4000

-4000

-350

0

-3500

-3500

-3500

-3000

-3000

-3000

-2500

-2500

-2000

-2000

-1500-1000

Longitude

Latitu

de

210.8 210.9 211 211.1 211.2 211.3 211.4 211.5 211.6 211.7 211.8-48.5

-48.4

-48.3

-48.2

-48.1

-48

-47.9

• 데이터는 3차원이므로 볼록한 꼭지를 이루는 면들은 삼각형

• C의 원소들은 X의 점들의 인수들

• 예를 들면 첫 번째 행 4 1 2 는 첫 번째 삼각형의 꼭지점이 X(4,:), X(1,:), 그리고 X(2,:) 임을

의미

• 3차원 볼록한 꼭지의 경우 trisurf를 이용하여 출력을 그래프로 나타낼 수 있음

• patch를 이용하면 면들의 색을 보다 잘 제어가능. (n > 3 이면 convhulln의 출력 불가능)

convpatch.m은 삼각형들을 3차원 조각들로 나타냄으로써 볼록한 꼭지를 도시

% convpatch.m: 삼각형들의 3차원 조각 표현 clear all; d = [-1 1]; [x,y,z] = meshgrid(d,d,d); X = [x(:),y(:),z(:)]; % 정육면체의 8개 꼭지점 C = convhulln(X); figure, hold on d = [1 2 3 1]; % C 열에 대한 인수 for i = 1:size(C,1) % 각 삼각형을 도시 j = C(i,d); % i번째 C를 취하여 조각을 구성 h(i) = patch(X( j,1),X( j,2),X( j,3),i,'FaceAlpha',0.9); end % 'FaceAlpha'를 이용하여 투명하게 한다 hold off view(3), axis equal, axis off camorbit(90,-5); % 다른 각도에서 보기 title('Convex hull of a cube') • 삼각형들의 3차원 조각표현:

• Delaunay 쪽매붙임

• Delaunay 쪽매붙임은 심플렉스(단순체, 單純體)들의 집합으로서 각 심플렉스에 대하여 그 심

플렉스를 외접하는 유일한 구는 데이터 점들을 포함하지 않는다는 성질을 가짐

• (심플렉스는 2차원 공간: 삼각형, 3차원 공간: 사면체)

• delaunayn 함수는 데이터 집합의 n 차원 Delaunay 쪽매붙임의 심플렉스들을 구성하는 데이

터 집합에서 점들의 인수들을 반환

• 볼록한 꼭지에 대한 보기에서와 동일한 x, 즉 정육면체의 8개 꼭지점들과 중심점을 사용

데이터의 다항식 접합

• 데이터 접합문제에서는 주어진 데이터를 가장 잘 나타내는 다항식을 찾는 것이 주된 목적이

며 이를 위하여 polyfit 함수가 이용

• 데이터 에서 는 모두 서로 다른 값을 가진다고 가정하고

이도록 차수 n 이하의 다항식 p를 구한다고 함

• polyfit 함수는 최소자승 다항식 접합을 계산 즉, 가 최소가 되도록 p를

결정

• 이 함수는 p = polyfit(x,y,n) 과 같이 사용

• 이도록 차수 n을 정하면 안짐작 다항식 이 생성되므로 다

항식 접합은 데이터를 정확하게 접합

• 고차의 다항식들은 극히 심한 진동을 보이므로 일반적으로 작은 값의 n이 우선

• 주어진 데이터에 대하여 4차의 최소자승 다항식 접합을 계산한 후 그래프로 나타냄

• 데이터로는 구간 [-2,2]상의 간격이 동일한 20개 위치(linspace로 생성)에서 계산된 함수

의 값들을 이용

% poly4.m : 주어진 데이터에 대한 4차 다항식 접합 x = linspace(-2,2,20); y = 1./(x+(1-x).^2); p = polyfit(x,y,4); v = linspace(-2,2,100); w = polyval(p,v); plot(x,y,'.',v,w,'-','MarkerSize',30,'LineWidth',2)

• 4차의 최소자승 다항식 접합. 데이터는 로부터 생성:

• 앞의 톨게이트 통과차량 수를 잘 나타내는 다항식을 구하여 봄.

• 톨게이트 C에서의 데이터를 이용

>> load traffic >> a3 = traffic(:,3); >> [n m] = size(a3); >> x = (1:n)'; >> coef = polyfit(x,a3,6) >> clf >> plot(a3,'o-') >> hold on >> xfit = (1:0.01:n)'; >> yfit = polyval(coef,xfit); >> plot(xfit,yfit,'r-','LineWidth',2); >> legend('Data','Polynomial fit','Location','NW') coef =

0.0025 -0.1488 3.4017 -36.7108 188.7866 -404.5887 274.2291

• 톨게이트 통과차량의 다항식 접합:

0 2 4 6 8 10 12 14 16 18 20-50

0

50

100

150

200

250

300

Data

Polynomial fit

• 다항식 접합으로부터 주어진 데이터가 대략 8시간의 주기를 지니며 t=5.5 정도에서 정점에

이르는 sine 함수 모양을 나타냄

• 주어진 데이터를 근사적으로 의 형태로 나타낼 수 있음

• 이 형태는 a와 b에 대하여 선형이므로 백슬래쉬(\) 연산자를 이용하여 a와 b 계산 가능

>> load traffic >> a3 = traffic(:,3); >> [n m] = size(a3); >> x = (1:n)'; >> f = [ones(size(x)) cos((2*pi/8)*(x-5.5))]; >> abcoef = f\a3; >> clf >> plot(a3,'o-') >> hold on >> xfit = (1:0.01:n)'; >> yfit = [ones(size(xfit)) cos((2*pi/8)*(xfit-5.5))]*abcoef; >> plot(xfit,yfit,'r-','LineWidth',2) >> legend('Data','Sinusoidal fit','Location','NW')

• 톨게이트 통과차량의 sine 곡선 접합:

0 2 4 6 8 10 12 14 16 18 200

50

100

150

200

250

300

Data

Sinusoidal fit

• MATLAB 함수 lscov를 이용하면 최소자승 방법에 의한 풀이에서의 계수의 추정 표준오차

(stdx)와 평균 제곱오차(mse)들 계산 가능

>> [abcoef,stdx,mse] = lscov(f,a3) abcoef =

55.1668 44.0137

stdx = 13.1356 18.2402

mse = 3.1912e+003

안짐작(Interpolation)

• Lagrange 안짐작 다항식

• 평면상의 두 점 과 (단 )는 유일한 x의 일차식을 결정하며 이 식

의 그래프는 이들 두 점을 지남

• 다항식에 대한 다른 공식들이 많이 있지만 이들 모두 동일한 직선을 나타내므로 두 점 이상

으로 일반화함

• 평면상에 가 모두 서로 다른 n개의 점 가 주어졌다면 이들을 지나는 n차 이하의

x의 유일한 다항식이 존재

• 이러한 다항식은 주어진 데이터 를 정확하게 재생시켜 주므로 안

짐작 다항식이라 함

• 안짐작 다항식의 가장 간결한 표현은 다음과 같은 Lagrange 형태

• n 개의 항이 합해지며 각 항에는 n-1개의 항이 곱해져 있으므로 이 표현은 n-1차의 다항식을

정의

>> x = 0:3; >> y = [-5 -6 -1 16]; >> x,y x = 0 1 2 3 y = -5 -6 -1 16

• 이 데이터에 대한 Lagrange 다항식:

• 각 항은 차수가 3이므로 전체 합 역시 차수가 많아야 3이며 최고차항이 남아 있으므로 실제

차수는 3

• 만일 x=0, 1, 2, 혹은 3을 대입하면 전체 항들에서 3개의 항들이 없어지고 남아있는 네 번째

항은 데이터의 해당되는 값

• lagrpoly는 입력벡터 u의 모든 성분들에서 Lagrange 다항식 값을 계산

% lagrpoly.m : Lagrange 다항식 계산 function v = lagrpoly(x,y,u) n = length(x); v = zeros(size(u)); for k = 1:n w = ones(size(u)); for j = [1:k-1 k+1:n] w = (u-x( j))./(x(k)-x( j)).*w; end v = v + w*y(k); end

• 다음 코드로부터 Lagrange 다항식 계산결과를 얻음

>> x = 0:3; >> y = [-5 -6 -1 16]; >> u = -.25:.01:3.25; >> v = lagrpoly(x,y,u); >> plot(x,y,'o',u,v,'-')

• Lagrange 다항식 계산결과:

-0.5 0 0.5 1 1.5 2 2.5 3 3.5-10

-5

0

5

10

15

20

25

• 기호변수를 이용하면 lagrploy로부터 다음 결과를 얻음

>> sx = sym('x'); >> p = lagrpoly(x,y,sx) p =

-5*(-1/3*x+1)*(-1/2*x+1)*(-x+1)-6*(-1/2*x+3/2)*(-x+2)*x-1/2*(-x+3)*(x-1)*x+16/3*(x-2)*(1/2*x-1/2)*x

>> pretty(p) -5 (- 1/3 x + 1) (- 1/2 x + 1) (-x + 1) - 6 (- 1/2 x + 3/2) (-x + 2) x

- 1/2 (-x + 3) (x - 1) x + 16/3 (x - 2) (1/2 x - 1/2) x >> P = simplify(p) P =

x^3-2*x-5

• 1차원 안짐작

• MATLAB은 1차원, 2차원, 그리고 그 이상의 차원에서의 안짐작을 위한 함수들을 지니고 있음

• 1차원 안짐작의 경우 함수 interp1은 x(i), y(i) 데이터 쌍들과 벡터 xi를 받아들임

• 이 함수는 안짐작항을 데이터에 접합시키고 xi의 점들에서 안짐작항 값들을 반환

yi = interp1(x,y,xi)

• 벡터 x는 단조증가하는 원소들을 가져야 하며 네 번째 입력 파라미터에 의하여 몇 가지 형태

의 안짐작항들이 지원되며 주로 다음과 같은 것들이 선택됨

‘nearest' : 가장 근접한 이웃 안짐작

‘linear' : 선형 안짐작(기본)

‘spline' : 3차 스플라인 안짐작

‘pchip' : 구분적인 3차 Hermite 안짐작

•선형 안짐작은 인접한 데이터 쌍들 사이를 선분으로 연결하는 반면에 가장 근접한 이웃 안짐

작에서는 가장 근접한 x 점에 대한 y 값이 다시 생성

• interp1Exam.m은 interp1의 사용을 예시

• 구간 [ ] 상에서 5개의 점들을 취하여 위에서 언급한 4가지 방법을 사용하여 안짐작항

들을 구함

• 그 구간의 40개 점들에서 안짐작항들의 값을 계산

• 실선으로 나타나는 원들은 x(i), y(i) 데이터 쌍들을 그래프로 기호들은 안짐작항들을 나타냄

% interp1Exam.m : interp1 옵션들의 사용예 clear all x = [0 pi/4 3*pi/8 3*pi/4 pi]; y = sin(x); xi = linspace(0,pi,40)'; yn = interp1(x,y,xi,'nearest'); yl = interp1(x,y,xi,'linear'); ys = interp1(x,y,xi,'spline'); yp = interp1(x,y,xi,'pchip'); v = linspace(0,pi,50); plot(xi,yn,'*',xi,yl,'+',xi,ys,'v',xi,yp,'o') legend('nearest','linear','spline','pchip') hold on plot(v,sin(v),'-',x,y,'.k','MarkerSize',30) set(gca,'XTick',x), set(gca,'XTickLabel','0|pi/4|3pi/8|3pi/4|pi') set(gca,'XGrid','on') axis([-0.25 3.5 -0.1 1.1]) hold off

• interp1을 이용한 5 점들에서의 sine 곡선의 안짐작:

0 pi/4 3pi/8 3pi/4 pi

0

0.2

0.4

0.6

0.8

1nearest

linear

spline

pchip

• 2차원 안짐작

• MATLAB은 2차원 안짐작을 위한 griddata와 interp2의 2개 함수들을 지님

• griddata는 다음과 같이 사용

Z = griddata(x,y,z,X,Y)

• 여기에서 벡터 x, y 및 z는 데이터이며 Z는 보통 meshgrid에 의하여 생성되는 행렬 X와 Y에

해당되는 안짐작된 값들의 행렬

• 여섯 번째의 문자열 입력인수는 방법을 지정함

‘linear' : 삼각형 기반 선형 안짐작(기본)

‘cubic' : 삼각형 기반 3차 안짐작

‘nearest' : 가장 근접한 이웃 안짐작

• 함수 interp2는 유사한 인수 목록을 갖지만 x와 y는 meshgrid에 의하여 생성된 단조 행렬들

이어야 함

• int2D.m는 griddata를 사용하여 표면상의 점들을 안짐작하는 예시

• 원래의 데이터 점들은 원으로 나타나 있으며 안짐작된 표면은 그물망으로 표시

% int2D.m : 2차원 안짐작의 보기 x = rand(100,1)*4-2; y = rand(100,1)*4-2; z = x.*exp(-x.^2-y.^2); h = -2:.1:2; [X,Y] = meshgrid(h); Z = griddata(x,y,z,X,Y); mesh(X,Y,Z), hold on plot3(x,y,z,'o'), hold off

• griddata를 이용한 2차원 안짐작:

• 다차원 데이터의 안짐작

• griddatan 함수를 이용하여 다차원 데이터, 특히 분산 데이터를 안짐작함

• griddatan은 delaunayn 함수를 이용하여 데이터를 쪽매붙인 다음 이를 근거로 안짐작을 수행

• n 개의 분산 데이터의 집합에서 구한 함수를 가시화한다고 가정

• X는 점들의 n x 3 행렬로서 각 행은 하나의 점에 대한 (x,y,z) 좌표를 포함

• 벡터 v는 이 점들에서의 n 개 함수값들을 포함

• 함수는 원점으로부터의 거리의 제곱임

• 3차원 공간에서 n=5000 개의 불규칙 점들을 생성하는 것으로 시작하여 이 점들에서 함수의 값

을 계산

% ndimint.m: n차원 데이터의 안짐작 n = 5000; X = 2*rand(n,3)-1; % 5000 개의 불규칙 점들을 생성 v = sum(X.^2,2); % 함수값(거리의 제곱)을 계산 delta = 0.05; d = -1:delta:1; [x0,y0,z0] = meshgrid(d,d,d); %격자를 생성 X0 = [x0(:), y0(:), z0(:)]; v0 = griddatan(X,v,X0); % 안짐작을 수행 v0 = reshape(v0, size(x0)); % 함수가 일정한 값을 취하는 (x,y,z) 값들로 구성되는 면을 가시화 p = patch(isosurface(x0,y0,z0,v0,0.6)); isonormals(x0,y0,z0,v0,p); % 일정한 값에서의 표면은 구 set(p,'FaceColor','red','EdgeColor','none'); view(3); camlight; lighting phong axis equal title('Interpolated sphere from scattered data')

• 분산 데이터의 안짐작:

• 다른 안짐작 함수들로서 3차원 및 n차원 안짐작을 위한 interp3, griddata3, 그리고 interpn

안짐작함수 기능

pchip 구분적인 3차 Hermite 안짐작 다항식

interp1 1차원 안짐작

interp1q 고속 1차원 안짐작

interpft 빠른 Fourier 변환을 사용한 1차원 안짐작

interp2 2차원 안짐작

interp3 3차원 안짐작

interpn 다차원 안짐작

griddata 데이터의 격자화와 표면 근사

griddata3 3차원 데이터의 격자화와 가상표면 접합

griddatan 차원이 3이상인 데이터의 격자화와 가상표면 접합

mkpp 구분적인(piecewise) 다항식 구성

ppval 구분적인 다항식 계산

spline 3차원 스플라인 데이터 안짐작

unmkpp 구분적인 세부 다항식

• MATLAB의 안짐작 함수:

spline을 이용한 안짐작

• “spline"(운형(雲形)자)이라는 용어는 제도에서 사용되는 도구를 의미

• 이 도구는 가늘고 구부러질 수 있는 나무나 플라스틱 도구로서 주어진 데이터 점들을 지나면

서 점들 사이에 부드러운 곡선을 형성하여 줌

• 물리적인 스플라인은 안짐작 제약조건들에 따라 포텐셜 에너지를 최소

• 이에 해당되는 수학적 스플라인은 2차미분이 연속이어야 하며 동일한 안짐작 제약조건들을

만족

• 스플라인의 꺾임점들은 결절이라고도 부름.

• MATLAB의 spline 함수는 주어진 데이터에 대하여 정확한 안짐작이 요구되는 경우에 사용

• 이 함수는 3차 스플라인 를 데이터 에 접합시킨다. 는 다음과

같은 성질을 갖음:

는 연이은 한 쌍의 위치 와 사이의 3차 다항식이다

(즉 구분적인 3차 다항식이다).

(즉 는 데이터를 안짐작한다).

는 점 에서 연속의 1차 및 2차 미분을 갖는다

(즉 3차 구간이 부드럽게 연결된다).

• 데이터 벡터 x와 y가 주어지면 q = spline(x,y,t)는 t로 주어지는 점들에서의 스플라인 값 벡

터 q를 반환

• 3차 스플라인을 앞의 다항식 접합에 대한 보기의 데이터에 접합

% splineExam.m : 주어진 데이터에 대한 3차 spline 접합 clear all x = linspace(-2,2,20); y = 1./(x+(1-x).^2); v = linspace(-2,2,100); w = spline(x,y,v); plot(x,y,'.',v,w,'-','MarkerSize',30,'LineWidth',2) legend('데이터','spline접합')

• 스플라인 접합. 데이터는 로부터 생성

• MATLAB의 또 다른 안짐작 함수인 pchip 함수는 구분적인 다항식 안짐작을 위한 함수. 이 함

수는 그의 2차미분이 일반적으로 연속이 아닌 구분적인 3차 다항식 p(x)를 생성

• pchip 함수는 데이터의 형상과 단조성을 모두 유지하는데 이는 데이터가 단조인 구간에서는

p 역시 단조이며 데이터가 국부적 극값을 갖는 점들에서는 p 역시 마찬가지임을 의미

• spline과 pchip 함수를 비교

% compSP.m : spline과 pchip의 비교 clear all x = [-12:4:12]; y = atan(x); t = [-12:.1:12]; p = pchip(x,y,t); s = spline(x,y,t); plot(x,y,'o',t,p,'-',t,s,'-.','LineWidth',1.25) xlim([-12 12]) legend('data','pchip','spline','Location','NW')

-10 -5 0 5 10-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

data

pchip

spline

• pchip와 spline에 의한 안짐작:

• spline은 부드럽지만 처음 세 점들과 마지막 세 점들 사이에서 진동을 보임

• pchip은 진동을 보이지 않지만 앞의 데이터 점들에서 부드러움이 약간 덜함