고급 선형 대수 Lecture 3: 정규직교 열, 정사영과 Q의 성질

전체 목차 · 이전: Lecture 2 · 다음: Lecture 4

책과 강의

구분 출처와 범위
교재 Gilbert Strang, Linear Algebra and Learning from Data, 2019. Part I — Highlights of Linear Algebra, I.5 — Orthogonal Matrices and Subspaces, pp. 29–35
강의 MIT 18.065, Spring 2018. Lecture 3 — Orthonormal Columns in Q Give Q’Q = I
지정 문제 I.5의 2, 4, 6번, p. 35. 강의 페이지와 전체 문제집 참조

쪽수는 인쇄쪽수이며, 해당 절은 제공된 스캔본의 PDF 22–25번째 페이지에 걸쳐 있습니다. 강의 제목의 Q′Q'는 실수 행렬의 전치 QTQ^T입니다. 복소수로 확장할 때에는 켤레전치가 필요합니다.

좋은 기저를 선택하면 좌표 계산이 쉬워집니다. 정규직교 기저에서는 좌표를 내적으로 구하고, 길이를 좌표 제곱의 합으로 계산할 수 있습니다. 이 성질이 QR, 최소제곱, 푸리에 변환, SVD를 연결합니다.

1. 직교와 정규직교를 구별하기

실수 벡터 u,vu,v가 직교한다는 것은 uTv=0u^Tv=0이라는 뜻입니다. 정규직교 벡터 집합은 서로 직교하면서 각각 길이가 1입니다.

