본문 바로가기
Deep Learning

군집화 KMean 알고리즘

by HoneyIT 2020. 8. 12.

군집 (KMean)

- 독립변수만을 넣어 label을 출력값으로 가진다.

- 하나의 군집 내에 데이터들의 거리가 가까울 수록 군집화가 잘 되었다고 볼 수 있다.

 

군집화 과정

1. K 개의 중심점 설정

2. 모든 데이터를 K개의 중심점과의 거리 계산

   -> 가장 가까운 중심점을 선택하여 군집 결정

3. 군집별로 중심점 계산

* 군집이 바뀌면 2부터 다시 반복

(무한 반복에 빠질 수 있으므로 반복 횟수를 정한다.)

 

초기 중심점 설정법

1. 랜덤

2. 직접 지정

3. K++

   - 첫 번째 점 중심점 지정 > 첫 번째 점에서 가장 먼 점 지정 > 두 점에서 상대적으로 가장 먼 점 지정 ...

 

 

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

판다스를 이용하여 'x', 'y' 컬럼을 갖는 데이터프레임을 생성한다.

 

for i in range(1, 100):
    #1사분면
    x = random.randint(1, 100)
    y = random.randint(1, 100)
    df.loc[i*4] = [x, y]
    #2사분면
    x = random.randint(1, 100) * -1
    y = random.randint(1, 100)
    df.loc[i * 4+1] = [x, y]
    #4사분면
    x = random.randint(1, 100)
    y = random.randint(1, 100) * -1
    df.loc[i * 4+2] = [x, y]
    #3사분면
    x = random.randint(1, 100) * -1
    y = random.randint(1, 100) * -1
    df.loc[i * 4+3] = [x, y]

각 사분면에 위치하는 값들을 임의로 설정합니다.

 

sns.lmplot('x','y', data=df, fit_reg=False, scatter_kws={"s":20})
plt.show()

fit_reg=False는 회귀 옵션을 제거한다.

scatter_kws는 산점도 그래프 점 크기를 설정한다.

임의의 값들을 그래프에 표현하면 아래와 같다.

data_points = df.values #values로 값만 가져옴
kmeans = KMeans(n_clusters=4)#n_clusters : 군집의 갯수
kmeans.fit(data_points)
df['label'] = kmeans.labels_#군집화 fitting 후에 label을
print(df)

다음과 같이 사분면 위치(label)를 알 수 있다.

label은 사분면 위치

sns.lmplot('x','y', data=df,fit_reg=False,scatter_kws={"s":20}, hue='label')#hue : label인자에 따라 속성을 다르게 표현
plt.show()

hue는 label 인자에 따라 색상을 다르게 한다.

import pandas as pd
from sklearn.cluster import KMeans
import random
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame(columns=['x', 'y'])
#데이터 지정
for i in range(1, 100):
    #1사분면
    x = random.randint(1, 100)
    y = random.randint(1, 100)
    df.loc[i*4] = [x, y]
    #2사분면
    x = random.randint(1, 100) * -1
    y = random.randint(1, 100)
    df.loc[i * 4+1] = [x, y]
    #4사분면
    x = random.randint(1, 100)
    y = random.randint(1, 100) * -1
    df.loc[i * 4+2] = [x, y]
    #3사분면
    x = random.randint(1, 100) * -1
    y = random.randint(1, 100) * -1
    df.loc[i * 4+3] = [x, y]
print(df)
sns.lmplot('x','y', data=df, fit_reg=False, scatter_kws={"s":20})
plt.show()
data_points = df.values #values로 값만 가져옴
kmeans = KMeans(n_clusters=4)#n_clusters : 군집의 갯수
kmeans.fit(data_points)
df['label'] = kmeans.labels_#군집화 fitting 후에 label을
print(df)
sns.lmplot('x','y', data=df,fit_reg=False,scatter_kws={"s":20}, hue='label')#hue : label인자에 따라 속성을 다르게 표현
plt.show()

'Deep Learning' 카테고리의 다른 글

분류 모델 2  (0) 2020.08.12
군집화 KMean 알고리즘 2  (0) 2020.08.12
분류 모델  (0) 2020.08.11
선형회귀 모델  (0) 2020.08.11
딥러닝 기초  (0) 2020.08.10