지난 강의 Lecture 17-(1)에 이어 직교행렬과 그람-슈미트 과정 두 번째 강의다. 반드시 이전 강의에서 직교행렬(orthogonal matrix)을 공부하고 오기를 추천한다. 이제 그람-슈미트 과정(Gram-Schmidt Process)에 대해 공부해보도록 하자. 

 

 

4. 그람-슈미트 과정(Gram-Schmidt Process)

 

지난 강의의 마지막 부분에서 잠깐 언급했듯이, 그람-슈미트 과정(Gram-Schmidt Process)은 어떤 임의의 행렬 A의 column vector를 orthonormal column들로 바꾸는 것이다. 즉 행렬 A를 정규직교벡터(orthonormal vector)들로 이루어진 직교 행렬(orthogonal matrix) Q로 만드는 것이다. 이때 중요한 조건은 A의 column vector들이 독립(independent)이어야 한다. 아래 그림을 보자. 

 

 

Fig. 1 두 개의 독립(independent)인 벡터

 

 

Fig. 1은 두 개의 독립(independent)인 벡터를 나타낸다. 두 벡터 a와 b를 임의의 차원의 공간에서 2차원을 정의하는 기저벡터라고 하자. a와 b는 독립이기 때문에 분명 선형조합(Linear combination)을 통해 2차원 공간의 모든 벡터를 나타낼 수는 있다. 그러나 보다 효과적인 연산, 간단한 연산을 위해 이들을 똑같은 공간을 정의하는 정규직교벡터(orthonormal vector)로 만들고 싶은 것이다. 그람-슈미트 과정은 이렇게 독립인 벡터들을 정규직교벡터로 만들어준다. 

 

그람-슈미트 과정의 아이디어는 다음과 같다. 먼저 맨 처음 벡터인 a는 그대로 두고 시작한다. 이 a를 기준으로 a에 직교(orthogonal)한 벡터를 만들어낸다. 이를 각각 q1, q2라고 하자. 즉 a->q1, b->q2로 만드는 것이다. 여기까지 그람(Gram)의 아이디어다. 다음으로 할 일은 직교 벡터인 q1, q2를 정규직교벡터(orthonormal vector)로 만드는 것이다. 이는 q1과 q2를 각각 자신의 크기로 나누어주면 된다. 이것이 슈미트(schmidt)의 아이디어다. 지금까지의 과정을 정리하면 아래와 같다. 

 

Fig. 2 그람-슈미트(Gram-Schmidt)의 과정

 

 

- (1) Making Orthogonal Vectors (by Gram)

 

이제 Fig. 1의 두 벡터 a와 b를 가지고 그람-슈미트 과정을 수행해보자. 먼저 벡터 a는 그대로 q1이 된다. 마치 초기값과 같은 것이다. a->q1으로 변하는 과정은 전혀 문제가 없다. 문제는 b->q2의 과정이다. 왜냐하면 b는 a에 직교하지 않기 때문이다. 우리가 하고자 하는 것은 a와 독립이지만 직교는 아닌 벡터 b에서 출발하여 a와 직교인 벡터 q2를 찾는 것이다. q2를 어떻게 만들 수 있을까? 바로 Lecture 15에서 배웠던 투영(Projection)을 이용하는 것이다. 아래 그림을 보자. 

 

 

Fig. 3 투영을 이용한 직교 벡터 계산 방법

 

 

첫 번째 벡터인 빨간색 a는 그대로 q1이 된다. 그다음 두 번째 벡터 b를 a에 투영시켜서 p를 만드는데, 이때 error벡터인 e를 만들어낼 수 있다. 즉 b를 a에 투영시킬때, a에서 b에 가장 가까운 지점은 b와 연결되면서 a에 수직한 지점이다. 투영의 정의에 의해서 b와 연결되는 a에 수직한 지점으로 투영이 되어 벡터 p가 생성되고, 결과적으로 b에서 p를 빼면 e=b-p 를 계산할 수 있다. 이때의 e는 a와 수직(perpendicular)한 벡터가 되고 e가 곧 q2가 된다. 결국 투영(projection)을 이용하여 a=q1에 수직한 벡터 e=q2를 만들어낼 수 있다

 

