군집

2022. 11. 28. 11:11AI/기계학습

군집은 각 데이터의 유사성(거리)을 측정한 후 유사성이 높은 데이터끼리 집단으로 분류

데이터 간 유사도 측정 방법 - 유클리드 거리, 맨해튼 거리, 민코프스키 거리, 코사인 유사도

 

군집의 알고리즘 1. K-평균 군집화(K-Means)

알고리즘이 간단하고 큰 데이터에도 쉽게 가능하다.

- 학습 과정

  1. 중심점 선택 : 랜덤하게 초기 중심점을 선택 (k 크기 미리 정하기)
  2. K개의 중심점과 각각의 개별 데이터 간의 거리를 측정한 후 가장 가까운 중심점을 기준으로 데이터를 할당하여 클러스터 구성
  3. 클러스터마다 새로운 중심점 계산. 1~3 과정을 반복.
  4. 중심점에 변화가 없으면 멈춤

- 단점

1. 연속형 변수에 가장 최적

2. 결과가 초기에 지정한 클러스터 중심의 위치에 따라 달라질 수 있어 반복 필요

3. 클러스터의 개수를 지정해야 함

4. 클러스터의 모양을 가정하기 때문에(원) 다양한 분포를 가지는 데이터에 적용 한계

- 사용하면 안되는 경우

  1. 데이터가 비선형 2. 군집 크기가 다를 때 3. 군집마다 밀집도와 거리가 다를 때

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs, make_moons
from sklearn.cluster import KMeans

# 데이터 생성
# 시나리오 1: 잘 분리된 동일 밀도 클러스터
X0, y0 = make_blobs(n_samples=300, centers=3, cluster_std=0.60, random_state=0)

# 시나리오 2: 다른 밀도의 클러스터
X1, y1 = make_blobs(n_samples=[100, 800], centers=[(-1, 0), (1, 2)], cluster_std=[0.5, 2.5], random_state=42)

# 시나리오 3: 비선형 클러스터 (반달 모양)
X2, y2 = make_moons(n_samples=200, noise=0.05, random_state=42)

# K-means 알고리즘 적용
kmeans0 = KMeans(n_clusters=3, random_state=42).fit(X0)
kmeans1 = KMeans(n_clusters=2, random_state=42).fit(X1)
kmeans2 = KMeans(n_clusters=2, random_state=42).fit(X2)

# 시각화 함수
def plot_clusters(X, y, centroids, title):
    plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='viridis', marker='o', edgecolors='k', alpha=0.5)
    plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=200, marker='x')
    plt.title(title)
    plt.xlabel("Feature 0")
    plt.ylabel("Feature 1")

# 그래프 그리기
plt.figure(figsize=(18, 6))
plt.subplot(1, 3, 1)
plot_clusters(X0, kmeans0.labels_, kmeans0.cluster_centers_, "Scenario 1: Well-separated Clusters")

plt.subplot(1, 3, 2)
plot_clusters(X1, kmeans1.labels_, kmeans1.cluster_centers_, "Scenario 2: Clusters with Different Densities")

plt.subplot(1, 3, 3)
plot_clusters(X2, kmeans2.labels_, kmeans2.cluster_centers_, "Scenario 3: Non-linear Clusters (Moon-shaped)")
plt.show()

 

- KMeans 기반으로 피처를 만들기

import numpy as np 
import pandas as pd 
from sklearn.cluster import KMeans

df=pd.read_csv('Sleep_Efficiency.csv')

df_sp = df[['Sleep_duration','Sleep_efficiency','REM_sleep_percentage','Deep_sleep_percentage','Light_sleep_percentage','Awakenings']]
X2 = df_sp.drop(['Sleep_efficiency','REM_sleep_percentage','Sleep_duration','Awakenings'], axis=1)

#kmeans 클러스터 실행
kmeans = KMeans(n_clusters=5)
X_clustered = kmeans.fit_predict(X2)

X_new_featured=np.hstack((X2, X_clustered.reshape(-1,1))) # hstack 가로로 행렬 결합

X_new_featured
'''
array([[70., 12.,  0.,  0.],
       [28., 53.,  3.,  1.],
       [70., 10.,  1.,  0.],
       ...,
       [32., 48.,  1.,  3.],
       [72., 10.,  3.,  0.],
       [23., 55.,  1.,  1.]])
'''

y = df_sp['Sleep_efficiency']

X_train, X_test, y_train, y_test = train_test_split(X4, y, test_size=0.3, random_state=111)

# 간단한 회귀모델 진행
model = LinearRegression()
model.fit(X_train,y_train)

#예측값 
y_pred = model.predict(X_test)

#Mse
mse = mean_squared_error(y_test, y_pred)
print('mse:',mse)
#REM_sleep_percentage,Sleep_duration,Awakenings 피처를 제외했을 때 mse: 0.006732725105270995
# 위에에 피쳐 추가 mse: 0.00683820727411644

 

- k-means++

K-Means 알고리즘의 가장 큰 단점은 처음에 지정하는 중심점(centroid)의 위치를 무작위로 결정하기 때문에 최적의 클러스터로 묶어주는 데에는 한계가 있다는 점이다.

이 한계를 보완한 것이 K-Means++ 알고리즘이다.

K-Means++ 알고리즘은 한 번에 k개의 센트로이드를 생성하는 것이 아니라, 센트로이드 사이의 거리를 최대한 멀리 위치시키는 방향으로 1개씩 총 k번 반복하여 k개의 클러스터를 만들어낸다.

kmeans_model1 =KMeans(
    init = 'k-means++',
    n_clusters = 3,
    n_init = 10,
    max_iter= 200,
    random_state=111)

 


신경망에서 군집 알고리즘 사용

머신 러닝에서 군집화를 처리할 때 딥러닝과 함께 사용하면 모델의 성능을 높일 수 있다.

딥러닝과 함께 머신 러닝 군집 알고리즘을 적용하면 좋다.

 


군집 평가

elbow method - 각 객체마다 인접한 군집과의 거리를 최소화하는 값, 클러스터링의 응집도

실루엣 계수 - 군집 간에 군집 형성이 잘 됐는지, 클러스터 간 거리가 먼지

from yellowbrick.cluster import KElbowVisualizer
from sklearn.metrics import silhouette_score
from yellowbrick.cluster import SilhouetteVisualizer

elbow_ch =KElbowVisualizer(kmeans_model1)

elbow_ch.fit(X2)
#elbow_ch.draw()

 

fig, ax = plt.subplots(3,2, figsize=(15,10))

for i in [3,4,5,6,7,9]:
    kmeans_model2 =KMeans(
        init = 'k-means++',
        n_clusters = i,
        n_init = 10,
        max_iter= 200,
        random_state=111)
    q, mod = divmod(i,2)
    
    #실루엣계수 시각화
    visual = SilhouetteVisualizer(kmeans_model2, color =' yellowbricks',ax= ax[q-1][mod])
    visual.fit(X2)

'AI > 기계학습' 카테고리의 다른 글

교차검증(Cross-Validation)  (0) 2024.03.21
K-최근접 이웃, K-Nearest Neighbors (K-NN)  (0) 2023.01.05
차원축소(PCA)  (0) 2022.11.24
회귀분석(Regression Analysis)  (0) 2022.11.15
Machine Learning1 - 정의와 종류  (0) 2022.11.10