๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
TIL๐Ÿ”ฅ/๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ_AI School 5๊ธฐ

[๋ฉ‹์‚ฌ] AI SCHOOL 5๊ธฐ_ Day 31

by hk713 2022. 4. 13.

K-Means Algorithm

๋น„์ง€๋„ํ•™์Šต์˜ Clustering(๊ตฐ์ง‘ํ™”) ๋„๊ตฌ๋‹ค. 

๋น„์Šทํ•œ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ™์€ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ๊ณ , ๋น„์Šทํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค๋ฅธ ๊ทธ๋ฃน์œผ๋กœ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋‹ค.

์—ฌ๊ธฐ์„œ K ๊ฐ’์€ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ์ง์ ‘ ์ง€์ •ํ•˜๋Š” hyper-parameter์ธ๋ฐ, ์ตœ์ ์˜ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๊ณ  ์ค‘์š”ํ•˜๋‹ค.

 

K-Means์˜ ์›๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. K๊ฐœ์˜ ์ž„์˜์˜ ์ค‘์‹ฌ๊ฐ’์„ ๊ณ ๋ฅธ๋‹ค. (๋ณดํ†ต ๋ฐ์ดํ„ฐ ์ƒ˜ํ”Œ ์ค‘์˜ ํ•˜๋‚˜๋ฅผ ์„ ํƒ)

2. ๊ฐ ๋ฐ์ดํ„ฐ๋งˆ๋‹ค ์ค‘์‹ฌ๊ฐ’๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฐ€๊นŒ์šด ์ค‘์‹ฌ๊ฐ’์˜ ํด๋Ÿฌ์Šคํ„ฐ์— ํ• ๋‹นํ•œ๋‹ค.

3. ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ์— ์†ํ•œ ๋ฐ์ดํ„ฐ๋“ค์˜ ํ‰๊ท ๊ฐ’์œผ๋กœ ๊ฐ ์ค‘์‹ฌ๊ฐ’์„ ์ด๋™์‹œํ‚จ๋‹ค.

4. ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํด๋Ÿฌ์Šคํ„ฐ ํ• ๋‹น์ด ๋ณ€ํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ 2์™€ 3์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

iris ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  K-Means๋ฅผ ๋Œ๋ ค ์‹œ๊ฐํ™”ํ•ด๋ณด์•˜๋‹ค.

# ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  
from sklearn import cluster
from sklearn import datasets
from sklearn import metrics

 

 (์ขŒ) k=8      (์šฐ) k=3 

 

์ตœ์ ์˜ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐฏ์ˆ˜ ์ฐพ๊ธฐ (2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ œ์‹œ)

1๏ธโƒฃ ์—˜๋ณด์šฐ(elbow) ๊ธฐ๋ฒ•

SSE(Sum of Squared Errors, ์˜ค์ฐจ์ œ๊ณฑํ•ฉ)์˜ ๊ฐ’์ด ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Y์ถ•(SSE)์€ ๋ฐ์ดํ„ฐํฌ์ธํŠธ ๊ฐ๊ฐ์—์„œ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ ์ค‘์‹ฌ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•œ๋’ค ๊ทธ ๊ฐ๊ฐ์„ ์ œ๊ณฑํ•ด์„œ ๋”ํ•œ ๊ฐ’์ด๋‹ค.

๋”ฐ๋ผ์„œ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๊ฐ๊ฐ์˜ ์ค‘์‹ฌ์ด ๋งŽ์•„์ง€๋‹ˆ๊นŒ SSE๊ฐ€ ์ค„์–ด๋“ค ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

๊ฒฐ๊ณผ๋ฌผ์ธ ๊ทธ๋ž˜ํ”„ ๋ชจ์–‘์„ ๋ณด๊ณ  ํŒ”๊ฟˆ์น˜์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์ด ์ตœ์ ์˜ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ๋œ๋‹ค.

elbow ๊ธฐ๋ฒ•

iris ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋Œ๋ ค๋ณธ ๊ฒฐ๊ณผ๋‹ค. ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด K๊ฐ’์œผ๋กœ 2๋‚˜ 3์„ ํƒํ•  ๊ฒƒ์ด๋‹ค. 

→ ์‹œ๊ฐ์  ์ž๋ฃŒ๋กœ ๋”ฑ ํ™•์ •์ง“๊ธฐ์—๋Š” ์• ๋งคํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค. 

 

2๏ธโƒฃ์‹ค๋ฃจ์—ฃ(silhouette) ๊ธฐ๋ฒ•

ํด๋Ÿฌ์Šคํ„ฐ๋ง์˜ ํ’ˆ์งˆ์„ ์ •๋Ÿ‰์ ์œผ๋กœ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ K-means ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ๋ง ๊ธฐ๋ฒ•์— ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