투영 파트에서는 구하고자 하는 벡터가 p였고 e는 그저 버려지는 벡터였는데, 이번엔 반대로 p가 버려지고 e를 취하게 되었다. 투영에 관한 자세한 사항은 위에 링크를 걸어놓은 Lecture 15를 참고바란다. 

 

 

그렇다면 q2에 대한 실제 식은 어떻게 될까? 아직 투영 행렬 P를 모르는 상태이고, 주어진 것은 벡터 b와 벡터 a=q1이다. e=b-p에서 p에 대한 식만 정리하면 된다. 식은 아래와 같다. 

 

 

뭔가 익숙한 식일 것이다. Lecture 15(이해가 안가면 꼭 먼저 공부하고 오자)에서 벡터를 이용하여 투영 벡터를 구할 때 보던 식이다. p=xa에서 분수 부분이 바로 x에 해당한다. 현재 q1은 원래의 a와 같다. 이렇게 하여 q2를 구하였다. 결과적으로 q1과 q2는 수직(perpendicular)이다. 즉 내적(dot product)을 했을 때 결과가 0이어야 한다. 식이 맞는지 확인해보도록 하자. 

 

 

 

식을 곱해서 전개하면 분수의 분모가 캔슬되고 분자만 남게되고(분수의 계산 결과는 상수임을 기억하자), 결과는 0이 된다. q1과 q2가 직교(orthogonal)임을 식의 전개를 통해 확인하였다. 

 

우리는 지금까지 두 개의 독립인 벡터 a와 b를 가지고 a를 기준으로 서로 직교(orthogonal)인 벡터 q1과 q2를 만들었다. 이제 세 번째 벡터 q3를 만들어보자. q3를 만들기 위해선 a와 b와 독립인 벡터 c가 필요하다. Fig. 1의 a와 b에서 화면으로 나오는 방향, 혹은 들어가는 쪽으로 비스듬하게 독립인 벡터 c가 있었다고 가정해보자(이때의 행렬은 3x3크기의 full rank=3인 행렬). Fig. 3은 a와 b로부터 q1과 q2를 만든 모습이다. 아래의 Fig. 4는 이 시점에서부터 시작한다. 

 

 

Fig. 4 독립 벡터 c의 그람-슈미트 과정 첫 번째 단계. 왼쪽 그림은 옆에서 바라본 장면이다. 

(2D로 표현하기에는 한계가 있어서 3D-CAD툴을 이용하여 표현하였다)

 

 

Fig. 4는 독립인 벡터 c를 q1과 q2에 동시에 직교(orthogonal)한 벡터로 만드는 그람-슈미트 과정의 첫 번째 단계를 나타낸다. 파란색 벡터 c는 독립이긴 하지만 q1과 q2어느 누구와도 직교는 아닌 상태이다(Fig. 4의 왼쪽 side view 참고). 여기서 우리가 해야할 일은 c를 q1과 q2에 동시에 직교하게 만들어야 하는데, 먼저 q1과 직교하게 만들고 그 다음 q2와 직교하게 만들면 된다. Fig. 4는 이 중 q1과 직교하게 만드는 과정을 나타낸다. 

 

벡터 c를 a에 투영시키면 녹색 벡터 p를 얻을 수 있고, p=xa와 ec1=c-p에 의해 a와 직교한 에러 벡터 ec1을 구할 수 있다. 이 과정은 식 (1)과 같은 과정이며, e->ec1, b->c, 와 같이 c에 맞게 바뀐 것이다. 이것을 식으로 나타내면 아래와 같다. 

 

 

