위키북스의 파이썬 머신러닝 완벽 가이드 책을 토대로 공부한 내용입니다.
NMF는 Truncated SVD와 같이 낮은 랭크를 통한 행렬 근사(Low-Rank Approximation) 방식의 변형이다. NMF는 원본 행렬 내의 모든 원소 값이 모두 양수라는 것이 보장되면 좀 더 간단하게 두 개의 기반 양수 행렬로 분해될 수 있는 기법이다. 행렬 분해(Matrix Factorization)은 일반적으로 SVD와 같은 행렬 분해 기법을 통칭하는 것으로 원본 행렬을 근사하여 분해시킨다. 원본 행렬 V를 W 행렬과 H 행렬로 분해하는데 일반적으로 원본 행렬의 행 크기가 같고 열 크기가 작은 행렬을 W, 원본 행렬의 행 크기보다 작고, 열 크기가 같은 행렬을 H로 한다. 이렇게 분해된 행렬은 잠재 요소를 특성으로 가지고, 분해 행렬 W는 원본 행에 대해서 이 잠재 요소의 값이 얼마나 되는지에 대응하며, 분해 행렬 H는 이 잠재 요소가 원본 열로 어떻게 구성됐는지를 나타내는 행렬이다.
NMF는 SVD와 유사하게 차원 축소를 통한 잠재 요소 도출로 이미지 변환 및 압축을 통한 패턴 인식, 텍스트의 토픽 모델링 기법, 문서 유사도 및 클러스터링 등의 영역에서 사용되고 있다. 또한 영화 추천과 같은 추천(Recommendations) 영역에 활발하게 적용되며, 사용자의 상품 평가 dataset인 사용자-평가 순위(user-Rating) dataset을 행렬 분해 기법을 통해 분해하면서 사용자가 평가하지 않은 상품에 대한 잠재적인 요소를 추출해 이를 통해 평가 순위(Rating)를 예측하고, 높은 순위로 예측된 상품을 추천해주는 방식이다. 이를 잠재 요소(Latent Factoring) 기반의 추천 방식이라고 한다.
사이킷런의 NMF 클래스를 이용하여 iris dataset을 차원 축소하고 시각화해보겠다.
from sklearn.decomposition import NMF from sklearn.datasets import load_iris import matplotlib.pyplot as plt %matplotlib inline iris = load_iris() iris_ftrs = iris.data nmf = NMF(n_components=2) nmf.fit(iris_ftrs) iris_nmf = nmf.transform(iris_ftrs) plt.scatter(x=iris_nmf[:,0], y= iris_nmf[:,1], c= iris.target) plt.xlabel('NMF Component 1') plt.ylabel('NMF Component 2')
[output]