qiTqj={1i=j,0i≠j.q_i^Tq_j=\begin{cases}1&i=j,\\0&i\ne j.\end{cases}

길이가 2인 두 수직 벡터는 직교하지만 정규직교는 아닙니다. 영벡터는 모든 벡터와 직교하지만 정규직교 집합에는 넣을 수 없습니다.

피타고라스 정리도 내적에서 나옵니다. uTv=0u^Tv=0이면

∥u+v∥22=∥u∥22+2uTv+∥v∥22=∥u∥22+∥v∥22.\|u+v\|_2^2=\|u\|_2^2+2u^Tv+\|v\|_2^2 =\|u\|_2^2+\|v\|_2^2.

영이 아닌 실수 벡터 사이의 각도는 cos⁡θ=uTv/(∥u∥2∥v∥2)\cos\theta=u^Tv/(\|u\|_2\|v\|_2)로 읽습니다.

2. 정규직교 열을 모으면 QᵀQ = I

Q=[q1 ⋯ qr]∈Rm×rQ=[q_1\ \cdots\ q_r]\in\mathbb R^{m\times r}라 하겠습니다. QTQQ^TQ의 (i,j)(i,j) 성분은 qiTqjq_i^Tq_j이므로

QTQ=Ir.\boxed{Q^TQ=I_r}.

이 식에는 두 가지 경우가 있습니다.

Q의 크기 성립하는 식 QQᵀ의 의미
m=rm=r, 정사각형 Q−1=QTQ^{-1}=Q^T, QQT=ImQQ^T=I_m 전체 공간의 항등변환
m>rm>r, 열이 더 적음 QTQ=IrQ^TQ=I_r Q의 열공간으로 보내는 정사영

보통 직교행렬이라는 이름은 정사각형 경우에 사용합니다. 열이 정규직교인 직사각형 행렬에는 왼쪽 역행렬 QTQ^T가 있지만 양쪽 역행렬은 없습니다.

직접 구성한 예제는

q1=12[110],q2=[001],Q=[1/201/2001].q_1=\frac1{\sqrt2}\begin{bmatrix}1\\1\\0\end{bmatrix},\quad q_2=\begin{bmatrix}0\\0\\1\end{bmatrix},\quad Q=\begin{bmatrix}1/\sqrt2&0\\1/\sqrt2&0\\0&1\end{bmatrix}.

이때 QTQ=I2Q^TQ=I_2이지만

QQT=[1/21/201/21/20001]≠I3.QQ^T=\begin{bmatrix}1/2&1/2&0\\1/2&1/2&0\\0&0&1\end{bmatrix}\ne I_3.

3. 길이와 내적을 보존한다

x,y∈Rrx,y\in\mathbb R^r에 대해

(Qx)T(Qy)=xTQTQy=xTy.(Qx)^T(Qy)=x^TQ^TQy=x^Ty.

따라서 ∥Qx∥2=∥x∥2\|Qx\|_2=\|x\|_2이고, 영이 아닌 벡터 사이의 각도도 보존됩니다. 직사각형 QQ도 자신의 입력 공간에서는 길이를 보존합니다. 반대로 QTQ^T는 임의의 Rm\mathbb R^m 벡터를 줄일 수 있습니다. 열공간 밖의 성분을 버리기 때문입니다.

정사각 직교행렬에서는 det⁡(Q)2=det⁡(QTQ)=1\det(Q)^2=\det(Q^TQ)=1이므로 행렬식은 +1+1 또는 −1-1입니다. 직교행렬을 곱해도 직교행렬입니다.

(Q1Q2)T(Q1Q2)=Q2TQ1TQ1Q2=I.(Q_1Q_2)^T(Q_1Q_2)=Q_2^TQ_1^TQ_1Q_2=I.

길이 보존은 수치 계산에서 유리하지만, 유한 정밀도 연산의 반올림이나 표현 범위 문제까지 사라진다는 뜻은 아닙니다.

4. 정규직교 좌표와 정사영

bb가 QQ의 열공간 안에 있으면 b=Qcb=Qc이고

c=QTb,ci=qiTb.c=Q^Tb,\qquad c_i=q_i^Tb.

일반적인 b∈Rmb\in\mathbb R^m에서는 이 좌표로 원래 벡터를 완전히 복원하지 못할 수 있습니다. 대신 가장 가까운 열공간의 벡터

p=QQTb,e=b−pp=QQ^Tb,\qquad e=b-p

를 얻습니다. QTe=QTb−QTQQTb=0Q^Te=Q^Tb-Q^TQQ^Tb=0이므로 오차는 열공간 전체와 직교합니다.

위 예제에서 b=(2,0,3)Tb=(2,0,3)^T라면

QTb=(2,3)T,p=(1,1,3)T,e=(1,−1,0)T.Q^Tb=(\sqrt2,3)^T,\quad p=(1,1,3)^T,\quad e=(1,-1,0)^T.

∥b∥22=13\|b\|_2^2=13, ∥p∥22=11\|p\|_2^2=11, ∥e∥22=2\|e\|_2^2=2로 피타고라스 정리도 확인됩니다.

가장 가깝다는 사실도 증명할 수 있습니다. 임의의 QcQc에 대해

∥b−Qc∥22=∥e∥22+∥p−Qc∥22≥∥e∥22.\|b-Qc\|_2^2=\|e\|_2^2+\|p-Qc\|_2^2\ge\|e\|_2^2.

서로 직교하는 두 성분으로 나누었기 때문입니다. 최소값은 c=QTbc=Q^Tb에서 얻습니다.

정사영 행렬 P=QQTP=QQ^T는

PT=P,P2=QQTQQT=PP^T=P,\qquad P^2=QQ^TQQ^T=P

를 만족합니다. 한 번 투영한 결과를 다시 투영해도 바뀌지 않습니다. PP가 일반적으로 직교행렬인 것은 아닙니다. 투영에서 버린 성분은 되돌릴 수 없습니다.

5. Gram–Schmidt에서 QR로

독립인 두 열 a1,a2a_1,a_2를 정규직교화하려면 첫 방향을 정규화하고, 둘째 열에서 그 방향의 성분을 뺍니다.

q1=a1∥a1∥2,w2=a2−q1(q1Ta2),q2=w2∥w2∥2.q_1=\frac{a_1}{\|a_1\|_2},\quad w_2=a_2-q_1(q_1^Ta_2),\quad q_2=\frac{w_2}{\|w_2\|_2}.

예를 들어

a1=[110],a2=[112]a_1=\begin{bmatrix}1\\1\\0\end{bmatrix},\qquad a_2=\begin{bmatrix}1\\1\\2\end{bmatrix}

이면 q1q_1은 위 예제와 같고, q1Ta2=2q_1^Ta_2=\sqrt2, w2=(0,0,2)Tw_2=(0,0,2)^T, q2=(0,0,1)Tq_2=(0,0,1)^T입니다. 따라서

[a1 a2]=Q[2202]⏟R.[a_1\ a_2] =Q\underbrace{\begin{bmatrix}\sqrt2&\sqrt2\\0&2\end{bmatrix}}_R.

일반적인 jj번째 단계는

wj=aj−∑i<jqi(qiTaj),rij=qiTaj (i<j),rjj=∥wj∥2.w_j=a_j-\sum_{i<j}q_i(q_i^Ta_j),\qquad r_{ij}=q_i^Ta_j\ (i<j),\qquad r_{jj}=\|w_j\|_2.

wj=0w_j=0이면 현재 열이 앞선 열들의 선형결합이므로 그대로 나눌 수 없습니다. 앞선 열만으로 이미 그 방향을 표현하고 있다는 신호입니다. 실제 계산에서는 거의 종속인 열에 주의해야 하며, 수정 Gram–Schmidt나 Householder QR 같은 방법으로 오차를 다룹니다.

6. 네 부분공간을 정사영으로 읽기

Lecture 2의 관계를 다시 쓰면

Rn=C(AT)⊕N(A),Rm=C(A)⊕N(AT).\mathbb R^n=\mathcal C(A^T)\oplus\mathcal N(A),\qquad \mathbb R^m=\mathcal C(A)\oplus\mathcal N(A^T).

⊕\oplus는 두 공간의 벡터를 더하는 표현이 유일하다는 뜻이며, 여기서는 두 공간이 서로 직교하기도 합니다. 행공간의 정규직교 기저를 VrV_r, 열공간의 정규직교 기저를 UrU_r라고 쓰면

xrow=VrVrTx,xnull=(I−VrVrT)x.x_{\rm row}=V_rV_r^Tx,\qquad x_{\rm null}=(I-V_rV_r^T)x.

출력 쪽에서는 UrUrTbU_rU_r^Tb와 (I−UrUrT)b(I-U_rU_r^T)b로 나눕니다. 뒤의 성분이 0이어야 Ax=bAx=b를 정확하게 풀 수 있습니다. Lecture 6의 SVD는 이 두 정규직교 기저를 함께 제공합니다.

7. 회전과 반사

평면에서 각도 θ\theta만큼 회전하는 행렬은

Rθ=[cos⁡θ−sin⁡θsin⁡θcos⁡θ].R_\theta=\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\cos\theta\end{bmatrix}.

RθTRθ=IR_\theta^TR_\theta=I, det⁡(Rθ)=1\det(R_\theta)=1입니다. 반면 diag⁡(1,−1)\operatorname{diag}(1,-1)은 xx축에 대한 반사이며 행렬식은 −1-1입니다.

단위벡터 uu가 주어지면 Householder 반사는

H=I−2uuTH=I-2uu^T

입니다. Hu=−uHu=-u이고 uTz=0u^Tz=0인 모든 zz에는 Hz=zHz=z입니다. 즉 uu에 수직인 초평면을 기준으로 반사합니다.

HTH=H2=I−4uuT+4u(uTu)uT=I.H^TH=H^2=I-4uu^T+4u(u^Tu)u^T=I.

이러한 반사를 차례로 적용하면 벡터의 특정 성분을 0으로 만들 수 있어 QR 계산에도 쓰입니다.

8. Hadamard와 Haar: 평균과 차이를 분리하기

가장 작은 Hadamard 행렬을 정규화하면

QH=12[111−1].Q_H=\frac1{\sqrt2}\begin{bmatrix}1&1\\1&-1\end{bmatrix}.

QHTxQ_H^Tx의 두 성분은 (x1+x2)/2(x_1+x_2)/\sqrt2, (x1−x2)/2(x_1-x_2)/\sqrt2입니다. 두 값을 평균 방향과 차이 방향으로 바꿔 표현하면서 길이를 보존합니다.

정규화 전 행렬이 HnTHn=nIH_n^TH_n=nI를 만족하면

H2n=[HnHnHn−Hn]H_{2n}=\begin{bmatrix}H_n&H_n\\H_n&-H_n\end{bmatrix}

도 H2nTH2n=2nIH_{2n}^TH_{2n}=2nI를 만족합니다. 이 구성으로 n=2kn=2^k인 크기를 만들고 n\sqrt n으로 나누면 직교행렬이 됩니다.

길이 4인 신호에는 다음 정규직교 Haar 기저를 사용할 수 있습니다.

QW=[1/21/21/201/21/2−1/201/2−1/201/21/2−1/20−1/2].Q_W=\begin{bmatrix} 1/2&1/2&1/\sqrt2&0\\ 1/2&1/2&-1/\sqrt2&0\\ 1/2&-1/2&0&1/\sqrt2\\ 1/2&-1/2&0&-1/\sqrt2 \end{bmatrix}.

첫 열은 전체 평균, 둘째 열은 앞·뒤 절반의 차이, 나머지는 각 절반 안의 세부 차이를 나타냅니다. 정규화 전 열의 길이가 2,2,2,22,2,\sqrt2,\sqrt2로 다르므로 모든 열을 같은 수로 나누면 안 됩니다.

9. Fourier 기저에서는 켤레전치를 쓴다

복소수에서는 zTzz^Tz가 길이의 제곱이 아닙니다. 예를 들어 z=(1,i)Tz=(1,i)^T이면 zTz=0z^Tz=0이지만 zz는 영벡터가 아닙니다. 올바른 내적은

z∗w=∑jzj‾wj,z∗z=∑j∣zj∣2.z^*w=\sum_j\overline{z_j}w_j,\qquad z^*z=\sum_j|z_j|^2.

∗*는 켤레전치를 나타냅니다. 복소수에서 직교행렬에 대응하는 유니터리 행렬은 F∗F=IF^*F=I를 만족합니다.

j,k=0,…,n−1j,k=0,\ldots,n-1에 대해

Fjk=1nωjk,ω=e2πi/nF_{jk}=\frac1{\sqrt n}\omega^{jk},\qquad \omega=e^{2\pi i/n}

로 정하면

(F∗F)kℓ=1n∑j=0n−1ωj(ℓ−k)={1k=ℓ,0k≠ℓ.(F^*F)_{k\ell}=\frac1n\sum_{j=0}^{n-1}\omega^{j(\ell-k)} =\begin{cases}1&k=\ell,\\0&k\ne\ell.\end{cases}

다른 주파수의 열이 직교하는 이유는 등비급수의 합이 0이기 때문입니다. 부호를 반대로 정의하는 DFT 관례도 있으며, 이 글의 정의에서는 분석 변환이 F∗F^*, 복원이 FF입니다.

순환 이동 P(x0,x1,…,xn−1)T=(x1,…,xn−1,x0)TP(x_0,x_1,\ldots,x_{n-1})^T=(x_1,\ldots,x_{n-1},x_0)^T에 대해 FF의 kk번째 열 fkf_k는 Pfk=ωkfkPf_k=\omega^k f_k를 만족합니다. 즉 Fourier 기저는 순환 이동의 고유벡터입니다. 실수 직교행렬도 고유값과 고유벡터를 표현할 때 복소수가 필요할 수 있습니다.

10. 지정 문제 풀이 — I.5의 2, 4, 6번

2번: 이미 있는 방향을 빼기

단위벡터 uu에 대해 w=v−u(uTv)w=v-u(u^Tv)라 놓으면

uTw=uTv−(uTu)(uTv)=0.u^Tw=u^Tv-(u^Tu)(u^Tv)=0.

이것이 Gram–Schmidt의 핵심입니다. vv도 단위벡터라면 ∥w∥22=1−(uTv)2\|w\|_2^2=1-(u^Tv)^2입니다. 단, u,vu,v가 평행하면 w=0w=0이므로 새로운 정규직교 벡터를 얻을 수 없습니다.

4번: 내적 보존에서 길이와 각도 보존까지

QTQ=IQ^TQ=I이면 (Qx)T(Qy)=xTy(Qx)^T(Qy)=x^Ty입니다. y=xy=x를 대입하면 길이가 보존되고, 내적을 두 길이의 곱으로 나누면 영이 아닌 두 벡터 사이의 각도도 보존됩니다. 이 증명에는 QQT=IQQ^T=I가 필요하지 않으므로 정규직교 열을 가진 직사각형 QQ에도 적용됩니다.

6번: 순환 순열행렬의 역행렬

P=[0100001000011000].P=\begin{bmatrix}0&1&0&0\\0&0&1&0\\0&0&0&1\\1&0&0&0\end{bmatrix}.

각 열은 서로 다른 표준기저 벡터이므로 PTP=IP^TP=I이고 P−1=PTP^{-1}=P^T입니다. PP는 한 칸 순환 이동, PTP^T는 반대 방향 한 칸 이동입니다. 네 번 이동하면 제자리이므로 P4=IP^4=I도 성립합니다.

11. NumPy로 확인하기

import numpy as np

Q = np.array([[1 / np.sqrt(2), 0.],
[1 / np.sqrt(2), 0.], [0., 1.]])
b = np.array([2., 0., 3.])
P = Q @ Q.T
projection = P @ b
residual = b - projection
assert np.allclose(Q.T @ Q, np.eye(2))
assert not np.allclose(P, np.eye(3))
assert np.allclose(P @ P, P)
assert np.allclose(projection, [1., 1., 3.])
assert np.allclose(Q.T @ residual, 0)
assert np.isclose(b @ b, projection @ projection + residual @ residual)

A = np.array([[1., 1.], [1., 1.], [0., 2.]])
R = np.array([[np.sqrt(2), np.sqrt(2)], [0., 2.]])
assert np.allclose(A, Q @ R)

Haar = np.array([[.5, .5, 1 / np.sqrt(2), 0.],
[.5, .5, -1 / np.sqrt(2), 0.],
[.5, -.5, 0., 1 / np.sqrt(2)],
[.5, -.5, 0., -1 / np.sqrt(2)]])
assert np.allclose(Haar.T @ Haar, np.eye(4))

n = 4
k = np.arange(n)
F = np.exp(2j * np.pi * np.outer(k, k) / n) / np.sqrt(n)
shift = np.roll(np.eye(n), -1, axis=0)
assert np.allclose(F.conj().T @ F, np.eye(n))
assert np.allclose(shift @ F, F @ np.diag(np.exp(2j * np.pi * k / n)))
print("Orthogonality, projection, QR, Haar, and Fourier checks passed.")

12. 복습 질문

  1. QTQ=IQ^TQ=I로부터 QQT=IQQ^T=I를 결론 내려면 어떤 조건이 더 필요한가?
  2. 정사영 오차가 열공간과 직교하면 왜 거리가 최소가 되는가?
  3. Gram–Schmidt에서 정규화할 벡터가 0이 되는 것은 어떤 의미인가?
  4. Householder 반사에서 바뀌는 방향과 그대로인 방향은 무엇인가?
  5. Fourier 행렬에서 전치 대신 켤레전치를 사용해야 하는 이유는 무엇인가?

참고 자료

이전: Lecture 2 · 전체 목차 · 다음: Lecture 4