한 줄 요약: full column rank 행렬 A는 row space에 딸려(?) 있는 nullspace 자체가 {0} 이기 때문에 A의 변환으로 이동한 Ax 벡터는 A의 column space에 있게 되고, Ax 에 대한 역변환이 가능하다는 것이다.
3x2 행렬 A가 있다. 그리고 컬럼은 모두 서로 독립이다. A의 left-inverse 는?
행렬에 대한 몇 가지 사실은 아래와 같다.
ATA 에 대해서 우리가 알고 있는것은?
그럼, \(A^TA\)의 역행렬에 \(A^T\)를 곱한것을 \(A^{-1} left\) 라고 한다면,
\(A^{-1} left = (A^TA)^{-1}A^T\)
\(A^{-1} left\) 에 A를 곱하게 되면 단위행렬이 나온다.
# 행렬 A를 정의한다.
A <- matrix(c(1, 2, 3, 4, 5, 6), nrow=3, byrow=F)
A
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
# ATA 를 구한다.
A_T <- t(A) # A의 전치행렬
A_TA <- A_T %*% A
A_TA
## [,1] [,2]
## [1,] 14 32
## [2,] 32 77
# A-1 left 를 구한다.
A_1_left <- solve(A_TA) %*% A_T
A_1_left
## [,1] [,2] [,3]
## [1,] -0.9444444 -0.1111111 0.7222222
## [2,] 0.4444444 0.1111111 -0.2222222
# (A-1 left) * A 가 단위행렬이 됨을 확인한다.
round(A_1_left %*% A)
## [,1] [,2]
## [1,] 1 0
## [2,] 0 1
이번에는 위에서 구한 A-1 left를 이용해서 역행렬이 정상적으로 동작하는지 확인하자.
# x = (2, 3) 이라고 했을 경우 Ax 값을 구하고, A-1 left 를 이용해서 다시 x 를 구해보자.
x <- c(2, 3) # x 정의
y <- A %*% x # Ax 계산
y
## [,1]
## [1,] 14
## [2,] 19
## [3,] 24
A_1_left %*% y # A-1 left 를 곱하면, 원래 x 가 나오는지 확인한다.
## [,1]
## [1,] 2
## [2,] 3