벡터 c로부터 이렇게 q1과 직교인 에러 벡터 ec1을 만들어냈다. q1과 직교인 벡터를 만들어 냈으니 다음은 q2와 직교한 벡터를 만들 차례다. 아래 그림은 Fig. 4에 이어 q2와 직교한 벡터를 만드는 과정을 나타낸다. 

 

 

 

Fig. 5 q2와 직교한 벡터 ec2를 만드는 과정. 결과적으로 에러 벡터 ec2는 q1과 q2에 동시에 직교하므로 ec2=q3이다. 

 

 

 

q1과 직교한 벡터 ec1을 q2에 투영시키면 벡터 p를 얻고, 이 둘 사이의 에러 벡터인 ec2=ec1-p를 계산해주면 최종적으로 ec2를 구할 수 있다. Fig. 5에서 보는 것과 같이 ec2는 q1과 q2모두에 직교한 벡터이기 때문에 결과적으로 ec2=q3가 된다. 이를 식으로 나타내면 아래와 같다. 

 

 

약간 복잡해 보이지만 그리 어렵지 않으니 차근차근 확인해보자. 먼저 ec2는 앞서 구한 ec1에서 투영 벡터 p를 빼주면 구할 수 있는데, 이때 투영 벡터 p는 q2에 어떤 스칼라(scalar)상수를 곱한 것과 같다. 이 예에선 음수 값이 될 것이다. 그리고 ec2는 q2와 직교 하기 때문에 내적(dot product)을 해주면 그 결과가 0이 된다. 이러한 정의들을 가지고 식을 치환하고 전개해서 풀어주면 x에 관한 식을 (4.1)과 같이 구할 수 있다. 

 

 

그 다음 ec2=ec1-p에서 p를 x q2로 치환한 후 (4.1)의 x를 대입해주면 (4.2)와 같은 식을 구할 수 있다. 그런데 식에 ec1이 있어서 약간 혼란스러울지도 모르겠다. ec1을 식 (3)에서 정의한 내용으로 치환하여 다시 정리하면 아래와 같다. 

 

 

 

식이 많이 길지만 겁먹을 건 없다. 그저 치환해서 정리한 것 뿐이다. 먼저 (5.1)은 (4.2)의 분수의 분자에 있는 ec1을 (3)으로 대체하여 정리한 것이고 (5.2)와 같이 전개된다. 이때 분자에 q2 transpose와 q1을 내적하는 부분이 있는데, q1과 q2는 직교(orthogonal)이기 때문에 0이 되어 사라지고 (5.3)과 같이 된다. 이제 (5.3)의 ec1을 (3)으로 대체하여 정리해주고 ec2를 q3로 바꿔주면 최종적으로 식 (5.5)와 같이 정리된다. 

 

이렇게 하여 임의의 독립(independent)인 column 벡터 a, b, c로부터 같은 column space를 공유하면서 직교(orthogonal)하는 직교 벡터(orthogonal vector) q1, q2, q3를 구하였다. 다시 한 번 식을 한 번에 정리해보자. 

 

 

 

 

q1은 굉장히 쉽게 구했다. 그냥 첫 번째 벡터인 a를 대입하면 된다. q2는 b의 투영을 통해 a와 직교한 에러 벡터(error vector) e를 구하는 식이다. 마지막 q3는 c를 q1과 q2에 순차적으로 투영시켜 에러 벡터를 구하게 된다. q3의 패턴을 살펴보면 원래의 벡터 c에서 q1으로 투영시킨 벡터, q2로 투영시킨 벡터를 각각 빼준다. 여기서 한 가지 중요한 사실은 만약 4차원, 5차원, n차원 column vector가 더 있다면 q4, q5, qn을 위와 같은 패턴으로 구할 수 있다는 것이다. 물론 조건은 독립(independent)이어야 한다. 만약 q4를 구해야 한다면 원래 벡터인 d에서 q1, q2, q3로 각각 투영시킨 벡터들을 빼주면 된다. 이것이 Gram이 제안한 직교벡터를 만드는 아이디어이다. 

 

