2014-10-19 2 views
3

데이터가 분해되는 동안 각 클러스터의 주요 기능/용어를 결정할 수있는 방법이 있습니까?sklearn decomposition top terms

sklearn 설명서의 예제에서 맨 위 용어는 피쳐를 정렬하고 동일한 피쳐 수의 벡터화 자 feature_names와 비교하여 추출됩니다.

http://scikit-learn.org/stable/auto_examples/document_classification_20newsgroups.html

나는) (get_top_terms_per_cluster을 구현하는 방법을 알고 싶습니다 : 일부 k에 대한 lsa = TruncatedSVD(n_components=k) 가정

X = vectorizer.fit_transform(dataset) # with m features 
X = lsa.fit_transform(X) # reduce number of features to m' 
k_means.fit(X) 
get_top_terms_per_cluster() # out of m features 

답변

6

는 용어 가중치를 얻을 수있는 확실한 방법은 사실의 사용을 만드는 LSA/SVD 는 선형 변환입니다. 즉, lsa.components_의 각 행은 입력 된 단어의 가중치 합이며 k- 평균의 클러스터 중심과 곱할 수 있습니다.

가의 몇 가지를 설정하자 일부 모델의 훈련 :

>>> from sklearn.datasets import fetch_20newsgroups 
>>> from sklearn.feature_extraction.text import TfidfVectorizer 
>>> from sklearn.cluster import KMeans 
>>> from sklearn.decomposition import TruncatedSVD 
>>> data = fetch_20newsgroups() 
>>> vectorizer = TfidfVectorizer(min_df=3, max_df=.95, stop_words='english') 
>>> lsa = TruncatedSVD(n_components=10) 
>>> km = KMeans(n_clusters=3) 
>>> X = vectorizer.fit_transform(data.data) 
>>> X_lsa = lsa.fit_transform(X) 
>>> km.fit(X_lsa) 

은 지금 LSA 구성 요소와 곱하면 무게 중심 케이 - 의미 : 다음 인쇄

>>> X.shape 
(11314, 38865) 
>>> lsa.components_.shape 
(10, 38865) 
>>> km.cluster_centers_.shape 
(3, 10) 
>>> weights = np.dot(km.cluster_centers_, lsa.components_) 
>>> weights.shape 
(3, 38865) 

을; 우리는 LSA로 인해 부호 불확정성의 무게에 대한 절대 값이 필요합니다

>>> features = vectorizer.get_feature_names() 
>>> weights = np.abs(weights) 
>>> for i in range(km.n_clusters): 
...  top5 = np.argsort(weights[i])[-5:] 
...  print(zip([features[j] for j in top5], weights[i, top5])) 
...  
[(u'escrow', 0.042965734662740895), (u'chip', 0.07227072329320372), (u'encryption', 0.074855609122467345), (u'clipper', 0.075661844826553887), (u'key', 0.095064798549230306)] 
[(u'posting', 0.012893125486957332), (u'article', 0.013105911161236845), (u'university', 0.0131617377000081), (u'com', 0.023016036009601809), (u'edu', 0.034532489348082958)] 
[(u'don', 0.02087448155525683), (u'com', 0.09758), (u'people', 0.033365757270264217), (u'edu', 0.036318114826463417), (u'god', 0.042203130080860719)] 

마음 당신은, 당신은 정말이 일을 할 수있는 중지 단어 필터가 필요합니다. 정지 단어는 모든 단일 구성 요소에서 끝나고 모든 클러스터 중심에서 높은 가중치를 얻는 경향이 있습니다.

+0

답장을 보내 주셔서 감사합니다. 왜 이것이 정확한지 직감을 설명해 주시겠습니까? –

+1

@OferHelman : LSA 구성 요소는 용어의 선형 조합입니다. k-means centroid는 LSA 구성 요소의 선형 조합입니다. 기본 선형 대수학은 우리가 두 개를 곱하여 하나의 선형 조합의 집합으로 결합 할 수 있다고 말합니다. –