(ML) K-평균 클러스터링

K-평균 클러스터 정의

초기값은 클러스터 개수(k)만큼 지정하고, 각 데이터를 가장 가까운 초기값에 할당하여 클러스터를 형성하고, 각 클러스터의 평균값을 다시 계산하여 초기값을 업데이트합니다.

업데이트된 값에 대해 위의 할당 프로세스를 반복하여 k개의 가장 동적 클러스터를 형성합니다.

K-Means 알고리즘을 이용한 분석


1. 필요한 라이브러리 및 샘플 csv 파일을 로드합니다.

import matplotlib.pyplot as plt      #시각화를 위한 설치
import matplotlib.font_manager as fm    # 한글 폰트
import matplotlib                   #시각화를 위한 설치
import os, warnings  
import pandas as pd                #구조 변경 및 결합을 하기 위한 설치
import seaborn as sns              #시각화를 위한 설치
import plotly.express as px        
from sklearn.datasets import make_blobs
import math
import scipy as sp


warnings.filterwarnings('ignore')

pd.set_option('display.max_rows', None)         #모든 행을 다 보여주라는 명령
pd.set_option('display.max_columns', None)      #모든 열을 다 보여주라는 명령

# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
matplotlib.rcParams('axes.unicode_minus') = False
## 한글 폰트 적용 ( 안하면 한글 깨짐 )
f_name = fm.FontProperties(fname="C:/Windows/Fonts/malgunbd.ttf").get_name()
plt.rc('font', family=f_name)

# 예제에서 사용할 csv파일입니다.

cluster=pd.read_csv('VitalSign_Sample.csv',encoding='ANSI')

2. 데이터의 모양 이해

위 데이터의 데이터는 공공데이터 포털의 의료데이터에서 추출한 데이터입니다.


3. 페어플롯 시각화
데이터의 각 열의 상관관계를 출력하는 과정입니다.

sns.pairplot(cluster_f,hue="fm")


4. KMeans 매개변수 설정

  • 매개변수 탐색
범위 중요성
n_cluster 형성된 군집의 수는 k의 k-평균을 의미합니다.

n_jobs 내부적으로 다중 처리를 사용하는 scikit-learn의 기본 병렬 처리(CPU 코어 수 확인 후 확장)
무작위 상태 고정 난수, 동일한 학습 결과내부에
내부에 k-means가 중심을 기준으로 군집을 형성할 때 초기 중심은 무작위로 설정됩니다.

n_init 초기 중심점 선택을 위한 반복 횟수
최대 반복자 학습을 위한 최대 반복 횟수
토르
관성 이것 지정된 tol을 줄이지 않으면 조기에 종료됩니다.

from sklearn.cluster import KMeans

ks=range(1,10)
inertias=()

for k in ks:
    model=KMeans(n_clusters=k)
    model.fit(cluster_f)
    inertias.append(model.inertia_)
    
plt.figure(figsize=(4,4))
plt.plot(ks,inertias,'-o')
plt.show()


n_clusters의 수는 위의 그래픽 출력에서 ​​확인할 수 있습니다.

값이 급격히 떨어지면서 2부터는 큰 변화가 없음을 알 수 있습니다.

따라서 데이터를 2~클러스터로 나누는 것이 적절하다고 판단할 수 있다.

5. 모델 클러스터링 적용

clust_model=KMeans(n_clusters=2)
clust_model.fit(cluster_f)

centers=clust_model.cluster_centers_
pred=clust_model.predict(cluster_f)

clust_df=cluster_f.copy()
clust_df('clust')=pred

clust_df.columns = ('x', 'y', 'z','clust')

#원본데이터 시각화
sns.scatterplot(x=clust_df.iloc(:,0),y=clust_df.iloc(:,1),data=clust_df,hue="z",palette="coolwarm")

#kmeans예측 군집화 시각화
sns.scatterplot(x=clust_df.iloc(:,0),y=clust_df.iloc(:,1),data=clust_df,hue="clust",palette="coolwarm")


# 원시 데이터 시각화

#kmeans예측 클러스터 시각화