๊ฐ์
KNN(K-Nearest Neighbors, K-์ต๊ทผ์ ์ด์)์ ๊ฐ์ฅ ๋จ์ํ๋ฉด์๋ ํจ๊ณผ์ ์ธ ์ง๋ ํ์ต ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ค. ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ๊ฑฐ๋ ์์ธกํ ๋, ๊ฐ์ฅ ๊ฐ๊น์ด k๊ฐ์ ์ด์ ๋ฐ์ดํฐ์ ์ ๋ณด๋ฅผ ํ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. 1951๋ Evelyn Fix์ Joseph Hodges๊ฐ ์ฒ์ ๊ฐ๋ฐํ์ผ๋ฉฐ, ์ดํ 1967๋ Thomas Cover์ ์ํด ํ์ฅ๋์๋ค1.
KNN์ ๋จธ์ ๋ฌ๋์ ์ ๋ฌธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์์ฃผ ์ฌ์ฉ๋์ง๋ง, ๋ฒกํฐ ๊ฒ์์ ๊ธฐ์ด๊ฐ ๋๋ ์ค์ํ ๊ฐ๋ ์ด๊ธฐ๋ ํ๋ค. ํ๋์ ๊ทผ์ฌ ์ต๊ทผ์ ์ด์(ANN) ์๊ณ ๋ฆฌ์ฆ๋ค์ KNN์ ํจ์จ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์๋ค.
์๋ ์๋ฆฌ
๋ถ๋ฅ(Classification)
- ๊ฑฐ๋ฆฌ ๊ณ์ฐ: ์๋ก์ด ๋ฐ์ดํฐ ํฌ์ธํธ์ ๋ชจ๋ ํ์ต ๋ฐ์ดํฐ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐ
- ์ด์ ์ ํ: ๊ฐ์ฅ ๊ฐ๊น์ด k๊ฐ์ ๋ฐ์ดํฐ ํฌ์ธํธ ์ ํ
- ๋ค์๊ฒฐ ํฌํ: k๊ฐ ์ด์ ์ค ๊ฐ์ฅ ๋ง์ ํด๋์ค๋ก ๋ถ๋ฅ
ํ๊ท(Regression)
- ๊ฑฐ๋ฆฌ ๊ณ์ฐ: ์๋ก์ด ๋ฐ์ดํฐ ํฌ์ธํธ์ ๋ชจ๋ ํ์ต ๋ฐ์ดํฐ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐ
- ์ด์ ์ ํ: ๊ฐ์ฅ ๊ฐ๊น์ด k๊ฐ์ ๋ฐ์ดํฐ ํฌ์ธํธ ์ ํ
- ํ๊ท ๊ณ์ฐ: k๊ฐ ์ด์์ ๊ฐ์ ํ๊ท ํ์ฌ ์์ธก๊ฐ ๊ฒฐ์
๊ฑฐ๋ฆฌ ๋ฉํธ๋ฆญ
KNN์ ์ฑ๋ฅ์ ์ฌ์ฉํ๋ ๊ฑฐ๋ฆฌ ๋ฉํธ๋ฆญ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋ค.
์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ (Euclidean Distance)
์ฐ์ํ ๋ณ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๊ฑฐ๋ฆฌ ๋ฉํธ๋ฆญ์ด๋ค.
๋งจํดํผ ๊ฑฐ๋ฆฌ (Manhattan Distance)
๊ฒฉ์ ํํ์ ๋ฐ์ดํฐ๋ ์ฐจ์ ๊ฐ ๋ ๋ฆฝ์ฑ์ด ๋์ ๋ ์ ์ฉํ๋ค.
์ฝ์ฌ์ธ ์ ์ฌ๋ (Cosine Similarity)
๋ฒกํฐ์ ๋ฐฉํฅ์ฑ์ด ์ค์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค. ํ ์คํธ ๋ถ๋ฅ๋ ์ถ์ฒ ์์คํ ์์ ์์ฃผ ํ์ฉ๋๋ค.
ํด๋ฐ ๊ฑฐ๋ฆฌ (Hamming Distance)
๋ฒ์ฃผํ ๋ณ์๋ ์ด์ง ๋ฐ์ดํฐ์ ์ ํฉํ๋ค.
ํ์ดํผํ๋ผ๋ฏธํฐ: k ๊ฐ ์ ํ
k ๊ฐ์ KNN ์๊ณ ๋ฆฌ์ฆ์ ํต์ฌ ํ์ดํผํ๋ผ๋ฏธํฐ๋ค.
k ๊ฐ์ ์ํฅ
- ์์ k (k=1~3):
- ๋ ธ์ด์ฆ์ ๋ฏผ๊ฐ
- ๋ณต์กํ ๊ฒฐ์ ๊ฒฝ๊ณ
- ๊ณผ์ ํฉ(overfitting) ์ํ
- ํฐ k (k>10):
- ๋ ธ์ด์ฆ์ ๊ฐ๊ฑด
- ๋จ์ํ ๊ฒฐ์ ๊ฒฝ๊ณ
- ๊ณผ์์ ํฉ(underfitting) ์ํ
k ๊ฐ ์ ํ ์ ๋ต
- ํ์ ์ ํ: ์ด์ง ๋ถ๋ฅ์์ ๋์ ์ ๋ฐฉ์ง
- ๊ต์ฐจ ๊ฒ์ฆ: ๋ค์ํ k ๊ฐ์ผ๋ก ์ฑ๋ฅ ํ๊ฐ
- ๊ท์น์ ์ ๊ทผ: (N์ ํ์ต ๋ฐ์ดํฐ ์)
- ๋๋ฉ์ธ ์ง์: ๋ฌธ์ ํน์ฑ์ ๋ฐ๋ผ ์กฐ์
๋ณต์ก๋ ๋ถ์
์๊ฐ ๋ณต์ก๋
์ฐ์ฐ | ๋ณต์ก๋ | ์ค๋ช |
---|---|---|
ํ์ต | ๋จ์ํ ๋ฐ์ดํฐ ์ ์ฅ๋ง ํจ | |
์์ธก (๋จ์ ๊ตฌํ) | ๋ชจ๋ ๋ฐ์ดํฐ์ ๊ฑฐ๋ฆฌ ๊ณ์ฐ | |
์์ธก (์ต์ ํ) | KD-Tree ๋ฑ ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ |
- : ํ์ต ๋ฐ์ดํฐ ๊ฐ์
- : ํน์ง(์ฐจ์) ์
๊ณต๊ฐ ๋ณต์ก๋
- ๋ชจ๋ ํ์ต ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ
์ฅ์ ๊ณผ ๋จ์
์ฅ์
- ๋จ์์ฑ: ๊ตฌํ๊ณผ ์ดํด๊ฐ ์ฌ์
- ๋น๋ชจ์์ : ๋ฐ์ดํฐ ๋ถํฌ์ ๋ํ ๊ฐ์ ๋ถํ์
- ๋ค๋ชฉ์ : ๋ถ๋ฅ์ ํ๊ท ๋ชจ๋ ๊ฐ๋ฅ
- ์ ์์ฑ: ์๋ก์ด ๋ฐ์ดํฐ ์ถ๊ฐ๊ฐ ๊ฐ๋จ
- ๋ค์ค ํด๋์ค: ๋ณต์กํ ๋ค์ค ํด๋์ค ๋ฌธ์ ์๋ ์์ฐ์ค๋ฝ๊ฒ ์ ์ฉ
๋จ์
- ๊ณ์ฐ ๋น์ฉ: ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์์ ์์ธก์ด ๋๋ฆผ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ: ๋ชจ๋ ํ์ต ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผ ํจ
- ์ฐจ์์ ์ ์ฃผ: ๊ณ ์ฐจ์ ๋ฐ์ดํฐ์์ ์ฑ๋ฅ ์ ํ
- ๋ถ๊ท ํ ๋ฐ์ดํฐ: ํด๋์ค ๋ถ๊ท ํ์ ๋ฏผ๊ฐ
- ํน์ง ์ค์ผ์ผ๋ง: ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ์ด๋ฏ๋ก ์ ๊ทํ ํ์
ํน์ง ์ค์ผ์ผ๋ง์ ์ค์์ฑ
KNN์ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ด๋ฏ๋ก ํน์ง๋ค์ ์ค์ผ์ผ์ด ๋ค๋ฅด๋ฉด ํฐ ๊ฐ์ ๊ฐ์ง ํน์ง์ด ๊ฒฐ๊ณผ๋ฅผ ์ง๋ฐฐํ๋ค.
์ ๊ทํ ๊ธฐ๋ฒ
- Min-Max Scaling: 0~1 ๋ฒ์๋ก ๋ณํ
- ํ์คํ(Standardization): ํ๊ท 0, ํ์คํธ์ฐจ 1๋ก ๋ณํ
- ์ ๊ทํ(Normalization): ๋ฒกํฐ์ ๊ธธ์ด๋ฅผ 1๋ก ์กฐ์
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
์ต์ ํ ๊ธฐ๋ฒ
๊ฒ์ผ๋ฅธ ํ์ต(Lazy Learning)
KNN์ โ๊ฒ์ผ๋ฅธ ํ์ตโ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํ์ต ๋จ๊ณ์์ ๋ชจ๋ธ์ ๊ตฌ์ถํ์ง ์๊ณ , ์์ธก ์์ ์ ๋ชจ๋ ๊ณ์ฐ์ ์ํํ๋ค. ์ด๋ ํ์ต์ ๋น ๋ฅด์ง๋ง ์์ธก์ด ๋๋ฆฐ ํน์ฑ์ผ๋ก ์ด์ด์ง๋ค.
์๋ฃ๊ตฌ์กฐ ๊ธฐ๋ฐ ์ต์ ํ
๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์์ KNN์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ๋ค:
KD-Tree
- ๊ณต๊ฐ์ ์ฌ๊ท์ ์ผ๋ก ๋ถํ ํ์ฌ ๊ฒ์ ๊ณต๊ฐ ์ถ์
- ์ ์ฐจ์ ๋ฐ์ดํฐ(<20์ฐจ์)์์ ํจ๊ณผ์
- ์๊ฐ ๋ณต์ก๋:
Ball Tree
- KD-Tree๋ณด๋ค ๊ณ ์ฐจ์์์ ํจ๊ณผ์
- ๋ฐ์ดํฐ๋ฅผ ์ค์ฒฉ๋ ์ด๊ตฌ(hypersphere)๋ก ๊ตฌ์ฑ
- ์๊ฐ ๋ณต์ก๋:
Locality Sensitive Hashing (LSH)
- ์ ์ฌํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ํด์ ๋ฒํท์ ์ ์ฅ
- ๊ณ ์ฐจ์ ๋ฐ์ดํฐ์ ์ ํฉ
- ๊ทผ์ฌ ๊ฒ์ ์ ๊ณต
KNN vs ANN (Approximate Nearest Neighbor)
์ ํํ KNN (Exact KNN)
- ๋ชจ๋ ๋ฐ์ดํฐ ํฌ์ธํธ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ํํ ๊ณ์ฐ (์์ ํ์)
- 100% ์ ํ๋ ๋ณด์ฅ
- ์๊ฐ ๋ณต์ก๋:
- ์๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ์ ํฉ
๊ทผ์ฌ ์ต๊ทผ์ ์ด์ (ANN)
- ์ ํ๋๋ฅผ ์ฝ๊ฐ ํฌ์ํ์ฌ ์๋ ๋ํญ ํฅ์
- HNSW, FAISS, ScaNN ๋ฑ์ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ
- ์๊ฐ ๋ณต์ก๋: ๋๋ ๊ทธ ์ดํ
- ๋๊ท๋ชจ ๋ฒกํฐ ๊ฒ์์ ํ์์
๋๋ถ๋ถ์ ํ๋ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ANN ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค. ์๋ฐฑ๋ง~์์ญ์ต ๊ฐ์ ๋ฒกํฐ์์ ์ค์๊ฐ ๊ฒ์์ ์ํด์๋ ์ ํํ KNN์ด ๋นํ์ค์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ธก๋ฉด | Exact KNN | ANN |
---|---|---|
์ ํ๋ | 100% | 95~99% |
์๋ | ๋๋ฆผ () | ๋น ๋ฆ () |
๋ฉ๋ชจ๋ฆฌ | ์ ์ | ๋ง์ (์ธ๋ฑ์ค ๊ตฌ์กฐ) |
ํ์ฅ์ฑ | ๋ฎ์ | ๋์ |
์ฌ์ฉ ์ฌ๋ก | ์๊ท๋ชจ ๋ฐ์ดํฐ | ๋๊ท๋ชจ ๋ฒกํฐ ๊ฒ์ |
ํ์ฉ ์ฌ๋ก
์ถ์ฒ ์์คํ
- ์ฌ์ฉ์๋ ์์ดํ ๊ฐ ์ ์ฌ๋ ๊ณ์ฐ
- ํ์ ํํฐ๋ง(Collaborative Filtering)
- ๋ทํ๋ฆญ์ค, ์คํฌํฐํ์ด ๋ฑ์์ ํ์ฉ
์ด๋ฏธ์ง ๋ถ๋ฅ
- ์๊ธ์จ ์ธ์ (MNIST)
- ์ผ๊ตด ์ธ์
- ์๋ฃ ์์ ์ง๋จ
์ด์ ํ์ง(Anomaly Detection)
- k๊ฐ ์ด์๊ณผ์ ํ๊ท ๊ฑฐ๋ฆฌ๊ฐ ํฐ ๊ฒฝ์ฐ ์ด์์น๋ก ํ๋จ
- ๋คํธ์ํฌ ์นจ์ ํ์ง
- ์ฌ๊ธฐ ๊ฑฐ๋ ํ์ง
์์ฐ์ด ์ฒ๋ฆฌ
- ๋ฌธ์ ๋ถ๋ฅ
- ๊ฐ์ฑ ๋ถ์
- ์ฒ ์ ๊ต์
๊ตฌํ ์์
Scikit-learn์ ์ฌ์ฉํ ๊ธฐ๋ณธ ๊ตฌํ
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# ๋ฐ์ดํฐ ์ค๋น
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# ํน์ง ์ค์ผ์ผ๋ง
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# KNN ๋ชจ๋ธ ํ์ต
knn = KNeighborsClassifier(n_neighbors=5, metric='euclidean')
knn.fit(X_train_scaled, y_train)
# ์์ธก
y_pred = knn.predict(X_test_scaled)
๊ฑฐ๋ฆฌ ๊ฐ์ค KNN
๊ฐ๊น์ด ์ด์์ ๋ ๋์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ ์ ์๋ค.
knn_weighted = KNeighborsClassifier(
n_neighbors=5,
weights='distance' # ๊ฑฐ๋ฆฌ์ ์ญ์๋ก ๊ฐ์ค์น ๋ถ์ฌ
)
๊ฐ์ ๋ฐ ๋ณํ ์๊ณ ๋ฆฌ์ฆ
Weighted KNN
- ๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ ์ด์์ ํฌํ์ ๊ฐ์ค์น ๋ถ์ฌ
- ๊ฐ๊น์ด ์ด์์ ๋ ๋์ ์ํฅ๋ ฅ
Radius-based Neighbors
- ๊ณ ์ ๋ k ๋์ ์ผ์ ๋ฐ๊ฒฝ ๋ด ๋ชจ๋ ์ด์ ์ฌ์ฉ
- ๋ฐ๋๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ์ ์ฉ
Condensed Nearest Neighbor (CNN)
- ํ์ต ๋ฐ์ดํฐ์ ๋ถ๋ถ์งํฉ๋ง ์ฌ์ฉ
- ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ฐ ๋น์ฉ ์ ๊ฐ
Edited Nearest Neighbor (ENN)
- ์๋ชป ๋ถ๋ฅ๋ ๋ฐ์ดํฐ ํฌ์ธํธ ์ ๊ฑฐ
- ๋ ธ์ด์ฆ ๊ฐ์ ํจ๊ณผ
์ค๋ฌด ์ ์ฉ ํ
์ ์ฒ๋ฆฌ
- ๊ฒฐ์ธก์น ์ฒ๋ฆฌ: KNN์ ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ด ํ์์ด๋ฏ๋ก ๊ฒฐ์ธก์น ์ฒ๋ฆฌ ํ์
- ์ด์์น ์ ๊ฑฐ: ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ์ด๋ฏ๋ก ์ด์์น์ ๋ฏผ๊ฐ
- ํน์ง ์ ํ: ๊ด๋ จ ์๋ ํน์ง ์ ๊ฑฐ (์ฐจ์์ ์ ์ฃผ ์ํ)
- ์ค์ผ์ผ๋ง: ๋ฐ๋์ ์ํ
์ฑ๋ฅ ํ๊ฐ
- ๊ต์ฐจ ๊ฒ์ฆ: k-fold cross-validation์ผ๋ก k ๊ฐ ์ ํ
- ๊ทธ๋ฆฌ๋ ์์น: k์ ๊ฑฐ๋ฆฌ ๋ฉํธ๋ฆญ ์กฐํฉ ํ์
- ํผ๋ ํ๋ ฌ: ๋ถ๋ฅ ์ฑ๋ฅ ์์ธ ๋ถ์
์ค์ ๊ณ ๋ ค์ฌํญ
- ๋ฐ์ดํฐ ํฌ๊ธฐ: ์๋ง ๊ฐ ์ด์์ด๋ฉด ANN ์๊ณ ๋ฆฌ์ฆ ๊ณ ๋ ค
- ์ค์๊ฐ ์๊ตฌ์ฌํญ: ๋น ๋ฅธ ์๋ต์ด ํ์ํ๋ฉด ์ธ๋ฑ์ค ๊ตฌ์กฐ ํ์ฉ
- ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ: ๋ฐ์ดํฐ ์์ถ์ด๋ ์ฐจ์ ์ถ์ ๊ฒํ
์ฐธ๊ณ ์๋ฃ
๋ ผ๋ฌธ ๋ฐ ํ์ ์๋ฃ
- Cover, T., & Hart, P. (1967). โNearest neighbor pattern classificationโ - IEEE Transactions on Information Theory - KNN์ ์ด๋ก ์ ๊ธฐ๋ฐ์ ํ๋ฆฝํ ๊ณ ์ ๋ ผ๋ฌธ
- Fix, E., & Hodges, J. L. (1951). โDiscriminatory Analysis. Nonparametric Discrimination: Consistency Propertiesโ - ์ต์ด์ KNN ์๊ณ ๋ฆฌ์ฆ ์ ์
๊ธฐ์ ๋ฌธ์ ๋ฐ ํํ ๋ฆฌ์ผ
- scikit-learn: Nearest Neighbors - ๊ณต์ ๋ฌธ์ ๋ฐ ๊ตฌํ ๊ฐ์ด๋
- IBM: What is the k-nearest neighbors algorithm? - KNN ๊ฐ๋ ์ค๋ช
- GeeksforGeeks: K-Nearest Neighbor Algorithm - ๊ธฐ์ด๋ถํฐ ๊ตฌํ๊น์ง
๋น๊ต ๋ฐ ์ฌํ
- Milvus: What is the difference between kNN and ANN? - KNN๊ณผ ANN ๋น๊ต
- Microsoft Learn: kNN and ANN algorithm comparison - ๋ฒกํฐ ๊ฒ์์์์ ํ์ฉ
Footnotes
-
์ด๊ธฐ KNN์ 1951๋ ๊ฐ๋ฐ๋์์ผ๋, 1967๋ Thomas Cover์ ๋ ผ๋ฌธ โNearest neighbor pattern classificationโ์์ ์ด๋ก ์ ๊ธฐ๋ฐ์ด ํ๋ฆฝ๋์๋ค. โฉ