# !pip install kmodes
# !pip install kmodes
import matplotlib.pyplot as plt
from kmodes.kmodes import KModes
import pandas as pd
import numpy as np
data = np.array([['A', 'B', 'C'],
['B', 'C', 'A'],
['C', 'A', 'B'],
['A', 'C', 'B'],
['A', 'A', 'B'],
['A', 'B', 'B'],
['B', 'C', 'B'],
['C', 'B', 'B'],
['B', 'A', 'C'],
['C', 'C', 'A']])
# Elbow curve to find optimal K
cost = []
clusters = []
K = range(1,6)
for k in list(K):
kmode = KModes(n_clusters=k, # 클러스터 수를 지정
init="random", n_init=5, # 로컬 미니마를 방지하기위해 centroid를 달리하여 5회 반복
verbose=1) # 학습내역을 텍스트로 출력
clusters.append(kmode.fit_predict(data)) # 학습 및 분류, 분류된 클러스터 리턴
kmode.predict(data[0].reshape(1,-1)) # 첫번째 이용자
cost.append(kmode.cost_) # 각 포인트로부터 각각의 클러스터 센트로이드까지의 거리 합계
# the sum distance of all points to their respective cluster centroids.
# cost가 클수록 해당 클러스터 내의 포인트들이 유사하지 않다는 것을 의미한다
# 정해진 k를 클러스터 수로 정했을 때, centroid와 각 포인트와의 거리의 합이 최소가 되도록 클러스터를 구성함
print('Clusters:', clusters)
# K-Modes 클러스터 수에 따른 센트로이드와 각 포인트 거리 합계(cost)의 시각화
plt.plot(K, cost, 'x-')
plt.xlabel('No. of clusters')
plt.ylabel('Cost')
plt.title('Elbow Curve')
plt.show()
print('Clusters:', clusters)
Clusters: [0 1 0 0 0 0 1 0 1 1]
df = pd.DataFrame(data)
df['class'] = clusters
df
0 | 1 | 2 | class | |
---|---|---|---|---|
0 | A | B | C | 1 |
1 | B | C | A | 0 |
2 | C | A | B | 1 |
3 | A | C | B | 1 |
4 | A | A | B | 1 |
5 | A | B | B | 1 |
6 | B | C | B | 0 |
7 | C | B | B | 1 |
8 | B | A | C | 0 |
9 | C | C | A | 0 |
# 결론 : 클러스터 수를 두개로 하는게 가장 좋다