jwjwvison 2022. 2. 26. 15:25

 1. 기본적인 QR분해 방법

 행렬 A가 nxp 행렬이고 풀 랭크라고 가정하겠다. 이는 행렬 A의 열벡터는 모두 선형 독립이라는 의미이다. 행렬 A의 열 벡터끼리는 서로 선형 독립이므로 다음 그림과 같이 나타낼 수 있다.

 위와 같이 행렬 A의 열 벡터가 모두 선형 독립이므로 행렬 A의 열 벡터는 해당 행렬이 공간의 기저가 될 수 있다. 행렬 A의 열 벡터끼리 모두 선형 독립일 때 행렬 A는 다음과 같이 분해할 수 있다.

 이때 Q는 nxp 행렬이고, 정규 직교 벡터로 구성되어 있으며,  R은 가역 상 삼각행렬이다.

 QR분해는 크기가 큰 행렬의 고윳값을 구하는 데에 유용하게 사용된다.

2. 그램 슈미트 과정을 이용한 QR분해

 다음과 같은 행렬 A를 QR분해해 보자.

 먼저 그램 슈미트 과정을 이용해 행렬 A의 직교 벡터 u1,u2,u3를 구해보겠다.

 

 1. 그램 슈미트 첫 번째 단계

 2. 그램 슈미트 두 번째 단계

 3. 그램 슈미트 세 번째 단계

 

 이로써 직교 기저 벡터를 모두 구했다.

 

 이제 정규 직교 벡터로 변환해야 한다.

 따라서 Q행렬은 다음과 같다.

 마지막으로 R 행렬을 구한다. 행렬 R을 구하는 식은 다음과 같다.

 따라서, 행렬 A를 QR 분해한 결과는 다음과 같다.

 

넘파이를 사용한 내적 실습

import numpy as np

a=np.array([1,2,3])
b=np.array([4,5,6])
res=np.inner(a,b)
print(res)    #32

 

넘파이를 사용한 QR분해 실습

import numpy as np
A=np.array([[1,0,1],[0,1,1],[1,2,0]])
Q,R=np.linalg.qr(A)

print(Q)
'''
[[-0.70710678  0.57735027 -0.40824829]
 [-0.         -0.57735027 -0.81649658]
 [-0.70710678 -0.57735027  0.40824829]]
'''
print(R)
'''
[[-1.41421356 -1.41421356 -0.70710678]
 [ 0.         -1.73205081  0.        ]
 [ 0.          0.         -1.22474487]]
'''

 결과를 보면 우리가 손으로 구한 Q행렬과 부호가 다른것을 알 수 있는데 QR분해한 후 부호에 대해서 행렬 전체의 부호가 다른 것은 상관없다.

 

역행렬을 구할 수 있다면 선형방정식의 해는 QR 분해의 결과를 이용하여 x=(R-1)(QT)b를 통하여 구할 수 있다.