6. Unsupervised 러닝 : K-mean 알고리즘 (클러스터링 알고리즘) 및 실습
2018. 8. 10. 14:39
캡쳐 사진 및 글작성에 대한 도움 출저 : 유튜브 - 허민석님
k-mean 클러스터링의 과정
시각화와 설명을 위해서, 관여변수는 2개만 있다고 가정한다.
- 데이터를 준비한다.
- 데이터에 대해 얼마나 많은 클러스트를 만들것인지 결정한다.(클러스트 개수 지정)
- 예를 들어, 티셔츠 장사시에, 100명의 손님 모두 맞춤티셔츠를 만들기 힘들다. 이 경우 클러스터링을 통해 S, M, L 3가지로 평준화할 수 있다.
- my) classification에서 class와 비슷한 개념인 듯 하다. - 클러스터링시, 클러스트의 중심(centeroid)을 설정한다( 3가지 방법이 있다. )
- 클러스트의 중심에 대해, 모든 데이터 점(data point)들을 가장 가까운 클러스트 중심에 할당한다.
---->1번은 c1에 할당항 빨간색이 된다-->
- 이렇게 첫번째 iteration이 끝난다. - 각 클러스트의 중심을, 할당된 데이터 point들의 중심으로 옮긴다
- 클러스트의 중심이 움직였다면, 다시 데이터들을 옮겨진 클러스트에 대해 가장 가까운대로 할당하는 과정이 반복될 것이다. - 클러스트들의 변화가 없을때까지 or 지정한 최대 횟수동안, 4번과 5번을 반복한다.
- 2번째 iteration시에, 데이터point 4번은 새로운 클러스트에 할당된다.
- 2번째 과정이 모두 끝나면, 클러스트의 중심을 또 옮긴다.
- 3번째 iteration시에는 아무 데이터point도 클러스트 할당이 변경되지 않았다. 그러면 클러스트의 중심도 이동하지 않게 된다.
클러스트의 중심(centroid)를 초기화하는 3가지 방법
- randomly choose : 랜덤으로 막 정하는 것
- manually assig init centroid : 수동으로 할당해주는 법
- 위도, 경도가 변수(속성, feature)일 때, 사람의 위치를, 3개의 도시(이미 정해져있는 지점)을 클러스트의 중심으로 지정할 수 있다. - k-mean++
1) 랜덤으로 클러스트중심을 정했는데 ---> 결과가 만족스럽지 못하다
2) 수동으로 줄 수 없는 상황이다
K - mean ++ 알고리즘 for init centroid
- 첫번째 데이터point에 첫번째 클러스터링 중심을 할당한다
- 첫번째 데이터에서 가장 먼 데이터에다가 2번째 클러스터 중심을 할당한다.
- c1과 c2에 공통적으로 가장 먼 데이터point에 c3를 할당한다.
실습
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]:
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]:
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]:
3. k-mean clustering¶
In [7]:
# 계산을 하려면 df 전체 값을-> array로data_points = df.valuesdata_points
Out[7]:
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]:
In [10]:
#해당 클러스트의 클러스트 중심(centeroid)보기kmeans.cluster_centers_
Out[10]:
In [11]:
df['cluster_id'] = kmeans.labels_
In [15]:
df
Out[15]:
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]:
'머신러닝 & 딥러닝 > 머신러닝 기초' 카테고리의 다른 글
8. 머신러닝 Classifier 실습 (2) | 2018.08.15 |
---|---|
7. 머신러닝 알고리즘 : 어떤 머신러닝 classifier를 써야할까? validation은 어떻게 할까? (1) | 2018.08.14 |
5. 머신러닝 알고리즘 : 선형회귀(linear regression) (2) | 2018.08.09 |
4. 머신러닝 알고리즘 : 확률론과 나이브 베이즈(Naive Bayes)분류 (0) | 2018.08.08 |
3. 머신러닝 알고리즘 : 의사결정 트리(Decision Tree) 알고리즘의 수학적 접근 - ID3 알고리즘 (1) | 2018.08.06 |