마지막으로 q3를 구하는 과정을 하나의 그림으로 살펴보고 다음으로 schmidt가 제안한 아이디어를 알아보도록 하자. 아래 그림은 q3를 구하는 과정을 하나의 그림으로 표현한 것이다. Fig. 4와 Fig. 5를 하나로 합친 것으로 생각하면 된다. 벡터 c부터 시작한다. 

 

 

Fig. 6  q3를 구하는 과정. 벡터 c부터 시작

 

 

 

- (2) Making Orthonormal Vectors (by Schmidt)

 

그 다음 과정은 상대적으로 간단하다. 지금 까지 구한 직교 벡터(orthogonal vector)는 정규화(normalized)가 되어 있지 않다. 즉, 각 벡터의 크기가 제각각이다. 이들을 방향 성분만을 나타내는 벡터로 만들기 위해선 정규화를 통해 정규직교벡터(orthonormal vector)로 만들어 줘야한다. 정규직교벡터를 만드는 방법은 각 벡터를 자신의 크기로 나누어 주면 된다. 

 

 

 

기존의 직교 벡터(orthogonal vector)와 구분해주기 위해 q hat으로 표현을 했다. 이렇게 직교 벡터로부터 정규직교벡터를 만드는 것은 schmidt의 아이디어이다. 

이렇게 해서 기존의 독립(independent)인 column vector a, b, c로부터 정규직교벡터(orthonormal vector) q1, q2, q3를 만들어냈다. 이 실제 벡터를 이용해서 계산해 보도록 하자. 

 

 

 

5. 예제와 MATLAB 구현

 

- 2D subspace in R3

 

아래의 두개의 독립인 3차원 벡터를 그람-슈미트 방법(Gram-Schmidt Process)을 이용하여 정규직교벡터(orthonormal vector)로 만들어보자. 벡터 a와 b는 3차원 공간에 존재하는 벡터들이며, 이 두 벡터가 이루는 column space는 2차원 평면 임을 알아두자. 

 

 

 

먼저 식 (6.1)과 (6.2)를 이용하여 직교 벡터(orthogonal vector)로 만들면 아래와 같다. 

 

 

 

 

직교 벡터 q1과 q2는 구했고, 이제 정규화를 해보자. q1과 q2를 각각의 크기로 나누어주면 아래와 같이 단위 벡터가 만들어진다. 

 

 

 

이렇게 하여 a와 b로부터 정규직교벡터(orthonormal vector) q1과 q2를 구하였다. 이렇게 계산한 q1(hat)과 q2(hat)로 직교 행렬(orthogonal matrix)을 만들 수 있는데, 간단히 q1(hat), q2(hat), ... qn(hat)을 순서대로 column vector로 삽입하면 된다

 

 

우리는 기존의 행렬 A로부터 직교행렬 Q를 만들었다. 이미 언급했지만 여기서 column space에 관한 얘기를 한 번 더 해보자. column space라는 것은 column vector들의 가능한 모든 선형 조합(Linear Combination)을 통해 형성하는 공간을 의미한다. 그렇다면 원래의 행렬 A와, A로부터 만든 직교행렬 Q와는 무슨 관계가 있을까? A와 Q의 column space는 똑같은 공간을 공유한다. 즉 원래의 행렬 A의 column vector들은 column space의 기저(basis)이며, 선형 조합을 통해 column space를 형성한다. 마찬가지로 Q의 column vector들도 기저(basis)로써 A와 같은 공간을 형성하는데, 기저가 정규직교벡터(orthonormal vector)이기 때문에 A보다는 계산 등에 훨씬 유리하다. 정리하자면 A의 column space의 기저(basis)를 보다 효율적이고 최적화된 기저로 만드는 방법이 그람-슈미트 방법(Gram-Schmidt Process)이라고 생각하면 된다. 

 

MATLAB구현을 보기 전에 q1(hat)과 q2(hat)가 직교인지 확인해보자. 내적(dot product)을 하여 결과 값이 0이 나오는지 확인하면 된다. 

 

 

 