์‹ค๋ฃจ์—ฃ ๊ณ„์ˆ˜ ๊ตฌํ•˜๋Š” ๊ณต์‹

์œ„ ๊ณต์‹์—์„œ a(i)๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ฐ์ดํ„ฐ ์‘์ง‘๋„(cohesion)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ด๊ณ , b(i)๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„ ๋ถ„๋ฆฌ๋„(separation)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ด๋‹ค. ๋งŒ์•ฝ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค๋ฉด b(i) ๊ฐ’์€ ํฌ๊ณ , a(i) ๊ฐ’์€ ์ž‘์•„์ ธ s(i)์˜ ๊ฐ’์€ 1์— ๊ฐ€๊นŒ์šด ์ˆซ์ž๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ฐ์ดํ„ฐ ์‘์ง‘๋„์™€ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ„ ๋ถ„๋ฆฌ๋„์˜ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด s(i) ๊ฐ’์€ 0์— ๊ฐ€๊นŒ์›Œ์งˆ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์˜๋ฏธํ•ด์ง„๋‹ค.

# ์‹ค๋ฃจ์—ฃ ๊ณ„์ˆ˜ ํ‰๊ท ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•
from sklearn.metrics import silhouette_score

model = cluster.KMeans(n_clusters=2) # Change the number of clusters
y_fitted = model.fit_predict(X)

silhouette_avg = silhouette_score(X, y_fitted)
print("The average of silhouette coefficients is :", silhouette_avg)

์ด๋ ‡๊ฒŒ ๊ตฌํ•œ ๊ฐ’์ด 0.7 ์–ธ์ €๋ฆฌ๋ฉด ์“ธ๋งŒํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.

โš ๏ธ ์ค‘์š”ํ•œ ์ ์€ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ์ด๋ก ์ ์ธ ์ˆซ์ž๊ณ„์‚ฐ์ด๋ผ๋Š” ์ ์ด๋‹ค. ์–ด๋–ค ์˜๋„๊ฐ€ ์žˆ๋‹ค๊ฑฐ๋‚˜ ํ™œ์šฉํ• ๋งŒํ•œ ์‚ฌ์ „ ์ง€์‹์ด ์žˆ๋‹ค๋ฉด ๊ทธ๊ฑธ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ๊ฐ€์žฅ ์œ ๋ฆฌํ•˜๋‹ค!

 


PCA

PCA (Principal Component Analysis, ์ฃผ์„ฑ๋ถ„ ๋ถ„์„)๋Š” ๋Œ€ํ‘œ์ ์ธ ์ฐจ์›์ถ•์†Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๋ฐ์ดํ„ฐ์˜ ๋๊ณผ ๋์„ ์ฐพ์•„ ์ถ•์„ ๋งŒ๋“ค๊ณ , ๊ทธ ์ถ•์— ์ง๊ตํ•˜๋Š” ์„ ์—์„œ ๋˜ ๋ฐ์ดํ„ฐ์˜ ๋๊ณผ ๋์„ ์ฐพ์•„ ์ถ•์„ ๋งŒ๋“ ๋‹ค. (์žˆ์–ด๋ณด์ด๊ฒŒ ๋งํ•˜๋ฉด, ๋ถ„์‚ฐ์ด ๊ฐ€์žฅ ํฐ ์ถ•์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค) ๊ทธ ์ถ•๋“ค์„ ๊ฐ€์ง€๊ณ  ํ‰๋ฉด์„ ๋งŒ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ™์—ฌ๋‚ด๋Š” ๊ฒƒ์ด PCA๋‹ค.

์—ฌ๊ธฐ์„œ๋„ principal component๊ฐ€ hyper-parameter๋กœ ์ž‘๋™ํ•˜๊ณ  ๋ช‡๊ฐœ๋กœ ๊ฐ€์ ธ๊ฐˆ๊ฑด์ง€๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.

 

iris ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  components๋ฅผ 3์œผ๋กœ ์„ค์ •ํ•œ๋’ค ์‹œ๊ฐํ™”ํ•œ ์ž๋ฃŒ๋‹ค.

                               (์ขŒ) 2PC             (์šฐ) 3PC

 

+ ๋ช‡ ๊ฐœ์˜ PC๋ฉด ์ถฉ๋ถ„ํ• ๊นŒ?

๋ถ„์‚ฐ์˜ ๋น„์œจ์ด 95%๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด ์•ˆ์ •์ ์ด๋ผ๊ณ  ํŒ๋‹จํ•œ๋‹ค!

# np.argmax : ์ตœ๋Œ€๊ฐ’์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฆฌํ„ด
# np.cumsum : ๋ˆ„์ ๋œ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐ (cumulative sum)

np.argmax(np.cumsum(model.explained_variance_ratio_) >= 0.95 ) + 1

๋Œ“๊ธ€