티스토리 뷰

Study/AI

[R] Matrix Multiplication in R

생각많은 소심남 2015. 2. 18. 15:00

잠깐 R을 활용해서 Matrix Multiplication을 하는 방법에 대해서 소개하고자 한다. 어차피 dataset을 다루게 되면 그 dataset은 분명히 몇개의 row와 column으로 이뤄져 있을 것이고, 이를 활용해서 Linear Model을 찾으려면 반드시 필요한 작업이 Matrix Multiplication일 것이다. 예제로 다음과 같은 4개의 미지수로 이뤄진 방정식이 있다고 가정하자.



우리가 알고 싶은건 a,b,c,d 각각의 값이 되는데 실제로 손을 이용해서 계산하면 Inverse도 해줘야 되고 복잡하다. 그런데 R이나 matlab 같이 Matrix operation에 특화되어 있는 툴을 활용하면 무척 쉽게 계산할 수 있다. 일단 R에서 좌변의 coefficient에 해당하는 행렬을 만들어준다. matrix라는 함수와 combine함수를 활용하면 자기가 원하는 행과 열을 가진 함수를 만들 수 있다.


그리고 해에 해당하는 것들도 따로 행렬을 만들어준다.


우리가 선형 대수학에서 배운게 맞으면 미지수를 구하기 위해선 양변에 x의 inverse에 해당하는 행렬을 앞에 곱해줘야 한다. (x*x' = I) 결국 위에서도 x의 inverse와 y를 곱해줘야 하는데 inverse를 구하려면 solve라는 함수를 쓰면 된다.



이렇게 구했으면 이제 곱해주면 되는데, 뭔가 한가지 놓치는게 있을 수 있다. 지금 우리의 목적은 Matrix Multiplication이다. Scalar multiplication이 아니라... R 자체의 muliplication operator 의 default가 Scalar mult 이기 때문에 그냥 곱셈만 하게 되면 당연히 오류가 뜬다. 그럼 이 연산을 할때는 matrix mult를 할 수 있게 해줘야 할텐데, 이때는 operator의 앞과 뒤에 %마크를 추가시켜주면 된다.


이를 통해서 우리는 앞의 문제에서 요구한 a,b,c,d의 값을 쉽게 구할 수 있다. matrix를 만드는 방법과 inverse시켜주는 solve함수, 그리고 matrix multiplication을 할때 %를 넣어줘야 한다는 것만 알고 있으면 쉽게 해결할 수 있는 문제다.


그리고 지금 이 과정 자체는 matrix mult의 연산과정을 보여주고 하는 목적에서 수행한 것이지, 사실 solve(x,y)라고 해주면 쉽게 값을 구해준다.


참고로 내가 궁금했던 내용중 하나였는데, 과연 이런 matrix multiplication을 이용한 연산이 우리가 흔히 알고 있는 multiplication 연산으로 풀어서 한것보다 얼마나 빠를까 였었는데 마침 이에 대한 결과도 있길래 추가해본다.

 우선 x와 y에 대해서 임의의 행렬을 만들고 앞에서 소개한 방법으로 구하고 시간을 측정하면 다음과 같다.


반면 무식하게 element 단위로 분해해서 곱해보면 다음과 같다.

이게 사실 matlab이나 R이 powerful한 이유다. 요즘에 많이 연구하는 Image Processing이나 3D graphics쪽도 어떻게 보면 행렬의 집합체를 다루는 분야인데 우리가 기초시간에 배웠던 방법으로 뭔가 실시간으로 처리하기보다는 이렇게 matrix 단위로 연산하는게 훨씬 더 빠르다. 

댓글