대칭행렬의 대각화
대칭행렬(Symmetric matrix)은 주 대각원소를 기준으로 위 부분과 아래부분의 원소들이 대칭되는 구조이며 대표적인 특성으로 식 1에 나타낸 것과 같이 원시행렬과 전치행렬은 같습니다.
식 1은 모든 대칭행렬에 대한 특성이지만 고유값 분해의 조건을 만족하는 가역적 대칭행렬의 경우는 다음의 특성을 가집니다.
- 서로 다른 고유값에 대응하는 고유벡터들은 직교(orthogonal) 관계에 있습니다
- 정규직교(orthonormal) 관계로 변형할 수 있습니다.
- 식 2와 같이 가역적 대칭행렬을 구성하는 각 열벡터(
)의 내적은 0가 됩니다.
식 2의 증명은 식 3과 같이 λ1x1Tx2를 정리하는 것으로 시작합니다.
식 3을 정리하면 식 4와 같이 나타낼 수 있습니다.
식 5.3.4에서 고유값 λ1과 λ2이 서로 다르기 때문에 고유벡터들 x1과 x2의 내적이 0 이어야 합니다. 이것은 두 벡터의 내적이 0인 것으로 그 고유벡터들은 서로 직교 관계에 있음을 의미합니다. 이 고유벡터들을 모두 정규화시키면 즉, 단위벡터화하면 정규 직교 관계가 됩니다.
가역적 대칭행렬인 경우 위 식 4를 성립합니다. 즉, 고유행렬은 정규직교행렬이 됩니다. 그러나 비가역 대칭행렬의 경우 고유벡터의 정규직교성을 나타내기도 합니다. 그러므로 행렬의 정규직교성은 식 5의 확인으로 결정합니다( 정규직교 참조).
예 1)
벡터 A의 고유벡터들의 직교성을 결정하여 봅니다.
A=np.array([[6,-2,-1], [-2,6,-1], [-1,-1,5]]) d, P=la.eig(A) print(P.round(2))
[[ 0.58 0.71 -0.41] [ 0.58 -0.71 -0.41] [ 0.58 0. 0.82]]
고유행렬의 각 열벡터들사이의 내적을 계산합니다.
for i, j in itertools.combinations(range(3), 2): print(round(P[:, i-1]@P[:, j-1],3))
-0.0 -0.0 -0.0
위 결과는 고유벡터들은 서로 직교함을 나타냅니다. 이것은 행렬 A가 대칭행렬로 가역적임을 나타냅니다.
선형독립인 대칭행렬 A는식 6과 같이 대각화가 가능하므로 고유값분해가 성립됩니다.
다시 말하면 A가 가역적이고 대칭행렬일 경우 고유벡터 행렬은 직교행렬이 되며 직교행렬을 정규직교행렬로 전환할 수 있으므로 이 행렬은 전치행렬과 역행렬이 같습니다. 그러므로 식 7이 성립합니다.
식 7에서 D는 서로 다른 고유값을 대각 요소로하는 대각행렬, P는 각 고유값에 대응하는 고유행렬입니다. 행렬 A에 대응하는 대각행렬은 다음과 같습니다.
D=np.diag(d) print(D)
[[3. 0. 0.] [0. 8. 0.] [0. 0. 6.]]
다음 결과와 같이 A의 고유행렬 P의 각 벡터의 크기는 1이므로 행렬 P는 정규직교행렬입니다. 이 행렬의 경우 전치행렬과 역행렬은 같습니다.
for i in range(P.shape[1]): print(F"Norm of {'P'+str(i)}:{la.norm(P[:,i]).round(3)}")
Norm of P0:1.0 Norm of P1:1.0 Norm of P2:1.0
print(np.isclose(la.inv(P), P.T))
[[ True True True] [ True True True] [ True True True]]
예 2)
다음 행렬 B의 대각화 과정에서의 p는 직교행렬인지를 확인해 봅니다.
B=np.array([[3,-2,4],[-2,6,2],[4,2,3]]) la.det(B).round(3)
-98.0
대칭행렬 B는 가역적입니다.
d,P=la.eig(B) print(d)
[ 7. -2. 7.]
위 결과와 같이 두개의 고유값이 같으므로 행렬 B의 열차원과 고유값의 수에서 차이가 납니다. 이는 가역적 대칭행렬의 특성(식 2)에 위배되므로 식 7은 성립하지 않습니다.
D=np.diag(d) np.allclose(B, P@D@la.inv(P))
True
np.allclose(B, P@D@P.T)
False
즉, 대각화가 이루어지지 않으며 고유행렬은 직교행렬이 아닙니다.
for i, j in itertools.combinations(range(3), 2): print("%d와 %d 열벡터의 내적: %.3f" %(i+1, j+1, P[:, i]@P[:,j]))
1와 2 열벡터의 내적: -0.000 1와 3 열벡터의 내적: -0.111 2와 3 열벡터의 내적: 0.000
위 결과와 같이 고유벡터 P1과 P3는 직교관계가 성립하지 않습니다. 그러므로 PT = P-1의 관계가 성립하지 않습니다. 이 관계를 성립시키기 위해 P[:,0]과 P[:,2] 벡터 사이의 직교벡터들로 고유행렬을 대체할 수 있습니다.
Gram-Schmit 과정으로 그 직교벡터들을 계산할 수 있지만 이 결과는 QR 분해의 Q와 같습니다. linalg.qr()함수를 적용하여 정규직교벡터들을 계산하면 다음과 같습니다.
Q,R=la.qr(P[:,[0,2]]) print(Q.round(3))
[[-0.745 0. ] [ 0.298 -0.894] [-0.596 -0.447]]
위 결과들을 P[:,0]과 P[:,1]을 대체하여 새로운 고유행렬(P2)을 생성합니다.
P2=np.c_[Q[:,1],P[:,1], Q[:,0]] print(P2.round(3))
[[ 0. -0.667 -0.745] [-0.894 -0.333 0.298] [-0.447 0.667 -0.596]]
행렬 P2는 대칭행렬의 직교성을 확보합니다. 즉, P2T = P2-1관계가 성립합니다.
np.allclose(P2.T, la.inv(P2))
True
그러므로 식 5.3.5가 성립합니다.
np.allclose(B, P2@D@la.inv(P2))
True
np.allclose(B, P2@D@P2.T)
True
댓글
댓글 쓰기