기계 학습 초보자에 의한 자연 언어 처리 고찰②

소개



자연언어 처리 100개 노크 제7장에서 「계층형 클러스터링」이 나왔으므로, 초보자의 나 나름대로 이해할 수 있던 부분을 기재한다.

제7장-68 문제문



국가 이름과 관련된 단어 벡터에 대해 Ward 방법으로 계층 적 클러스터링을 수행하십시오. 또한 클러스터링 결과를 덴드로그램으로 시각화하십시오.

제7장-68 해답



이하의 코드가 정답이 되고 있다. ( 이 기사 보다 인용)
from sklearn.cluster import KMeans

# k-meansクラスタリング
kmeans = KMeans(n_clusters=5)
kmeans.fit(countries_vec)
for i in range(5):
    cluster = np.where(kmeans.labels_ == i)[0] #cluster毎に分類されたcuntriesのラベル(3,17,18,...)を取得
    print('cluster', i)
    print(', '.join([countries[k] for k in cluster])) #取得したラベルに紐づくcuntries(3:Zambia,17:Sudan,18:Namibia,...)を表示

출력
cluster 0
Zambia, Sudan, Namibia, Uganda, Guinea, Kenya, Zimbabwe, Angola, Gabon, Rwanda, Nigeria, Mozambique, Mauritania, Algeria, Madagascar, Ghana, Mali, Tunisia, Liberia, Niger, Senegal, Malawi, Eritrea, Burundi, Gambia, Botswana
cluster 1
Albania, Kazakhstan, Russia, Slovakia, Montenegro, Ukraine, Hungary, Turkey, Azerbaijan, Poland, Greece, Bulgaria, Romania, Lithuania, Slovenia, Moldova, Estonia, Belarus, Macedonia, Serbia, Latvia, Croatia, Armenia, Georgia, Cyprus, Uzbekistan, Turkmenistan
cluster 2
Ecuador, Guyana, Fiji, Suriname, Samoa, Nicaragua, Belize, Chile, Cuba, Bahamas, Peru, Tuvalu, Mexico, Jamaica, Colombia, Dominica, Venezuela, Honduras
cluster 3
England, Morocco, Switzerland, Greenland, Uruguay, Europe, Germany, Austria, Argentina, Australia, USA, Sweden, Ireland, Iceland, Belgium, Spain, Denmark, Finland, Canada, Netherlands, Liechtenstein, France, Norway, Malta, Brazil, Portugal, Italy, Japan
cluster 4
Indonesia, Iraq, Taiwan, India, Korea, Kyrgyzstan, Vietnam, Libya, Somalia, Iran, Jordan, Bangladesh, Qatar, Egypt, Nepal, China, Thailand, Cambodia, Lebanon, Bhutan, Malaysia, Tajikistan, Bahrain, Syria, Oman, Pakistan, Laos, Afghanistan, Philippines, Israel
from matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

plt.figure(figsize=(15, 5))
Z = linkage(countries_vec, method='ward')
dendrogram(Z, labels=countries)
plt.show()



linkage 함수



여기서 이해에 시달린 것은 「linkage 함수」이다.
linkage는 Scipy에 포함된 패키지이며, 다음과 같은 구조로 되어 있다.
scipy.cluster.hierarchy.linkage(df, method='ward', metric='euclidean', optimal_ordering=False)

인수 method에서 계층적 클러스터링 기법을 선택하고 있다.
- method = 'single': 최소 결합 방법
- method = 'complite': 최대 결합 방법
- method = 'average':군 평균법
- method = 'ward': 워드법
이번에 선택된 「워드법」이란, 응집형 계층적 클러스터링이라고 불리는 클러스터링의 방법의 하나이다.
응집형 계층적 클러스터링이란,
1. 모든 점이 별개의 클러스터인 상태로 시작
2. 「지금 있는 클러스터 중에서 가장 거리가 가까운 2개의 클러스터를 선택해 1개의 클러스터에 합체한다」라고 하는 조작을 실시한다
3. 합체를 목표 클러스터 수가 될 때까지 반복
라는 수법이 되고 있다.

인용 소스 : 워드 법에 의한 클러스터링 방법
metric='euclidean'는 점 사이의 거리를 유클리드 거리 (두 점 사이의 직선 거리)로 정의한다는 의미입니다. 그 밖에도 밍코프스키 거리·코사인 거리 등을 선택할 수 있는 것 같지만, 기본적으로 유클리드 거리를 선택하면 좋기 때문에 할애한다.

이야기를 되돌릴 때,
Z = linkage(countries_vec, method='ward')
dendrogram(Z, labels=countries)

여기서는 linkage 함수를 이용하여 countries_vec(국가 목록을 단어 벡터로 나타낸 것)을 워드법에 의해 목표 클러스터 수(=5)가 될 때까지 클러스터링을 반복하고 있다.

좋은 웹페이지 즐겨찾기