캡쳐 사진 및 글작성에 대한 도움 출저 : 유튜브 - 허민석님


k-mean 클러스터링의 과정

시각화와 설명을 위해서, 관여변수는 2개만 있다고 가정한다.

  1. 데이터를 준비한다.
    image
  2. 데이터에 대해 얼마나 많은 클러스트를 만들것인지 결정한다.(클러스트 개수 지정)
    - 예를 들어,  티셔츠 장사시에, 100명의 손님 모두 맞춤티셔츠를 만들기 힘들다. 이 경우 클러스터링을 통해 S, M, L 3가지로 평준화할 수 있다.
    - my) classification에서 class와 비슷한 개념인 듯 하다.


  3. 클러스터링시, 클러스트의 중심(centeroid)을 설정한다( 3가지 방법이 있다. )
    image

  4. 클러스트의 중심에 대해, 모든 데이터 점(data point)들을 가장 가까운 클러스트 중심에 할당한다.
    image
    ---->1번은 c1에 할당항 빨간색이 된다-->image
    imageimageimage
    image
    - 이렇게 첫번째 iteration이 끝난다.

  5. 각 클러스트의 중심을,  할당된 데이터 point들의 중심으로 옮긴다
    image
    - 클러스트의 중심이 움직였다면, 다시 데이터들을 옮겨진 클러스트에 대해 가장 가까운대로 할당하는 과정이 반복될 것이다.
  6. 클러스트들의 변화가 없을때까지 or 지정한 최대 횟수동안, 4번과 5번을 반복한다.
    - 2번째 iteration시에, 데이터point 4번은 새로운 클러스트에 할당된다.
    image
    - 2번째 과정이 모두 끝나면, 클러스트의 중심을 또 옮긴다.
    image
    - 3번째 iteration시에는 아무 데이터point도 클러스트 할당이 변경되지 않았다. 그러면 클러스트의 중심도 이동하지 않게 된다.
    image



클러스트의 중심(centroid)를 초기화하는 3가지 방법

  1. randomly choose : 랜덤으로 막 정하는 것
  2. manually assig init centroid : 수동으로 할당해주는 법
    - 위도, 경도가 변수(속성, feature)일 때, 사람의 위치를, 3개의 도시(이미 정해져있는 지점)을 클러스트의 중심으로 지정할 수 있다.
    image
  3. k-mean++
    1) 랜덤으로 클러스트중심을 정했는데 ---> 결과가 만족스럽지 못하다
    2) 수동으로 줄 수 없는 상황이다


K - mean ++ 알고리즘 for init centroid

  1. 첫번째 데이터point에 첫번째 클러스터링 중심을 할당한다
    image

  2. 첫번째 데이터에서 가장 먼 데이터에다가 2번째 클러스터 중심을 할당한다.
    image

  3. c1과 c2에 공통적으로 가장 먼 데이터point에 c3를 할당한다.


실습


k-mean

0. 패키지 복사

In [1]:
#-*- coding: utf-8 -*-#블로그용 html조절# from IPython.core.display import display, HTML# display(HTML("<style> .container{width:90% !important;}</style>"))import pandas as pd #데이터 포인트 생성import numpy as np # 편한계산을 위한from sklearn.cluster import KMeans #사이킷런의 KMeans 패키지 사용import matplotlib.pyplot as plt #시각화import seaborn as sns # 시각화%matplotlib inline 

1. create data points

In [2]:
# df 데이터없이 칼럼명만 생성하기df  = pd.DataFrame( columns = ['x', 'y'])df
Out[2]:
x y
In [3]:
#좌표(data points)들 입력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]
In [4]:
df.head(12)
Out[4]:
x y
0 3 1
1 4 1
2 3 2
3 4 2
4 10 5
5 10 6
6 11 5
7 11 6
8 15 1
9 15 2
10 16 1
11 16 2

2. 시각화

2-1 seaborn을 이용한 data points 시각화

2-2 matplotlib을 이용한 전체 타이틀 + x,y축 라벨명 지정

In [5]:
#시본의 lm chart 이용하여 좌표찍기#x축에 들어갈 df의 칼럼명, y축 칼럼명, dataFrame, line여부, 마커사이즈sns.lmplot('x', 'y', data = df, fit_reg=False, scatter_kws={'s':100})#맷플롯립을 이용한 플롯 네이밍#만약 xlabel과 ylabel의 이름 안주면, seaborn의 df.의 '칼럼명1', '칼럼명2' 가 들어감plt.title('k-mean plot')plt. xlabel('x-axis')plt. ylabel('y-axis')
Out[5]:
Text(16.3,0.5,'y-axis')

3. k-mean clustering

In [7]:
# 계산을 하려면 df 전체 값을-> array로data_points = df.valuesdata_points
Out[7]:
array([[3, 1],       [4, 1],       [3, 2],       [4, 2],       [10, 5],       [10, 6],       [11, 5],       [11, 6],       [15, 1],       [15, 2],       [16, 1],       [16, 2]], dtype=object)
In [8]:
# k-mean 돌리기,  KMeans( 클러스트수 = 3) . fit( 학습시킬 data points(좌표형태의 array))kmeans = KMeans(n_clusters=3).fit(data_points)
In [9]:
# 클러스트3개가 적용된 kmeans 속에,, 각 datapoints의 해당 클러스트보기kmeans.labels_
Out[9]:
array([1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0])
In [10]:
#해당 클러스트의 클러스트 중심(centeroid)보기kmeans.cluster_centers_
Out[10]:
array([[15.5,  1.5],       [ 3.5,  1.5],       [10.5,  5.5]])
In [11]:
df['cluster_id'] = kmeans.labels_
In [15]:
df
Out[15]:
x y cluster_id
0 3 1 1
1 4 1 1
2 3 2 1
3 4 2 1
4 10 5 2
5 10 6 2
6 11 5 2
7 11 6 2
8 15 1 0
9 15 2 0
10 16 1 0
11 16 2 0
In [22]:
# 4. 클러스터링까지 포함하는 df를 시각화하기#시본으로 시각화하는데, hue옵션을 주어, 특정칼럼에 따른 색 구분시키기sns.lmplot('x', 'y', data = df, fit_reg=False, scatter_kws={'s' : 100},          hue = 'cluster_id', # hue의 인자인 클러스트_id에 따라 찍히는 점의 색이 달라진다.          )# 맷플롯립은 라벨링만 해주기plt.title('after  kmean clustering')plt.xlabel('x - axis')plt.ylabel('y - axis ')
Out[22]:
Text(26.7781,0.5,'y - axis ')


+ Recent posts