내적 결과 값이 0이므로 q1과 q2가 직교한다는 사실을 확인했다. 

 

 

아래 그림은 위의 q1과 q2를 MATLAB을 이용하여 구현한 것이다. 

 

Fig. 7 Gram-Schmidt Process를 이용한 정규직교벡터의 그래프

 

 

Fig. 7은 식 (8)의 벡터 a, b와 이를 그람-슈미트를 이용하여 정규직교벡터로 만든 q1(hat), q2(hat)를 그래프로 나타낸 것이다. 보다시피 원래의 벡터 a와 b는 독립이며 노란색으로 표현된 column space를 "span"할 수 있다. 그러나 a와 b의 선형 조합(Linear combination)을 이용하여 column space를 표현할 경우 계산상에 많은 불리함이 있다. 

 

보라색과 하늘색 벡터는 a와 b를 정규직교벡터로 만든 q1(hat)과 q2(hat)이다. 앞서 말했듯이 q1(hat)은 a를 그대로 대입하고 정규화 했기 때문에 a와 같은 선상에 위치한 것을 볼 수 있다. q1(hat), q2(hat)는 a와 b로 형성했던 column space와 같은 공간에 위치한 것을 볼 수 있으며, 같은 column space를 "span"하더라도 계산상에 있어 훨씬 유리한 점이 많다. 이 점에 대해서는 지난 강의 Lecture 17-(1)에 언급해 놓았으니 참고하기 바란다. q1(hat)과 q2(hat)는 90도 각도를 이루고 있음을 볼 수 있다. Fig. 7에 보이는 그래프에서는 완벽한 90도가 아닌 것 처럼 보일 수는 있으나 이것은 MATLAB그래프의 가로 세로의 비율(aspect ratio)과 바라보는 각도때문에 왜곡이 생겨서 그렇다. 실제로는 90도를 이루고 있다. 

 

직교성을 확인하기 위해 MATLAB에서 계산한 q1(hat)과 q2(hat)를 실제로 내적하면 정확하게 0이 안나오는 경우가 생긴다. 이는 컴퓨터로 계산할 때 발생하는 round off 에러 때문인데, 컴퓨터의 수치 정밀도 때문에 발생하는 것이다(자세한 것은 구글 참조). 실제로 Fig. 7의 q1(hat)과 q2(hat)의 내적을 계산하면 1.6653e-16 이라는 수치가 나오는데, 엄청나게 작은 수 이므로 0으로 간주하는 것이다. 아래의 첨부된 MATLAB 코드를 참조하여 실제로 구현해서 확인해보는 것을 추천한다. 

 

 

 

 

- 3D space

 

이번에는 a, b에 이어 c가 추가된 3차원 column space에 대한 그람-슈미트 과정(Gram-Schmidt Process)을 수행해보도록 하자. 벡터 c는 아래와 같다. A는 c가 추가된 행렬을 나타낸다. 

 

 

 

q1과 q2는 이미 구했으니 c와 관련된 q3만 구하면 된다. 식 (6.3)을 이용하여 계산해보자. 

 

 

 

 

 

계산하다보니 숫자가 좀 커졌지만, 어쨋든 q3를 구하였다. 이제 정규화(normalization)를 통해 q3를 정규직교벡터로 만들어보자. 

 

 

 

 

 

이렇게하여 a, b, c로부터 정규직교벡터 q1(hat), q2(hat), q3(hat)를 만들었다. 직교행렬(orthogonal matrix)을 만드는 것은 식 (11)과 같기 때문에 넘어가도록 하겠다. 직교성을 확인하기 위해 q1(hat), q2(hat)와 내적하는 것은 MATLAB을 이용하거나 직접 해보길 바란다. 아래 그래프는 식 (13)의 벡터와 이에 대한 그람-슈미트 과정을 통해 얻은 정규직교벡터를 나타낸다. 

 

 

