티스토리 뷰
파이썬으로 NNMF (Non-Negative Matrix Factorization) 구현해보기
link9 2016. 9. 25. 16:42선형대수에서 Matrix Factorization 방법중 한가지인 NNMF 를 Jupyter 로 간단하게 구현해 보았습니다.
MF ( Matrix Factorization ) 은 머신러닝에서 자주 쓰이는 알고리즘입니다.
종종 Amazon 이나 여러 쇼핑몰 사이트에서는 내가 둘러본 상품을 바탕으로 다른 상품을 추천해 주는걸 볼 수 있는데요.
이때 많은 부분이 MF 을 이용한 추천 시스템인 것으로 알고있습니다.
Matrix 분해는 SVD, NNMF 등이 있는데 저는 가장 기본적이고 Gradient Descent 를 이용하는 NNMF 를 공부해보았습니다.
위와 같이 행은 User 를, 열은 Item 을 나타내는 NxM 크기의 Matrix (R) 가 있다고 할때

가 되도록 분해하는 P 와 Q 매트릭스를 Gradient Descent 를 이용하는 구하는 방법입니다.
주로 응용되는 추천시스템을 예로들면
아래처럼 각 User 가 어떤 영화 Item 을 얼마나 감상했는지에대한 매트릭스를 상상할수 있습니다.
그런데 어떤 한 User a 가 f 에 해당하는 장르의 영화를 많이 보아서
(User a, Feature f) 에 대한 점수가 높으면서 동시에 어떤 영화 b 도 Feature f 에 대해 (영화 b, Feature f) 큰 값을 가질때,
우리는 User a 가 영화 b 를 본 데이터가 0 (안봤음) 임에도
그 영화를 보도록 추천해 줄 수가 있겠지요~ (새로운 적용 가능성의 예측!)
알고리즘은 다음과 같이 간단합니다.
FOR 각 메트릭스의 요소 iteration:
실제 R - P x Q 를 통하여 error 구하기
error gradient 를 구하고 P, Q 의 요소를 업데이트
위를 계속 반복하여 근사값에 가까운 P, Q 를 구합니다.
사용되는 수식은 다음과 같습니다.
Error : 
Gradient : 
Update : 

이 방법은 sparse 한 데이터에 응용이 자주 되곤합니다.
언뜻 전혀 무관해 보이지만, 분석해야할 데이터가 많이 쌓이고 있는 의약학 분야에서도
약물-질병의 관계를 통해 약물을 재창출 하거나 약물에 의해 교란되는 Pathway 를 확인하는 연구,
환자의 진료정보가 담긴 EMR 데이터에도 응용하는 등 연구에 응용될 여지가 많이 남아있습니다.
이번 포스팅에서는 원리와 구현에 대해 간단하게 알아보았는데요.
다음에는 applications 에 대해 알아보고 포스팅 하겠습니다.
제가 만든 소스는 다음과 같습니다.
http://nbviewer.jupyter.org/github/link9/output-ipynb/blob/master/NNMF-Tutorial.ipynb
감사합니다!
Reference)
http://www.quuxlabs.com/blog/2010/09/matrix-factorization-a-simple-tutorial-and-implementation-in-python/
http://www.slideshare.net/irecsys/matrix-factorization-in-recommender-systems
http://katbailey.github.io/post/matrix-factorization-with-tensorflow/
