K-Nearest Neighbors(K-NN)μ K-μ΅κ·Όμ μ΄μ μκ³ λ¦¬μ¦μ΄λΌκ³ λ νλ€. K-NNμ μ§λ νμ΅(Supervised Learning) μκ³ λ¦¬μ¦ μ€ νλλ‘, λ°μ΄ν° κ° κ±°λ¦¬λ₯Ό κΈ°λ°μΌλ‘ λΆλ₯(Classification)λ νκ·(Regression) λ¬Έμ λ₯Ό ν΄κ²°νλ λ° μ¬μ©λλ€. μ΄ μκ³ λ¦¬μ¦μ κ°λ¨νκ³ μ§κ΄μ μΈ λ°©λ²μΌλ‘ λ°μ΄ν°λ₯Ό λΆλ₯νκ±°λ μμΈ‘νλ λ° ν¨κ³Όμ μ΄λ€.
K-NNμ κ°λ¨ν μμ΄λμ΄λ₯Ό κΈ°λ°μΌλ‘ νλ€.
K-μ΅κ·Όμ μ΄μ μκ³ λ¦¬μ¦μ΄λΌλ λ¨μ΄μμ μ μ μλ―μ΄, KNNμ μλ‘ κ°κΉμ΄ μλ λͺ¨λ λ°μ΄ν° ν¬μΈνΈκ° λμΌν ν΄λμ€μ μνλ€λ μμΉμ λ°λΌ μλνλ μ§λ νμ΅ μκ³ λ¦¬μ¦μ΄λ€. μ¬κΈ°μ κΈ°λ³Έ κ°μ μ μλ‘ κ°κΉμ΄ μλ κ²λ€μ μλ‘ κ°λ€λ κ²μ΄λ€.
μ£Όμ κ°λ
- 거리 μΈ‘μ λ°©λ²: K-NNμ λ°μ΄ν° κ° κ±°λ¦¬λ₯Ό μΈ‘μ νμ¬ μ΄μμ μ°Ύλλ€. μ ν΄λ¦¬λμ 거리(Euclidean distance)κ° μΌλ°μ μΌλ‘ μ¬μ©λμ§λ§, 맨νν 거리(Manhattan distance)λ μ½μ¬μΈ μ μ¬λ(Cosine similarity) λ± λ€μν 거리 μΈ‘μ λ°©λ²μ μ¬μ©ν μ μλ€.
- μ΄μμ μ(K): K-NNμμλ μλ‘μ΄ λ°μ΄ν° ν¬μΈνΈ μ£Όλ³μ Kκ°μ μ΄μμ μ ννλ€. Kμ κ°μ λ°λΌ λͺ¨λΈμ μ±λ₯μ΄ λ¬λΌμ§ μ μμΌλ©°, μ μ ν K κ°μ μ ννλ κ²μ΄ μ€μνλ€.
- κ°μ€μΉ: μ΄μ λ°μ΄ν° ν¬μΈνΈμ 거리μ λ°λΌ κ°μ€μΉλ₯Ό λΆμ¬νμ¬ μμΈ‘μ μνν μ μλ€. κ°μ€μΉλ₯Ό μ¬μ©νλ©΄ κ°κΉμ΄ μ΄μμ μ견μ λ ν° μν₯μ λ°κ² λλ€.
KNNμ κ°μ₯ μ€μν λ¨κ³λ Nearest Neighborsμ μλ₯Ό λνλ΄λ 'K' κ°μ μ μνλ κ²μ΄λ€.
μ μ¬μ§κ³Ό κ°μ΄ λ°μ΄ν°μ
λ΄μ κ°κ°μ λ°μ΄ν°λ νΉμ± 곡κ°μμ μ μΌλ‘ λνλΌ μ μλ€. λ§μ½, Kκ°μ΄ 3μ΄λΌλ©΄ κ·Έ μ£Όλ³μ 3κ°μ κ°μ₯ κ°κΉμ΄ μ΄μ λ°μ΄ν°λ€μ μ°Ύμμ λ°μ΄ν°λ€μ λ μ΄λΈμ λΆλ₯νκ±°λ μμΈ‘νλ λ°©λ²μ΄λ€.
K-NNμ λ€μν λΆμΌμμ μ¬μ©λλ©°, κ·Έ μ μ°μ±κ³Ό λ¨μν¨μΌλ‘ μΈν΄ λ§μ λ¬Έμ μ μ μ©λ μ μλ€. μ΄ μκ³ λ¦¬μ¦μ νΉν μμ λ°μ΄ν°μ μμ ν¨κ³Όμ μ΄λ©°, μ μ¬μ±μ κΈ°λ°νμ¬ ν¨ν΄μ μ°Ύκ³ λΆλ₯νλ λ° κ°μ μ 보μΈλ€.
μλλ K-NN μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ Iris λ°μ΄ν°μ μ λΆλ₯νκ³ μκ°ννλ μμ μ½λμ΄λ€.μ΄ μ½λλ₯Ό ν΅ν΄ λ°μ΄ν° λΆν¬μ K-NNμ μλ λ°©μμ μκ°μ μΌλ‘ νμΈν΄λ³Ό μ μλ€.
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
# λ°μ΄ν° λ‘λ
iris = load_iris()
X = iris.data[:, :2] # μ²μ λ κ°μ νΉμ±λ§ μ¬μ© (μκ°νλ₯Ό μν΄)
y = iris.target
# λ°μ΄ν° λΆν
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# λͺ¨λΈ μ΄κΈ°ν λ° νμ΅
knn = KNeighborsClassifier(n_neighbors=3) # μ΄μμ μ Kλ₯Ό 3μΌλ‘ μ€μ
knn.fit(X_train, y_train)
# μμΈ‘
y_pred = knn.predict(X_test)
# νκ°
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)
print(f'μ νλ: {accuracy:.4f}')
print('λΆλ₯ λ³΄κ³ μ:\n', report)
# μκ°νλ₯Ό μν 그리λ μμ±
h = 0.02 # λ©μ¬μ λ¨μ
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
# κ²°μ κ²½κ³ μκ°ν
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(figsize=(8, 6))
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)
# νλ ¨ λ°μ΄ν°μ ν
μ€νΈ λ°μ΄ν° 그리기
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cmap_bold, edgecolor='k', s=60)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cmap_bold, marker='x', s=80)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("3-Class classification (k = 3)")
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.show()
KNeighborsClassifier
λ₯Ό μ¬μ©νμ¬ K-NN λΆλ₯κΈ°λ₯Ό μ΄κΈ°ννκ³ νμ΅μν¨λ€. μ¬κΈ°μλ μ΄μμ μ Kλ₯Ό 3μΌλ‘ μ€μ νλ€.predict()
ν¨μλ₯Ό μ¬μ©νμ¬ ν
μ€νΈ λ°μ΄ν°μ λν μμΈ‘μ μννκ³ , accuracy_score()
μ classification_report()
ν¨μλ₯Ό μ¬μ©νμ¬ λͺ¨λΈμ μ±λ₯μ νκ°νλ€.matplotlib
μ μ¬μ©νμ¬ κ²°μ κ²½κ³λ₯Ό μκ°ννκ³ , νλ ¨ λ°μ΄ν°μ ν
μ€νΈ λ°μ΄ν°λ₯Ό νλ‘―νλ€. μ΄λ₯Ό ν΅ν΄ λͺ¨λΈμ΄ μ΄λ»κ² λΆλ₯νλμ§ μκ°μ μΌλ‘ νμΈν μ μλ€.κ²°μ κ²½κ³λ₯Ό ν΅ν΄ κ° ν΄λμ€μ λΆν¬μ K-NN μκ³ λ¦¬μ¦μ΄ μ΄λ»κ² λ°μ΄ν°λ₯Ό λΆλ₯νλμ§ μκ°μ μΌλ‘ νμΈν μ μλ€. μ΄λ₯Ό ν΅ν΄ K-NNμ μλ λ°©μμ λ μ μ΄ν΄ν μ μλ€.
K-NN μκ³ λ¦¬μ¦μ κ°λ¨νλ©΄μλ μ μ©ν μκ³ λ¦¬μ¦μ΄μ§λ§, λ°μ΄ν°μ νΉμ±κ³Ό λ¬Έμ μ λ°λΌ μ±λ₯μ΄ λ¬λΌμ§ μ μλ€. μ μ ν K κ°μ μ ννκ³ λ°μ΄ν°λ₯Ό μ μ΄ν΄νμ¬ μ¬μ©νλ κ²μ΄ μ€μνλ€.