jupyter Notebook으로 Kmeans 연습하기 using Python

1 분 소요

https://www.youtube.com/watch?v=9TR54u08IGU 강의를 참고하며 글을 쓴다.

k-means steps

  1. prepare Data
  2. decide how many clusters you need
  3. choose initial center of cluster(centroid)
    • randomly select centroid
    • manually assign centroid
    • kmeans++
  4. assign data point to nearest clusters
  5. move centoid to the center of its cluster
  6. repeat step 4 and step 5 until there is no assigned cluster change

kmeans++

initial centroid 를 정하는 방법 중 하나로

C1에서 가장 먼 곳에 c2를 배치한다.

c1 과 c2에서 공통적으로 가장 먼 곳에 c3 도 배치

데이터셋 준비

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

df = pd.DataFrame(columns=[‘x’,’y’])

df.loc[0] = [3,1] df.loc[1] = [4,1] df.loc[2] = [3,2] df.loc[3] = [4,2] df.loc[4] = [10,5] df.loc[5] = [10,6] df.loc[6] = [11,5] df.loc[7] = [11,6] df.loc[8] = [15,1] df.loc[9] = [15,2] df.loc[10] = [16,1] df.loc[11] = [16,2]

12개의 데이터 프레임을 만들기

df.head(20)

만든 데이터를 차트 형식으로 확인할 수 있음

sns.lmplot(‘x’,’y’,data=df, fit_reg=False , scatter_kws={“s”:200 })
plt.title(‘kmeans plot’)
plt.xlabel(‘x’)
plt.ylabel(‘y’)

  • sns.lmplot(‘x’,’y’,data=df, fit_reg=False , scatter_kws={“s”:200 }) seaborn 에 있는 lm 차트로 2D 차트를 생성한다는 의미

x,y 의 데이터를 위에서 미리 만들어 놨던 df 데이터 에서 가져오고 fit_reg 는 선을 그릴지 말지를 의미하는데 선이 필요 없기 때문에 False scatter_kws 는 그래프에서 나타낼 데이터 포인트 크기를 의미하는데 200으로 설정

  • plt.title(‘kmeans plot’) plt.xlabel(‘x’) plt.ylabel(‘y’)

그래프 타이틀을 kmeans plot 으로 하고 각 x,y 축의 레이블을 x , y 로 둠

아직은 k-means clustering을 하기 전이기 때문에 모든 색상이 동일함

k-means clustering

data_points = df.values
kmeans = KMeans(n_clusters=3).fit(data_points)
kmeans.labels_

df 데이터를 valuse 라는 함수를 사용하여 numpy 형태의 array로 변경시킴 kmenas 변수에 3개의 클러스터가 필요하다는 의미로 n_clusters = 3 이라고 기입을 한다. 여기서 이니셜 centroid 를 따로 지정하지 않으면 kmeans ++ 로 지정을 함

kmeans.labels 에는 각각에 데이터에 대한 클러스터 넘버가 적힘

kmeans.cluster_centers_

각각의 클러스터에 잇는 cenroids 의 지점 x,y 값

df[‘cluster_id’]=kmeans.labels_

df 데이터를 cluster_id 로 하고 이 kmeans 에 label 을 cluster_id 로 붙혀줌

df.head(12)

sns.lmplot(‘x’,’y’,data=df, fit_reg=False , scatter_kws={“s”:150 },hue=”cluster_id”)
plt.title(‘after kmean clustering’)

  • scatter_kws : marker size hue : color

cluster_id 로 군집화 하여 색을 다르게 한 뒤 시각화 한 걸 확인할 수 있다.

업데이트: