Python

[차원축소와 군집분석] NMF : Non-negative Matrix Factorization

2022. 10. 4. 19:44

NMF 
Non-negative Matrix Factorization


NMF  Non-negative Matrix Factorization

하나의 데이터 X를 가중치 W와 점수 H의 곱으로 쪼갬

이때 W와 H는 모두 ≥0 

 

•  PCA에 비해 점수의 해석이 좀 더 쉬움. (음수가 나오지 않기 때문에)
•  원데이터를 보존하지는 않음

 

 


문서  단어  행렬  Document-Term Matrix

문서별 단어의 빈도를 정리한 행렬

  에게 만들다 아름다운 한글
Doc1 1 0 1 2
Doc2 0 2 2 2
Doc3 4 0 3 5
Doc4 2 0 2 3

 


  Python : PCA와 NMF로 차원 축소 & 해석하기  

data : 심리학 논문 초록 데이터

PCA NMF
# 데이터 불러오기
import pandas as pd

psyabs = pd.read_excel('C:\\Users\\suyeo\\Downloads\\dataset\\ann_rev_psy.xlsx')
# 10차원으로 축소
from sklearn.decomposition import PCA

# 논문에 나오는 단어 패턴을 10개의 점수로 요약한다.
pca = PCA(n_components=10)
pca.fit(psyabs)
# 10차원으로 축소
from sklearn.decomposition import NMF


# 논문에 나오는 단어 패턴을 10개의 점수로 요약한다.
nmf = NMF(n_components=10)
nmf.fit(psyabs)
# 단어별 가중치
import pandas as pd

weight = pd.DataFrame(pca.components_.T)
# pca.components_.T 
< 어떤 단어들이 많이 나오면 점수가 많이 올라가나 => 즉 가중치


weight.index = psyabs.columns
weight
# 단어별 가중치
import pandas as pd


weight2 = pd.DataFrame(nmf.components_.T)




weight2.index = psyabs.columns
weight2
# 해석
weight.sort_values(by=0, key=abs, ascending=False)

#해석
weight2.sort_values(by=0,
                                 ascending=False)

> memory가 많이나오면,
    research가 많이 나오면 올라간다??

점수를 이해하기가 쉽지 않다.
rotation을 해주면 이해하는데 조금 도움이 될 수 있지만
지금은 이해하기가 쉽지 않다.

이럴때 NMF를 사용하면 이해가 쉬워진다.


> 최근(new, recent), 연구(research, work) 등에 관련된 차원임을 알 수 있음
> NMF로 차원축소한 차원의 해석
weight2.sort_values(1).tail(10)
 
> 기억(memory)과 관련된 주제의 논문이면 1번 점수가 올라간다.

'NMF 차원축소' 를 사용할 수 있는 예

 * 차원축소는 '점수'를 만드는 것이 목적 

 

· 고객 리뷰 분석

· 최근 뉴스 동향

· 기존 제품 설명 분석 > 제품 특성 점수화