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
์ต์ ์ ํด๋ฌ์คํฐ ๊ฐฏ์ ์ฐพ๊ธฐ (2๊ฐ์ง ๋ฐฉ๋ฒ ์ ์)
1๏ธโฃ ์๋ณด์ฐ(elbow) ๊ธฐ๋ฒ
SSE(Sum of Squared Errors, ์ค์ฐจ์ ๊ณฑํฉ)์ ๊ฐ์ด ์ต์๊ฐ ๋๋๋ก ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
Y์ถ(SSE)์ ๋ฐ์ดํฐํฌ์ธํธ ๊ฐ๊ฐ์์ ํด๋น ํด๋ฌ์คํฐ ์ค์ฌ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ค ๊ทธ ๊ฐ๊ฐ์ ์ ๊ณฑํด์ ๋ํ ๊ฐ์ด๋ค.
๋ฐ๋ผ์ ํด๋ฌ์คํฐ๊ฐ ๋ง์์ง์๋ก ๊ฐ๊ฐ์ ์ค์ฌ์ด ๋ง์์ง๋๊น SSE๊ฐ ์ค์ด๋ค ์ ๋ฐ์ ์๋ค.
๊ฒฐ๊ณผ๋ฌผ์ธ ๊ทธ๋ํ ๋ชจ์์ ๋ณด๊ณ ํ๊ฟ์น์ ํด๋นํ๋ ๋ถ๋ถ์ด ์ต์ ์ ํด๋ฌ์คํฐ ๊ฐ์๊ฐ ๋๋ค.
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์ผ๋ก ์ค์ ํ๋ค ์๊ฐํํ ์๋ฃ๋ค.
+ ๋ช ๊ฐ์ PC๋ฉด ์ถฉ๋ถํ ๊น?
๋ถ์ฐ์ ๋น์จ์ด 95%๋ฅผ ๋์ด๊ฐ๋ฉด ์์ ์ ์ด๋ผ๊ณ ํ๋จํ๋ค!
# np.argmax : ์ต๋๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ฆฌํด
# np.cumsum : ๋์ ๋ ํฉ๊ณ๋ฅผ ๊ณ์ฐ (cumulative sum)
np.argmax(np.cumsum(model.explained_variance_ratio_) >= 0.95 ) + 1
'TIL๐ฅ > ๋ฉ์์ด์ฌ์์ฒ๋ผ_AI School 5๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฉ์ฌ] AI SCHOOL 5๊ธฐ_ Day 30 (0) | 2022.04.12 |
---|---|
[๋ฉ์ฌ] AI SCHOOL 5๊ธฐ_ Day 29 (0) | 2022.04.11 |
[๋ฉ์ฌ] AI SCHOOL 5๊ธฐ_ Day 26 (0) | 2022.04.08 |
[๋ฉ์ฌ] AI SCHOOL 5๊ธฐ_ Day 25 (0) | 2022.04.07 |
[๋ฉ์ฌ] AI SCHOOL 5๊ธฐ_ Day 18 (0) | 2022.03.31 |
๋๊ธ