728x90
KNN 알고리즘을 Python에서 구현하기 위해, 가장 간단한 형태로 어떻게 새로운 데이터 포인트의 클래스를 예측하는지 살펴보겠습니다. 여기서는 scikit-learn
라이브러리를 사용하지 않고 기본 Python 함수 직접 KNN을 구현합니다.
KNN 알고리즘 구현 과정
- 데이터 준비: 간단한 데이터 세트를 준비합니다.
- 거리 계산 함수 정의: 데이터 포인트 간의 거리를 계산하는 함수를 정의합니다.
- 가장 가까운 이웃 찾기: 주어진 데이터 포인트에 대해 가장 가까운 K개의 이웃을 찾습니다.
- 다수결 투표: K개의 가장 가까운 이웃들 중 다수의 클래스를 결과로 결정합니다.
단계별 코드 구현
이제 위의 단계를 따라 Python 코드를 작성해보겠습니다. 코드를 작성하기 전에, 모든 함수 호출과 메소드 호출은 주석 처리하겠습니다.
import numpy as np
from collections import Counter
# 데이터 준비
def create_dataset():
dataset = np.array([[1, 2, 'A'], [2, 3, 'A'], [3, 3, 'B'], [5, 3, 'B'], [1, 6, 'C'], [4, 5, 'C']])
return dataset
# 유클리드 거리 계산 함수
def euclidean_distance(point1, point2):
distance = np.sqrt(np.sum((point1 - point2) ** 2))
return distance
# KNN 알고리즘 함수
def knn(data, query, k):
distances_and_labels = []
for index, data_point in enumerate(data):
distance = euclidean_distance(np.array(data_point[:-1], dtype=np.float64), np.array(query, dtype=np.float64))
distances_and_labels.append((distance, data_point[-1]))
sorted_distances_and_labels = sorted(distances_and_labels)[:k]
labels = [label for _, label in sorted_distances_and_labels]
majority_vote = Counter(labels).most_common(1)[0][0]
return majority_vote
# 함수 사용 예시
# 데이터 세트와 쿼리 포인트 준비
dataset = create_dataset()
query_point = [2, 4]
k = 3
# KNN 실행
predicted_label = knn(dataset, query_point, k)
print(f"The predicted label for the query point {query_point} is {predicted_label}")
위의 KNN 코드를 자세히 설명하겠습니다.
import numpy as np
from collections import Counter
numpy
라이브러리는 다차원 배열과 행렬 연산에 최적화된 라이브러리입니다. 여기서는 데이터 포인트 간의 거리 계산에 사용됩니다.Counter
는collections
모듈의 일부로, 데이터의 빈도수를 쉽게 계산할 수 있게 해주는 클래스입니다. 이를 통해 K개의 가장 가까운 이웃 중 가장 흔한 클래스를 찾습니다.
def create_dataset():
dataset = np.array([[1, 2, 'A'], [2, 3, 'A'], [3, 3, 'B'], [5, 3, 'B'], [1, 6, 'C'], [4, 5, 'C']])
return dataset
- 이 함수는 간단한 예제 데이터 세트를 생성하고, 이를 numpy 배열로 반환합니다. 각 데이터 포인트는 2개의 수치 특성과 1개의 레이블을 가지며, 여기서는 3개의 클래스(
A
,B
,C
)가 있습니다.
def euclidean_distance(point1, point2):
distance = np.sqrt(np.sum((point1 - point2) ** 2))
return distance
euclidean_distance
함수는 두 데이터 포인트 사이의 유클리드 거리를 계산합니다. 이 거리는 두 점 사이의 "직선" 거리로, KNN에서 이웃을 결정할 때 사용됩니다.
def knn(data, query, k):
distances_and_labels = []
knn
함수는 실제 K-최근접 이웃 알고리즘을 구현합니다.data
는 학습 데이터 세트,query
는 분류하고자 하는 새로운 데이터 포인트,k
는 고려할 최근접 이웃의 수입니다.distances_and_labels
리스트는 계산된 거리와 해당 데이터 포인트의 레이블을 저장하기 위해 사용됩니다.
for index, data_point in enumerate(data):
distance = euclidean_distance(np.array(data_point[:-1], dtype=np.float64), np.array(query, dtype=np.float64))
distances_and_labels.append((distance, data_point[-1]))
- 이 반복문은 데이터 세트의 각 데이터 포인트에 대해, 쿼리 포인트와의 거리를 계산하고, 그 거리와 데이터 포인트의 레이블을
distances_and_labels
리스트에 추가합니다.
sorted_distances_and_labels = sorted(distances_and_labels)[:k]
- 계산된 거리를 기준으로 데이터 포인트를 오름차순으로 정렬하고, 가장 가까운
k
개의 이웃을 선택합니다.
labels = [label for _, label in sorted_distances_and_labels]
majority_vote = Counter(labels).most_common(1)[0][0]
return majority_vote
- 정렬된 리스트에서
k
개의 가장 가까운 이웃의 레이블만 추출합니다. Counter
클래스를 사용하여 가장 흔하게 나타나는 레이블을 찾고, 이를 쿼리 포인트의 예측 레이블로 반환합니다. 이는 다수결 투표 방식에 해당합니다.
# 함수 사용 예시
dataset = create_dataset()
query_point = [2, 4]
k = 3
predicted_label = knn(dataset, query_point, k)
print(f"The predicted label for the query point {query_point} is {predicted_label}")
- 마지막 부분은 함수 사용 예시로, 데이터 세트를 생성하고, 쿼리 포인트를 정의한 후,
knn
함수를 호출하여 예측을 수행합니다. 그리고 예측된 레이블을 출력합니다.
'데이터마이닝' 카테고리의 다른 글
Mallows의 \(C_p\) (0) | 2024.03.08 |
---|---|
statsmodels를 활용한 선형 회귀 분석 구현 (0) | 2024.03.08 |
statsmodels의 모형식 표현 (0) | 2024.03.08 |
회귀분석의 수행 단계들 (0) | 2024.03.08 |
KNN(K-Nearest Neighbors) 알고리즘 (0) | 2024.02.17 |