Fig. 8 식 (13)의 벡터와 그들의 정규직교벡터 그래프

 

Fig. 8을 보면 기존의 독립 벡터 a, b, c는 3차원 공간을 "span"하기는 하지만 크기도 제각각이고 column space인 3차원 공간의 기저(basis)가 되기엔 뭔가 최적화 되어 있지 않아 보인다. 반면 그람-슈미트 과정을 통해 만든 정규직교벡터 q1(hat), q2(hat), q3(hat)는 정규화된 동일한 크기의 벡터이고 서로 완벽하게 직교(orthogonal)를 이루는 모습을 볼 수 있다. 아래는 이를 구현한 MATLAB 코드이다. 

 

 

 

 

 

이번 포스팅에서는 3차원 정규직교벡터인 q3까지 구하였다. 하지만 이전에도 언급했듯이 4차원, 5차원, n차원의 벡터에 대해서도 계산은 가능하다. q1->q2->q3로 가면서 계산하는 패턴은 동일하기 때문에 n차원 그람-슈미트 방법에 대한 구현도 어렵지않게 할 수 있을 것이다. 

 

 

 

6. QR분해(QR decomposition)

 

- QR decomposition basic

 

마지막으로 살펴볼 내용능 지금까지 계산했던 그람-슈미트 방법(Gram-Schmidt Process)을 행렬로 정리하는 것이다. 이를 QR 분해(QR decomposition, QR factorization)라고 한다. 그러나 여기에선 그리 많은 양을 다루진 않고 간략히 살펴보고 넘어가도록 하겠다. 나중에 기회가 되면 따로 정리하도록 하고 일단 이런게 있구나 정도만 보고 넘어가면 될 것 같다. 

 

우리는 지난 Lecture 4에서 A=LU 분해(A=LU decomposition)를 배웠다. A라는 행렬을 소거 행렬(elimination matrix)을 통해 삼각행렬(triangular matrices)들의 곱으로 분해해서 표현하는 방법인데, QR 분해 역시 마찬가지로 원래의 A행렬을 Q행렬과 R행렬의 곱으로 분해하여 표현하는 방법이다. 여기서 Q행렬은 우리가 지금까지 그람-슈미트 방법을 통해 구했던 직교 행렬(orthogonal matrix)을 의미하며, R행렬은 A와 Q를 연결시켜주는 행렬이라고 생각하면 된다. 특히 R행렬은 상삼각행렬(Upper triangular matrix)의 형태를 띄고 있는데, 지금부터 이 R행렬이 무엇이고 왜 상삼각행렬의 모양으로 하고 있는지 알아보자. 

 

행렬 A와 Q, R은 아래와 같이 나타낼 수 있다. 

 

 

 

위의 식 (16)을 보고 어떤 사람들은 이렇게 생각할지도 모르겠다. 아까 분명히 Q행렬을 만들 때 q1, q2, ... 들을 순서대로 Q의 column vector에 삽입하면 된다고 했는데, 왜 갑자기 Q가 m x m이 되는 거지? 사실 식 (16)은 QR 분해를 할 때 A가 정방행렬(square matrix)의 형태 뿐만 아니라 직사각행렬(rectangular matrix)의 형태까지 고려한 일반적인 형태이다. 직사각행렬인 경우 계산 과정이 약간 더 복잡해진다. 이에 대한 자세한 내용은 QR분해 위키를 참조하도록 하고 일단 정방행렬인 경우만 고려하여 생각하도록 하자. 

 

우선 A행렬의 column vector들을 a1, a2, ...로 표현했는데, 위에서 설명한 a, b, c, 등의 벡터를 나타낸다. Q행렬은 A와 똑같은 column space를 형성하는 기저(basis)들로 구성되어 있으며 정규직교벡터들로 구성되어 있다. 중요한건 R행렬인데, 각 원소들은 a1, a2 등의 벡터들과 Q행렬의 column vector인 q1, q2 벡터들과의 내적으로 구성되어 있다. 그런데 대각선을 기준으로 아래쪽 원소들은 전부다 0이 된다. 왜 그럴까? 

 

