기본적으로 역행렬은 행렬이 정방행렬일 때만 구할 수 있다. 따라서 행렬이 직사각형 행렬이면 역행렬을 구할 수 없다. 이때는 대신 의사역행렬이라는 것을 구한다. 



▶ 의사역행렬(pseudo inverse)


행렬 A가 직사각형 행렬인 경우에는 의사역행렬을 구한다. 의사역행렬은 로 표기된다. 의사역행렬을 구하기 위해서 주로 특이값분해(SVD)를 사용한다. 행렬 A를 특이값분해하면 


...(공식1: 특이값 분해)


이 된다. 만약 행렬 A가 m > n인 경우(위로 길쭉한 직사각형 행렬)라면 특이값 행렬(m x n)은 아래와 같을 것이다. 



행렬 A의 의사역행렬은 아래와 같이 계산된다. 


...(공식2: 의사역행렬)


이때 은 특이값행렬 의 0이 아닌 특이값들은 역수를 취하고나서 전치시킨 행렬과 같다. 따라서 n x m의 크기를 갖는다.




예제1>>


그러면 아래와 같은 직사각형 행렬 A(n > m)의 의사역행렬을 구해보자. 



우선 특이값분해를 통해 V, U,를 찾아야한다. 이전에 포스팅한 http://bskyvision.com/251에 이 직사각형 행렬을 특이값분해한 결과가 있으니 그대로 가져와서 사용하도록 하겠다.



따라서 



이 된다. 공식2에 따라 하나씩 대입해주면 행렬 A의 의사역행렬을 구할 수 있다. 



n > m이므로 이것은 행렬A의 우역행렬이 된다. 즉, 오른쪽에 곱해줘야 항등행렬이 만들어진다는 의미다. 



여기서 항등행렬 I는 2 x 2의 사이즈를 갖는다. 참고로 m > n인 행렬의 의사역행렬을 구했다면, 이것은 행렬A의 좌역행렬이 되므로 왼쪽에 곱해줘야 항등행렬이 만들어진다. 


예제 1 끝!



▶ 정리

 

마지막으로 정리하면 행렬 A가 독립열들을 지닌 정방행렬만이 역행렬을 구할 수 있고, 그것을 제외한 모든 행렬은 구할 수 없는 역행렬 대신 의사역행렬을 구할 수 있다. 의사역행렬은 SVD를 이용해서 어렵지 않게 구할 수 있다. 



<참고 자료>

[1] http://darkpgmr.tistory.com/106?category=460967, 다크프로그래머님의 설명


Posted by 톈진난만

댓글을 달아 주세요



티스토리 툴바