이번 강의에서 배울 내용은 직교행렬(Orthogonal Matrix)과 그람 슈미트 과정(Gram-Schmidt Process)이다. 먼저 이들을 간략히 설명하면 다음과 같다. 직교 행렬은 모든 column vector가 자기 자신을 제외한 나머지 모든 column vector들과 직교이면서 크기가 1인 단위 벡터들로 구성된 행렬을 의미한다. 그리고 그람 슈미트 과정은 임의의 독립 행렬(independent matrix)로부터 각 column vector가 정규직교(Orthonormal)한 벡터들로 구성된 직교 행렬을 만드는 과정 혹은 방법을 의미한다. 이 설명만 가지고는 이해하기가 어려울 수 있으니 차근차근 공부해 보도록 하자. 먼저 정규직교벡터(Orthonormal vector)에 대해 공부해보자.
1. 정규직교벡터(Orthonormal Vector)
- 단위 벡터(Unit Vector)
정규직교벡터(Orthonormal Vector)를 알아보기 전에 먼저 단위 벡터에 대해 먼저 알아보도록 하자.
일반적으로 어떤 벡터는 크기와 방향 성분을 가진다. 예를 들어 벡터 v가 v=[2 1]T라고 했을 때, v는 바닥에서 약 26.5도 회전한 쪽으로의 방향을 가리키고 있고, √5의 크기를 갖는다. 여기서 어떤 scale상수를 곱해서 벡터의 길이를 늘린다고 가정해보자. scale상수가 3이면 3 x v = [6 3]T = √45 = 3√5의 크기가 된다. 즉 원래 벡터의 길이에 곱해진 scale만큼 길이가 더 늘어나게 된다.
그렇다면 단위 벡터(Unit Vector)란 무엇인가? 정의하자면 길이가 1인 벡터를 의미한다. 즉 길이가 1이라는 것은 단위 길이(Unit length)를 의미하며 오직 방향성분만을 나타내는 벡터이다. 우리가 길이를 나타낼 때 표준 단위계(SI)에선 m(meter)을 이용하여 길이를 표현한다. 가령 2미터를 나타낼 때 "2m"과 같이 숫자 뒤에 m을 붙여주는데, 이때 m은 길이의 단위를 나타낼 뿐 실제 길이에 어떠한 영향도 끼치지는 않는다.
단위 벡터는 바로 "m"과 같은 역할을 하는 것이다. 힘의 크기와 방향 등을 벡터로 나타낼 때 단위 벡터(Unit vector)는 크기 성분에는 전혀 영향을 끼치지 않는다. 방향 성분만을 나타내기 때문에 어떤 scale상수를 곱하여 길이를 늘린다고 했을 때 그 늘린 길이가 scale상수 그 자체이다. scale이 3, 벡터 v가 단위 벡터라고 했을 때 3 x v의 길이(크기)는 3이다.
일반 벡터를 단위벡터로 만들기 위해선 아래 식과 같이 기존의 벡터를 벡터의 크기로 나누어주면 된다.
식 (1)을 참고하여 벡터 v=[2 1 3]T를 단위벡터(Unit vector)로 만들어보자.
우리는 이러한 단위 벡터를 정규화 벡터(normalized vector)라고도 한다. 즉 서로 다른 스케일을 가지고있는 벡터들을 동일한 스케일에서 바라보기위해 벡터의 크기로 나누어 정규화(normalization)한 벡터를 의미한다.
- 정규직교벡터(Orthonormal vector)
직교 벡터(orthogonal vector)는 알다시피 벡터 사이의 각도가 90도, 즉 직각(perpendicular)을 이루는 벡터를 말한다. 즉 어떤 a라는 벡터가 있고, a와 직각인 벡터 b가 있을 때 a와 b벡터를 우리는 직교벡터라고 하며 이때 a와 b의 내적(dot product)은 0이 된다. 따라서 직교 벡터는 어떤 하나의 벡터로는 정의할 수 없고 반드시 한 쌍 이상의 벡터로부터 정의되어야 한다.
그렇다면 정규직교벡터(orthonormal vector)란 무엇일까? 이는 바로 직교 벡터(orthogonal vector)이면서 단위 벡터(unit vector)인 벡터를 말한다. 즉 두 벡터가 90도의 각도를 이루고, 각 벡터의 길이(크기)는 1인 방향성분만을 나타내는 벡터를 우리는 정규직교벡터(orthonormal vector)라 한다. 이를 수식으로 나타내면 아래와 같다.
Orthonormal vector를 각각 qi, qj라고 했을 때, qi는 자기 자신에게는 직교(orthogonal)하지 않는다. qi를 자기 자신과 곱하면, 즉 자기 자신과 내적(dot product)하면 그 결과값은 1이 된다. 이것이 의미하는 것은 q는 벡터의 크기가 1인 단위 벡터(unit vector)라는 의미다. 단위 벡터인 식 (2)의 v hat을 제곱해보자. 결과는 4/14 + 1/14 + 9/14 = 1이 될 것이다. 이처럼 벡터들이 서로 직교(orthogonal)하면서 동시에 정규화된 벡터이기 때문에 ortho-normal이라는 이름을 사용하는 것이다.
자기 자신을 제외한 나머지 모든 벡터들과는 직교(orthogonal)한다. 즉 자기 자신을 제외한 나머지 벡터들과의 내적(dot product)결과가 0이 되는 것이다. 아래 그림은 이러한 정규직교벡터(orthonormal vector)의 한 예를 나타낸다.
Fig. 1 정규직교벡터(orthonormal vector)의 예
Fig. 1은 sin과 cos으로 이루어진 벡터를 나타낸다. 이들 벡터 a, b의 길이는 각각 1이며 둘 사이의 각도는 90도이다. 두 벡터가 직교(perpendicular)하며 각 벡터의 길이는 1로써 방향성분만을 나타내므로 이들은 정규직교벡터이다.
이러한 정규직교벡터들을 행렬의 column vector에 삽입하면 직교행렬(orthogonal matrix)이 된다. 즉 Q를 직교행렬이라고 했을 때 orthonormal vector들이 Q의 정규직교기저(orthonormal basis)가 되는 것이다. 이러한 정규직교기저는 선형대수의 행렬 계산에 있어 좋은 결과를 보여준다. 특히 선형대수계산을 연구하는 분야인 Numerical Linear Algebra의 대부분의 연산은 이러한 orthonormal vector를 기반으로 이루어진다. 이들은 수치 연산을 하는 과정에서 값이 무한정 커지거나 작아져서 발생하는 overflow나 underflow문제에 있어서 자유롭다. 왜냐하면 크기에 영향을 미치지않는 단위 행렬(unit vector)성분을 가지고 있기 때문이다. 이것이 정규화(normalization)의 힘이다.
2. 직교행렬(Orthogonal Matrices)
- Basic of Orthogonal Matrix
직교행렬(orthogonal matrix)은 행렬의 row와 column vector들이 자기 자신을 제외한 나머지 모든 row, column vector들과 직교(perpendicular)이면서 동시에 단위 벡터(unit vector)인 행렬을 의미한다. 즉 orthonormal vector들을 행렬 Q에 집어넣은 것과 같다. 아래 식과 같이 말이다.
식 (4)는 orthonormal vector를 행렬 Q에 column vector로써 삽입한 형태이다. 이때 임의의 벡터 qi는 자기 자신을 제외한 나머지 벡터들과 직교(perpendicular)하다. 즉 식 (3)의 규칙을 따르는 것이다. 식 (3)의 규칙을 확인하기 위해서는 Q transpose와 Q를 곱한 값을 보면 알 수 있다.
식 (5)는 Q transpose와 Q의 곱셈 결과를 나타낸다. Q transpose는 q transpose를 Q의 row vector로 삽입한것과 같다. 이를 Q와 곱하면 어떤 결과가 나오는가? 바로 단위 행렬(Identity matrix)이다. Q transpose의 row1과 Q의 col1의 곱은 자기 자신과의 곱셈이다. 따라서 모든 row(i)와 col(j), (i=j)의 곱셈은 자기 자신과의 곱셈이기 때문에 결과 행렬의 대각 성분은 1이 된다. 반면 나머지 벡터끼리의 곱셈은 직교(orthogonal)하기 때문에 0이 되어 결과적으로 단위 행렬이 나오는 것이다. 결국
는
와 마찬가지로 모든 row와 column 벡터들 끼리의 내적(dot product)을 확인하는 것이다. 식 (3)의 정의와 맞는 것을 볼 수 있다.
이렇게 하여 우리는 orthonormal column을 가진 orthogonal matrix를 배웠다. 사실 Q에 대한 더 정확한 표현은 orthonormal matrix이다. 각 벡터들이 orthogonal이 아닌 orthonormal한 벡터를 가지고 있기 때문이다. 그러나 무슨 이유에서인지 표현은 항상 orthogonal matrix로 한다.
- Square Orthogonal Matrix
직교 행렬(orthogonal matrix)이면서 정방행렬(square)인 경우의 가장 대표적인 예는 단위행렬(identity matrix)이다. 단위행렬의 각 column vector는 자기 자신을 제외한 나머지 벡터들과 90도의 각도를 이루면서 각각의 크기는 1이다. 이를 시각화하면 아래 그림과 같다.
Fig. 2 직교행렬(orthogonal matrix)이면서 정방행렬(square matrix)인 단위행렬(identity matrix)의 시각화
Fig. 2는 어디서 많이 본 그림일 것이다. 바로 표준 기저(standard basis)이다. x축은 y축과 z축에 각각 수직(perpendicular)이며, y는 x와, z축에, z는 x와 y에 각각 수직이다. 각 벡터끼리 내적(dot product)을 하면 0이 되는 것을 볼 수 있다. 또한 각 축의 기저는 정규화(normalized)된 크기인 1이다. 이러한 표준 기저의 선형 조합(Linear combination)을 통해 우리는 3차원 공간의 모든 벡터, 점 등을 정의할 수 있다.
이와 같이 직교 행렬이 정방행렬일 경우 한 가지 흥미로운 특성을 갖는다. 그것은 바로 transpose가 역행렬(inverse matrix)과 같다는 것이다. 다시 정리해보자면
정규직교벡터(orthonormal vector)로 구성된 직교 행렬(orthogonal matrix) Q가 row의 수와 column의 수가 같은(m=n) 정방행렬(square)인 경우, 의 관계에 의해서 Q의 transpose는 Q의 역행렬(inverse matrix)이 된다. 즉 |
사실 식 (5)를 잘 살펴보면 당연하다. Q transpose와 Q를 곱했을 때 단위행렬이 된다는 것은 Q가 정방행렬인 상황에서 Q transpose가 당연히 역행렬이어야 한다. 예를 한 번 들어보자. 우리는 지난 Lecture 5에서 행 교환(row exchange)연산을 해주는 치환행렬(permutation matrix)에 대해 공부했었다. 치환행렬은 정규직교벡터로 구성된 직교 행렬(orthogonal matrix)이다. 아래 식을 보자.
식 (6)의 치환행렬(permQ)의 column vector나 row vector들은 각자의 크기는 1이면서 자기 자신을 제외한 나머지 벡터들과는 수직(perpendicular)이다. 이제 여기에 Q의 transpose를 곱해보자. 결과는 아래와 같다.
직교 행렬 Q에 Q transpose를 곱했더니 단위행렬이 나오는 것을 볼 수 있다. 따라서 Q transpose는 Q의 역행렬과 같다.
한 가지 예를 더 들어보자. Fig. 1과 관련이 있는 예다.
식 (8)은 cos과 sin으로 이루어진 직교 행렬(orthogonal matrix)이다. column 벡터들을 보면 각각 col1=[cos sin]T, col2=[-sin cos]T인데, 둘은 Fig. 1에 보이는 것과 같이 직교하며 내적(dot product)을 하면 0이 된다. 각 column vector의 크기는 1이며, 크기 구하는 식에 대입해보면 바로 알 수 있다.
한 가지 예를 더 들어보자. 아래의 행렬은 직교 행렬인가?
분명 column 혹은 row vector를 비교해보면 직교 벡터를 가지고 있다. 그러나 각 벡터의 길이가 1이 아니다. 어떻게 이들의 길이를 1로 만들어줄 수 있을까? 위의 단위 벡터 편에서 단위 벡터를 만들기 위해선 벡터의 크기로 나눠주면 된다는 것을 배웠다. 마찬가지로 벡터의 크기로 행렬 원소 전체를 나눠주면 된다. 다음 식과 같이 말이다.
식 (11)의 임의의 qi의 길이(크기)를 계산해보면 √(1/2+1/2)=√(1)=1이 되는 것을 알 수 있다. 사실은 column 1과 column 2가 직교(orthogonal)하지만, 크기가 다를 경우가 있다. 따라서 보다 정확하게 말하자면 column 1은 column 1의 크기로, column 2는 column 2의 크기로 각각 나누어줘야 한다.
이제 마지막 예를 들어보도록 하겠다. 다음 행렬을 살펴보자. 식 (10)의 행렬을 반복하여 만든 행렬이다.
식 (12)는 식 (10)의 행렬 Q의 각 원소들에 Q를 대입한 것과 같은 형태이다. 먼저 직교성(orthogonality)을 계산해보면 Q의 임의의 column qi와 나머지 column vector와 내적을 하면 결과는 0이 된다. 그러나 각 column 혹은 row vector의 길이는 1이 아니다. 즉 직교성은 만족하지만, 단위 행렬(unit vector)속성은 만족하지 않는다. 따라서 직교행렬이 되기 위해선 식 (11)과 같이 단위 행렬로 만들어야 한다. 이를 위해서 해당 column 혹은 row 벡터의 길이(length or magnitude)로 자기 자신을 나누어주면 된다.
식 (13)의 어떠한 벡터의 크기를 계산해도 1이 된다. 따라서 식 (13)은 직교 행렬(orthogonal matrix)이다. 식 (13)의 행렬을 특히 Adhemar matrix이라고 부른다. 이에 대한 자세한 것은 구글을 참고하자. 여기선 그냥 넘어가도록 하겠다.
- Rectangular Orthogonal Matrix
지금까지는 직교 행렬(Rectangular Matrix)이 정방행렬인 경우만 살펴보았다. 이번엔 임의의 직사각 형태인 직교 행렬을 살펴보도록 하자. 아래 식은 직사각 형태의 직교 행렬을 나타낸다.
식 (14.1)일 때는 그저 단순히 하나의 단위 벡터(unit vector)이다. 여기에 col1벡터와 독립인 col2벡터를 추가하여 (14.2)와 같은 직사각형 형태(Rectangular) 식을 만들었다. 이때의 column vector들은 3차원 공간에서 2차원 부분 공간(subspace)의 column space를 이루는 기저(basis)가 된다. 여기에 세 번째 column vector를 더하면 (14.3)과 같이 된다.
사실 여기서 말하고자 하는 것은 (14.1)에서 (14.2)로 넘어갈 때, 그리고 (14.2)에서 (14.3)으로 넘어갈 때 어떻게 직교벡터(orthogonal vector)를 만드느냐이다. 특별한 알고리즘이나 방법이 없이는 우리의 직관에 의해서 직교 벡터들을 만들어서 기존의 행렬에 더해줘야 한다. 그러나 이는 행렬의 크기가 커질 수록 너무나 어려운 일이다. 이후에 설명할 그람-슈미트 과정(Gram-Schmidt Process)은 이러한 직교 행렬을 만들어주는 특별한 방법이다. 즉 임의의 독립된 column vector들로 구성된 행렬, 즉 독립(independent)인 행렬(matrix)이 있을 때, 이 독립인 행렬을 직교행렬(orthogonal matrix)로 만들어주는 방법이다.
본격적으로 그람-슈미트 과정을 공부하기 전에 먼저 직교 행렬을 이용하여 연산을 했을 때 어떠한 이점이 있는지 살펴보도록 하자.
- Advantage of using Orthogonal Matrix
직교 행렬(orthogonal matrix) Q를 활용하여 계산하면 몇 가지 이점이 있다. 먼저 수식이 굉장히 간단해진다. 우리가 어떤 벡터 b를 행렬 A의 column space로 투영(projection)시키고 싶을 때, 투영행렬(projection matrix)을 통해 이를 할 수 있음을 Lecture 15에서 배웠다. 투영 행렬의 식을 다시 상기시켜보자.
식 (15)의 투영행렬식은 얼핏 보면 약간 복잡해 보이긴 한다. 그렇다면 A대신 Q를 이용하여 투영행렬을 만들게 되면 식이 어떻게 변할까?
Q는 정규직교(orthonormal) column vector들로 이루어진 직교 행렬(orthogonal matrix)이다. A대신 Q를 이용하여 투영 행렬(projection matrix)를 만들었더니 식 (16)과 같이 식이 굉장히 간단해졌다. 괄호 안의 Q transpose Q가 식 (5)에서 본 것과 같이 단위행렬이 되기 때문이다. 따라서 괄호 안의 식은 없어지는 것과 마찬가지가 되고 결국 양 끝에 Q와 Q transpose만 남게 된다. 이때 Q가 임의의 직사각행렬(rectangular matrix)이라면, (16)의 결과 행렬은 대칭 행렬(symmetric matrix)이 된다.
만약 Q가 정방행렬(square matrix)이라면 어떨까? 이 경우엔 식이 훨씬 더 단순해진다. 우리는 위의 노란박스에서 Q가 정방행렬일 경우 Q의 전치(transpose)는 Q의 역행렬이라고 배웠다. 식 (16)에서 Q의 투영행렬은
이 되므로 결과적으로 단위 행렬이 된다. 식은 아래와 같다.
왜 Q가 정방행렬일 경우 투영행렬이 단위 행렬이 되는지 잘 생각해보자. 투영 행렬은 임의의 벡터 b를 행렬 A 혹은 Q의 column space로 투영(column space의 가장 가까운 벡터로의 매칭)시키는 역할을 한다. 그런데 Q가 정방행렬이 되어버리면 Q의 column space가 전체 공간과 같아져버리게 된다. 따라서 임의의 벡터 b는 전체 공간인 Q의 column space에 이미 존재하기 때문에 투영 자체가 의미가 없어져버린다. 그래서 정방행렬(square matrix)인 직교 행렬(orthogonal matrix)의 투영 행렬(projection matrix)이 단위 행렬이 되는 것이다.
마지막으로 투영 행렬의 특성중 하나인
를 확인해보자. 투영시킨 벡터를 다시 투영해도 그 결과는 같다는 것 말이다. 식 (16)을 기준으로 이 특성을 다시 써보면 아래와 같다.
식 (18)의 밑줄 친 부분이 단위행렬이 되므로 결과는 P와 같다.
이와 같이 기존의 임의의 행렬 A에 대한 해를 구하는 식은 Q를 이용할 경우 훨씬 간단해진다. Lecture 15-(1)에서 배웠던 overdetermined case의 해를 구하는 식을 Q를 이용하여 정리하면 아래와 같이 간단하게 정리된다.
앞의 Q transpose Q가 단위 행렬이 되어 사라지고 뒤의 식만 남게된다. 결과적으로 Q를 이용할 경우 해(solution) x hat의 각 원소들은 Q transpose와 b의 내적(dot product)연산에 의해 간단히 정의된다.
3. 마치며..(continue)
이번 강의에선 그람-슈미트 과정을 배우기에 앞서 필요한 선행 지식인 직교행렬에 관해 공부하였다. 직교행렬(orthogonal matrix)은 정규직교벡터(orthonormal vector)들로 이루어진 행렬이며 계산을 간단하게 해주는 특징이 있다는 것을 공부하였다. 또한 실제 계산에 있어서 정규화(normalized)된 직교(orthogonal) 벡터들을 이용하기 때문에 계산 결과값이나 overflow, underflow와 같은 문제에 있어서 훨씬 좋은 성능을 보인다.
그러나 여기서 어떤 사람들은 이런 의문이 들수도 있을 것이다. A대신 Q를 이용해서 식을 만들면 좋은건 알겠는데, 대체 A랑 Q랑 무슨 관계지? Q가 좋긴 하지만 A대신 사용하게 되면 원래 식과는 완전히 달라지는거 아냐?
이후 과정에서 더 자세히 설명하긴 하겠지만, A와 Q는 같은 column space를 공유하는 행렬이다. 즉 A의 column vector들을 기반으로 A와 똑같은 column space, 혹은 부분 공간(subspace)을 이루는 행렬 Q를 만드는 것이다(※이때 A는 반드시 독립이어야 함). 다시 말하면 원래 A가 가지고 있던 column vector들은 column space의 기저(basis)이긴 하지만, 최적의 기저는 아닐 가능성이 크다. 원래의 행렬 A의 column space의 기저(basis)를 보다 최적화된 기저로 만들어준다! 정도로 생각하면 될 것 같다.
원래 그람-슈미트 과정(Gram-Schmidt Process)까지 이번 포스팅에서 다루려고 했으나, 내용이 너무 길어질 것 같아서 나누어서 하겠습니다. 다음 강의(17-(2))에서는 직교행렬에 이어 그람-슈미트 과정을 다루도록 하겠습니다.