아래쪽 원소의 식을 보면 a1과 q2, 그리고 a2와 q3와 같이 q벡터와 이전 index의 벡터들과 내적을 한다. 어째서 어떤 q벡터와 이전 index의 a벡터와 내적을 하면 0이 될까? 그것은 그람-슈미트의 계산 과정과 관련이 있다. 식 (6.3)이나 Fig. 6을 보면 우리가 벡터 c로부터 q3를 만들 때 먼저 q1과 직교하게 만들고, 그 다음 q2와 직교하게 만들어서 q3를 생성하게 된다. 이 말은 qn을 만들 때 qn-1과는 반드시 직교(orthogonal)해야하고 따라서 q1, q2등과 대응 되는 a, b, c, ... 등의 이전의 모든 벡터와는 직교해야함을 의미한다. 따라서 아래쪽 삼각형 원소들은 모두 0이 되고 R은 상삼각행렬(upper triangular matrix)의 형태가 된다. 

 

 

- QR matrices and MATLAB function

 

Q행렬은 그람-슈미트 과정을 통해 얻은 q벡터들을 Q의 column vector들로 삽입하여 간단히 얻을 수 있다고 하였다. 그렇다면 R행렬은 어떻게 구할 까? A행렬이 정방행렬(square matrix)이라고 가정할 때, 아래의 식을 통해 간단히 얻을 수 있다. 

 

 

결국 원래 행렬 A에 Q transpose행렬을 곱해주면 R을 얻을 수 있다. 아래 그림은 식 (13)을 MATLAB을 이용하여 계산한 결과다. 

 

Fig. 9 식(13)의 QR decomposition

 

 

기존에 구했던 q1, q2, q3를 이용하여 직교행렬 Q를 만든 다음, 식 (17)과 같이 R을 계산하고 Q와 R을 곱하여 식이 맞는지 확인하였다. 결과적으로 A와 같음을 볼 수 있다. 

 

그런데 MATLAB에는 행렬 A만 있으면 기본적으로 QR decomposition을 해주는 함수가 있다. 명령어는 " [Q R]=qr(A) " 와 같이 치면 되고 자동으로 Q와 R행렬을 계산해준다. 그러나 Fig. 9에서 계산한것과 부호 등이 다른 경우가 있는데, 이는 구현 알고리즘이 달라서 발생하는 현상이며 결국은 같은 기능을 하는 것이다. 실제 구현에서는 Householder reflection방법을 많이 사용하는데, 수치계산에 있어서 그람-슈미트보다 훨씬 안정적이라고 한다. 자세한 사항은 QR분해 위키를 참조하자. 아래는 MATLAB내장함수인 qr()을 이용하여 계산한 결과다. Fig. 9의 결과와 비교해보자. 

 

Fig. 10 MATLAB내장 함수를 이용하여 수행한 QR decomposition

 

 

 

7. 마치며

 

이번 포스팅에선 그람-슈미트 방법(Gram-schmidt Process)에 대해서 공부하였다. 그람-슈미트는 기존 행렬의 column space를 이루는 기저(basis)를 계산에 있어서 보다 효율적이고 최적화된 기저로 바꾸는 방법이며, 바뀐 기저는 정규직교벡터(orthonormal vector)의 형태를 띈다. 이는 계산 상에 있어 여러 모로 효율적이다. 정규화된 단위 벡터이기 때문에 크기는 1이며, 방향 성분만을 나타내는 벡터이다. 따라서 overflow, underflow등과 같은 문제에 있어 자유롭고, 계산을 간단하게 해주는 특징을 보인다. 

그람-슈미트 방법은 기본적으로 투영(projection)의 개념을 이용하여 계산되며, 이 그람-슈미트 방법은 이후 SVD(singular value decomposition)에 응용 되기도 하니 잘 알아두도록 하자. 

 

+ Recent posts