Unisquads
로그인
홈
이용약관·개인정보처리방침·콘텐츠정책·© 2026 Unisquads
이용약관·개인정보처리방침·콘텐츠정책
© 2026 Unisquads. All rights reserved.

K-최근접 이웃 (K-NN) (r1)

이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.12 06:26

K-최근접 이웃 (K-NN)

분류

지도 학습 (분류, 회귀)

유형

인스턴스 기반 학습 (Lazy Learning)

핵심 개념

유사도 기반 분류/예측

주요 하이퍼파라미터

이웃 수(K), 거리 척도 (예: 유클리드 거리, 맨해튼 거리)

장점

구현 간단, 직관적 이해 용이, 훈련 데이터에 대한 가정 없음

단점

차원의 저주, 계산 비용 높음 (대규모 데이터), 특징 스케일링 필요

상세 정보

알고리즘 동작 방식

1. 거리 계산 2. 최근접 K개 이웃 탐색 3. 다수결 투표(분류) 또는 평균(회귀)

거리 함수

민코프스키 거리, 유클리드 거리, 맨해튼 거리, 해밍 거리 등

K값 선택

보통 홀수 사용, 교차 검증을 통해 최적화. 작은 K: 과적합 위험, 큰 K: 과소적합 위험

가중 K-NN

가까운 이웃에 더 큰 가중치를 부여하는 변형 알고리즘

차원의 저주

차원이 증가할수록 데이터가 희소해져 거리 기반 유사도 측정이 무의미해지는 현상

전처리 중요성

정규화 또는 표준화가 필수적. 거리 계산 시 특성의 스케일 영향 제거

적용 분야

패턴 인식, 추천 시스템, 유전자 데이터 분석, 문서 분류

관련 알고리즘

K-D 트리, 볼 트리 (효율적인 근사 이웃 탐색 자료구조)

1. 개요

K-최근접 이웃 (K-Nearest Neighbors, K-NN)은 지도 학습의 한 종류로, 분류와 회귀 문제 모두에 사용되는 간단하면서도 직관적인 머신러닝 알고리즘이다. 이 알고리즘의 핵심 아이디어는 "유사한 특성을 가진 데이터는 서로 가까이 위치한다"는 가정에 기반한다. 새로운 데이터 포인트의 클래스나 값을 예측할 때, 훈련 데이터셋에서 가장 가까이 위치한 K개의 이웃 데이터를 찾아 그들의 정보를 종합하여 결정한다.

K-NN은 인스턴스 기반 학습 또는 게으른 학습으로 분류된다. 이는 모델이 명시적인 훈련 과정을 거쳐 매개변수를 학습하는 대신, 모든 훈련 데이터를 단순히 저장해두는 방식을 의미한다. 실제 예측이 요청될 때까지 계산을 미루기 때문에 '게으른' 특성을 가진다. 이러한 방식은 학습 단계가 빠르다는 장점이 있지만, 예측 시 모든 훈련 데이터와의 거리를 계산해야 하므로 대규모 데이터셋에서는 계산 비용이 높아질 수 있다.

알고리즘의 이름에 포함된 'K'는 고려할 최근접 이웃의 수를 나타내는 하이퍼파라미터이다. K 값의 선택은 모델의 성능에 직접적인 영향을 미친다. 작은 K 값(예: K=1)은 모델을 복잡하게 만들어 과적합의 위험을 높이는 반면, 큰 K 값은 모델을 과도하게 평활화하여 과소적합을 초래할 수 있다. 적절한 K 값은 일반적으로 교차 검증을 통해 결정한다.

K-NN은 그 간결성과 효과성 덕분에 패턴 인식, 추천 시스템, 유전체학 등 다양한 분야에서 기초 알고리즘으로 널리 활용된다. 특히 결정 경계가 비선형적이고 복잡한 문제에서 좋은 성능을 보이는 경우가 많다.

2. 기본 원리

K-최근접 이웃 알고리즘의 기본 원리는 "유사한 특성을 가진 데이터는 서로 가까이 위치한다"는 가정에 기반한다. 새로운 데이터 포인트의 클래스나 값을 예측할 때, 학습 데이터셋에서 그 데이터와 가장 가까이 위치한 K개의 이웃을 찾아 그 이웃들의 정보를 종합한다. 분류 문제에서는 K개의 이웃 중 가장 많은 클래스를 새로운 데이터의 클래스로 할당하고, 회귀 문제에서는 이웃들의 값의 평균을 계산하여 예측값으로 삼는다.

이 '가까움'을 정량화하기 위해 거리 함수를 사용한다. 가장 일반적으로 사용되는 거리 측정 방법은 유클리드 거리이다. 이는 공간상의 두 점 사이의 직선 거리를 계산한다. 다른 거리 측정 방법으로는 각 좌표 차이의 절댓값 합인 맨해튼 거리, 또는 벡터 간 각도를 이용하는 코사인 유사도 등이 상황에 따라 활용된다. 적절한 거리 측정 방법의 선택은 데이터의 특성과 문제의 성격에 크게 영향을 받는다.

K 값의 선택은 알고리즘의 성능을 결정하는 핵심 하이퍼파라미터이다. K 값이 너무 작으면(예: K=1) 데이터의 지역적 패턴과 잡음에 과도하게 민감해져 과적합이 발생할 위험이 크다. 반대로 K 값이 너무 크면 주변의 이웃뿐만 아니라 멀리 떨어진, 관련성이 낮은 데이터까지 고려하게 되어 결정 경계가 과도하게 평활화되어 과소적합될 수 있다. 적절한 K 값은 일반적으로 교차 검증을 통해 결정한다.

K 값의 크기

영향

잠재적 문제

작을 때(예: 1)

결정 경계가 복잡해짐

과적합, 잡음에 민감

클 때

결정 경계가 평활해짐

과소적합, 계산 비용 증가

K 값의 일반적인 선택법은 홀수를 사용하는 것이다. 이는 분류 문제에서 동률 투표를 방지하여 하나의 클래스로 명확하게 결정할 수 있게 해준다.

2.1. 거리 측정 방법

K-최근접 이웃 알고리즘의 핵심은 새로운 데이터 포인트와 학습 데이터 내 다른 포인트들 사이의 '거리'를 계산하여 가장 가까운 이웃을 찾는 것이다. 이때 사용되는 거리 측정 방법은 알고리즘의 성능에 직접적인 영향을 미친다. 가장 일반적으로 사용되는 거리는 유클리드 거리이다. 이는 우리가 일상적으로 생각하는 직선 거리로, 2차원 공간에서는 피타고라스 정리를 통해 계산된다. n차원 공간에서 두 점 A(x₁, x₂, ..., xₙ)와 B(y₁, y₂, ..., yₙ) 사이의 유클리드 거리는 √((x₁-y₁)² + (x₂-y₂)² + ... + (xₙ-yₙ)²) 공식으로 구한다.

다른 중요한 거리 측정법으로는 맨해튼 거리가 있다. 이는 격자 모양의 도시에서 블록을 따라 걸을 때의 거리와 유사하여 택시 거리라고도 불린다. 계산 공식은 |x₁-y₁| + |x₂-y₂| + ... + |xₙ-yₙ| 이다. 유클리드 거리가 대각선 이동을 허용한다면, 맨해튼 거리는 좌표축 방향으로만 이동한 거리의 합이다. 이는 특성들이 독립적으로 작용하는 경우에 유용할 수 있다. 더 일반화된 형태로 민코프스키 거리가 있으며, 이는 유클리드 거리와 맨해튼 거리를 하나의 공식으로 통합한다.

분류 문제에서 범주형 데이터를 다룰 때는 해밍 거리가 자주 사용된다. 이는 두 문자열이나 범주형 벡터가 서로 다른 위치의 개수를 세는 방식으로 거리를 측정한다. 예를 들어, 'apple'과 'apply'의 해밍 거리는 마지막 문자만 다르므로 1이다. 또한, 고차원 데이터나 특성의 스케일이 매우 다를 경우에는 코사인 유사도를 거리 대신 사용하기도 한다. 코사인 유사도는 두 벡터 간의 각도의 코사인 값을 계산하여 방향의 유사성을 측정하며, 문서 간 유사도 분석 등에 널리 적용된다[1].

거리 측정법

공식 (점 A, B)

주요 사용 사례

유클리드 거리

√(∑(xᵢ - yᵢ)²)

가장 일반적인 연속형 데이터, 공간적 거리

맨해튼 거리

∑\

xᵢ - yᵢ\

해밍 거리

∑(xᵢ ≠ yᵢ)

범주형 데이터, 문자열, 오류 검출

코사인 유사도

(A·B) / (\

A\

적절한 거리 측정 방법을 선택하는 것은 문제의 도메인과 데이터의 특성에 달려 있다. 모든 특성의 스케일이 동일하지 않다면, 거리 계산에 앞서 표준화나 정규화를 수행하는 것이 필수적이다. 그렇지 않으면 스케일이 큰 특성이 거리 계산을 지배하게 되어 알고리즘의 성능이 저하된다.

2.2. K 값 선택

K 값은 K-최근접 이웃 알고리즘의 핵심 하이퍼파라미터로, 분류 또는 회귀를 수행할 때 참고할 가장 가까운 이웃 데이터 포인트의 수를 결정한다. K 값의 선택은 모델의 복잡도와 일반화 성능에 직접적인 영향을 미친다. 너무 작은 K 값(예: K=1)을 선택하면 모델은 훈련 데이터의 지역적 특성과 노이즈에 지나치게 민감해져 과적합이 발생할 수 있다. 반대로, 너무 큰 K 값(예: K=전체 데이터 수)을 선택하면 결정 경계가 과도하게 평탄해져 중요한 패턴을 놓칠 수 있으며, 이는 과소적합으로 이어질 수 있다.

적절한 K 값을 선택하기 위한 일반적인 방법은 교차 검증을 사용하는 것이다. 가장 널리 쓰이는 방법은 k-겹 교차 검증으로, 훈련 데이터를 여러 부분으로 나누어 다양한 K 값에 대해 모델의 성능을 평가하고, 평균 검증 오차가 가장 낮은 K 값을 선택한다. K 값에 따른 모델 성능 변화를 시각적으로 확인하기 위해 아래와 같은 표를 활용할 수 있다.

K 값의 크기

모델 복잡도

결정 경계

주요 위험

작음 (예: 1~3)

높음

매우 불규칙하고 구불구불함

과적합, 노이즈에 민감

중간 (최적)

적절함

부드럽고 데이터 패턴을 잘 반영함

-

큼 (예: N에 가까움)

낮음

매우 평탄하고 단순함

과소적합, 세부 패턴 누락

K 값 선택 시 고려해야 할 다른 요소로는 데이터셋의 크기와 클래스 불균형이 있다. 데이터 포인트 수가 매우 적을 때는 작은 K 값이, 매우 많을 때는 상대적으로 큰 K 값이 적합할 수 있다. 또한, 데이터의 특성 공간 차원이 높을수록 차원의 저주 현상으로 인해 적절한 K 값을 찾기가 더 어려워진다. 이 경우, K 값을 선택하기 전에 차원 축소 기법을 적용하는 것이 도움이 될 수 있다.

3. 알고리즘 동작 과정

K-최근접 이웃 알고리즘의 동작 과정은 크게 학습 단계와 예측 단계로 나뉜다. 다른 많은 지도 학습 알고리즘과 달리 명시적인 모델 학습 과정이 존재하지 않는 것이 특징이다.

학습 단계에서는 훈련 데이터를 단순히 저장하는 작업만 수행한다. 모든 특징 벡터와 그에 해당하는 레이블을 메모리에 보관한다. 이 과정에서 데이터를 변환하거나 모델 파라미터를 추정하는 복잡한 계산은 일어나지 않는다. 따라서 학습 단계는 매우 빠르게 완료되지만, 대신 저장 공간을 많이 차지한다는 단점이 있다.

예측 단계는 새로운 데이터 포인트에 대한 분류 또는 회귀 값을 결정하는 과정이다. 먼저, 분류하려는 새로운 데이터 포인트와 저장된 모든 훈련 데이터 포인트 사이의 거리를 계산한다. 일반적으로 유클리드 거리나 맨해튼 거리가 사용된다. 계산된 거리를 기준으로 가장 가까운 K개의 이웃을 선택한다. K는 사전에 정의된 하이퍼파라미터다.

단계

주요 작업

비고

학습 단계

모든 훈련 데이터(특징 벡터와 레이블)를 메모리에 저장

별도의 모델 학습 없음

예측 단계

1. 새 데이터와 모든 훈련 데이터 간 거리 계산

2. 가장 가까운 K개의 이웃 선택

3. 이웃의 레이블을 기반으로 투표(분류) 또는 평균(회귀) 수행

계산 비용이 큼

선택된 K개의 최근접 이웃의 정보를 바탕으로 최종 예측을 수행한다. 분류 문제의 경우, K개 이웃 중 가장 많은 클래스를 새로운 데이터의 클래스로 할당한다. 회귀 문제의 경우, K개 이웃의 목표값의 평균을 계산하여 새로운 데이터의 예측값으로 삼는다. 이 과정에서 모든 훈련 데이터와의 거리를 계산해야 하므로 예측 단계는 데이터 양이 많을수록 계산 비용이 매우 커진다.

3.1. 학습 단계

K-최근접 이웃 알고리즘의 학습 단계는 다른 많은 지도 학습 모델과는 달리 명시적인 모델을 구축하지 않는다. 이 단계는 단순히 훈련 데이터 세트를 메모리에 저장하는 과정으로 이루어진다. 모든 특징 벡터와 그에 대응하는 레이블이 그대로 보존되어, 이후 예측 단계에서 참조할 수 있는 준비를 마친다.

이러한 방식을 게으른 학습 또는 사례 기반 학습이라고 부른다. 알고리즘이 훈련 데이터로부터 일반화된 패턴이나 함수를 추출하여 모델 파라미터를 학습하는 대신, 원본 데이터 자체를 지식으로 삼는다. 따라서 학습 과정의 계산 비용은 매우 낮으며, 기본적으로는 데이터 저장 작업에 불과하다.

학습 단계에서 수행될 수 있는 유일한 전처리 작업은 데이터 정규화나 표준화이다. K-NN이 유클리드 거리와 같은 거리 기반 측정을 사용하기 때문에, 특성들의 스케일이 다르면 특정 특성이 거리 계산에 과도하게 영향을 미칠 수 있다. 이를 방지하기 위해 모든 특성을 동일한 스케일로 조정하는 작업이 종종 선행된다. 그러나 이 작업 자체가 모델을 학습하는 것은 아니며, 단지 예측의 정확도를 높이기 위한 데이터 준비 과정에 해당한다.

3.2. 예측 단계

K-최근접 이웃 알고리즘의 예측 단계는 새로운 데이터 포인트의 클래스 또는 값을 결정하는 과정이다. 이 단계는 학습 단계에서 저장된 모든 데이터를 기반으로 수행된다.

먼저, 분류 문제의 경우, 새로운 데이터 포인트와 학습 데이터셋 내 모든 점 사이의 거리를 계산한다. 가장 일반적으로 사용되는 거리는 유클리드 거리이다. 계산된 거리를 기준으로 가장 가까운 K개의 이웃을 선택한다. 최종적으로는 이 K개의 이웃 중에서 다수결 투표를 통해 가장 빈번하게 등장하는 클래스를 새로운 데이터 포인트의 예측 클래스로 할당한다. 만약 회귀 문제라면, 선택된 K개의 이웃의 목표 변수 값들의 평균을 계산하여 예측값으로 사용한다.

K 값의 선택은 예측 결과에 직접적인 영향을 미친다. K 값이 너무 작으면(예: K=1) 과적합에 취약해져 데이터의 지역적 노이즈나 이상치에 민감해진다. 반대로 K 값이 너무 크면 과소적합될 수 있으며, 결정 경계가 과도하게 평탄해져 분류 정확도가 떨어질 수 있다. 적절한 K 값은 일반적으로 교차 검증을 통해 결정한다.

K 값의 영향

분류 문제

회귀 문제

K 값이 작을 때

결정 경계가 복잡해지고, 과적합 가능성 증가

예측이 불안정하고 노이즈에 민감

K 값이 클 때

결정 경계가 평탄해지고, 과소적합 가능성 증가

예측이 평균화되어 지역적 패턴을 놓칠 수 있음

예측 단계는 모든 학습 데이터에 대한 거리 계산이 필요하므로, 데이터셋의 크기가 커질수록 계산 비용이 크게 증가한다는 단점이 있다. 이를 완화하기 위해 KD-트리나 볼 트리와 같은 공간 분할 자료구조를 활용하여 최근접 이웃 탐색 효율을 높이는 방법이 사용된다.

4. 특징

K-최근접 이웃 알고리즘은 단순한 구조 덕분에 이해와 구현이 쉽지만, 데이터의 특성과 규모에 따라 뚜렷한 장점과 단점을 보인다.

장점

K-NN은 지도 학습 알고리즘 중 가장 직관적인 모델 중 하나이다. 모델을 별도로 학습시키는 과정이 없으며, 단지 모든 학습 데이터를 저장하는 것만으로 학습이 완료된다. 이는 매개변수를 추정하는 복잡한 수학적 모델링이 필요 없다는 것을 의미한다. 또한 새로운 데이터에 대한 예측이 실시간으로 가능하며, 알고리즘의 개념이 간단하여 설명과 이해가 용이하다. 이론적으로는 학습 데이터의 양이 무한히 증가하면 오류율이 베이즈 오류율의 두 배를 넘지 않는다는 점이 증명되어 있다[2].

단점

이 알고리즘의 가장 큰 단점은 계산 비용이 크다는 것이다. 예측을 수행할 때마다 모든 학습 데이터와의 거리를 계산해야 하므로, 데이터셋이 커질수록 예측 속도가 현저히 느려진다. 이는 차원의 저주 문제와도 연결된다. 특징의 차원이 높아질수록 데이터 포인트 간의 거리가 전반적으로 비슷해져 유효한 이웃을 찾기 어려워지고, 성능이 저하된다. 또한 데이터의 전처리와 정규화가 매우 중요하다. 거리 기반 알고리즘이므로 스케일이 큰 특징이 거리 계산을 지배할 수 있기 때문이다. 마지막으로, 불균형 데이터셋에서 소수 클래스의 예측 정확도가 낮아질 수 있으며, 모든 학습 데이터를 저장해야 하므로 메모리 사용량도 상당하다.

4.1. 장점

K-최근접 이웃 알고리즘의 가장 큰 장점은 구현이 단순하고 직관적이라는 점이다. 알고리즘의 기본 개념은 새로운 데이터 포인트 주변의 가장 가까운 이웃들을 찾아 그들의 레이블을 기반으로 분류하거나 값을 예측하는 것이며, 이는 수학적 배경이 부족해도 쉽게 이해할 수 있다. 또한, 명시적인 모델 학습 단계가 존재하지 않는다[3]. 새로운 데이터에 대한 예측이 필요할 때까지 실제 계산을 미루기 때문에 학습 과정이 빠르다는 특징도 있다.

이 알고리즘은 비모수적 방법에 속한다. 즉, 데이터의 기본 분포에 대한 강한 가정을 하지 않으며, 데이터 자체의 패턴에 의존하여 결정을 내린다. 이로 인해 복잡한 결정 경계를 가진 문제에도 유연하게 적용될 수 있다. 특히, 결정 경계가 비선형적인 경우에도 효과적으로 대응할 수 있다는 점이 큰 강점이다.

다른 장점으로는 새로운 학습 데이터가 추가될 때 모델을 처음부터 다시 구축할 필요가 없다는 점을 들 수 있다. 기존의 저장된 데이터에 새로운 데이터를 추가하기만 하면 되므로, 증분 학습이 자연스럽게 가능하다. 또한, 다중 클래스 분류 문제에 별도의 수정 없이 적용할 수 있는 범용성을 지닌다.

4.2. 단점

K-최근접 이웃 알고리즘은 계산 비용이 매우 높은 편이다. 모든 예측 시점에 전체 훈련 데이터에 대해 거리를 계산하고 정렬해야 하므로, 데이터셋의 크기가 커질수록 예측 속도가 현저히 느려진다. 이는 실시간 응용 프로그램에는 적합하지 않을 수 있다.

이 알고리즘은 차원의 저주에 취약하다. 입력 특성(차원)의 수가 증가하면, 데이터 포인트 간의 거리가 점점 비슷해져서 유의미한 이웃을 찾기 어려워진다. 결과적으로 성능이 저하되며, 고차원 데이터에서는 사전에 차원 축소 기법을 적용해야 하는 경우가 많다.

데이터의 불균형이 심할 경우, 다수 클래스에 편향된 예측을 할 위험이 있다. 또한, 모든 특성이 동등하게 취급되기 때문에, 예측에 중요한 특성과 불필요한 특성을 구분하지 못한다. 적절한 특성 스케일링과 가중치 부여가 필요하다.

단점

설명

계산 비용

예측 시 모든 훈련 데이터와의 거리 계산 및 정렬 필요. 대용량 데이터에서 느림.

차원의 저주

고차원 데이터에서 거리 측정의 유효성이 떨어져 성능 저하.

저장 공간

모델 학습이 별도로 이루어지지 않고 전체 훈련 데이터를 저장해야 함.

불균형 데이터 민감성

훈련 데이터의 클래스 분포가 불균형하면 다수 클래스로 편향될 수 있음.

특성 중요도 무시

모든 특성을 동등하게 취급하여 관련 없는 특성의 노이즈 영향을 받을 수 있음.

5. 주요 변형 및 개선 기법

K-최근접 이웃 알고리즘의 기본적인 한계를 보완하고 성능을 향상시키기 위해 여러 변형 및 개선 기법이 개발되었다.

가장 대표적인 변형은 가중 K-NN이다. 기본 K-NN은 가장 가까운 K개의 이웃을 찾은 후 단순 다수결 투표로 분류를 수행한다. 이 경우 모든 이웃이 동일한 영향력을 갖는다. 반면, 가중 K-NN은 각 이웃의 거리에 반비례하는 가중치를 부여한다. 즉, 더 가까운 이웃의 투표에 더 높은 가중치를 준다. 일반적으로 가중치는 거리의 역수(1/d) 또는 거리의 제곱의 역수(1/d²)를 사용한다. 이를 통해 예측의 정확도를 높이고, 이상치의 영향을 줄일 수 있다.

K-NN의 주요 단점 중 하나는 고차원 데이터에서 성능이 저하되는 차원의 저주 현상이다. 이를 해결하기 위해 주성분 분석이나 선형 판별 분석과 같은 차원 축소 기법을 사전에 적용하는 방법이 널리 사용된다. 또한, 데이터의 모든 특성이 동등하게 중요하지 않을 수 있으므로, 분류에 중요한 특성에 더 높은 가중치를 부여하는 특성 가중치 학습 기법도 연구되었다. 불필요한 노이즈 데이터를 제거하여 계산 효율성과 정확도를 동시에 높이는 데이터 편집 및 축소 알고리즘도 중요한 개선 방안이다.

변형/개선 기법

핵심 아이디어

주요 목적

가중 K-NN

가까운 이웃일수록 예측에 더 큰 가중치 부여

예측 정확도 향상, 이상치 영향 감소

차원 축소 기법 적용

주성분 분석 등으로 고차원 데이터의 차원 축소

차원의 저주 완화, 계산 효율성 향상

특성 가중치 학습

분류에 중요한 특성에 높은 가중치 할당

특성 선택 자동화, 모델 성능 개선

데이터 편집/축소

프로토타입 선택 또는 노이즈 제거

저장 공간 및 계산 시간 절감, 정확도 유지 또는 향상

5.1. 가중 K-NN

가중 K-NN은 표준 K-최근접 이웃 알고리즘의 한계를 보완하기 위해 도입된 변형 기법이다. 표준 K-NN은 가장 가까운 K개의 이웃을 찾은 후, 다수결 투표나 평균을 통해 예측을 수행한다. 이 과정에서 모든 이웃이 동일한 중요도(가중치)를 가지게 된다. 그러나 실제로는 거리가 다른 이웃들이 예측에 미치는 영향이 동일하지 않을 수 있다. 가까운 이웃일수록 더 신뢰할 수 있고, 먼 이웃일수록 노이즈나 관련성이 낮은 정보를 제공할 가능성이 높다. 가중 K-NN은 이러한 직관을 반영하여, 각 이웃 표본에 거리에 반비례하는 가중치를 부여함으로써 예측의 정확도를 향상시키려는 접근법이다.

가중치를 부여하는 가장 일반적인 방법은 역거리 가중치를 사용하는 것이다. 이 방법에서는 각 이웃의 투표나 기여도에 (1 / d) 또는 (1 / d²)와 같은 가중치를 곱한다. 여기서 d는 분류 또는 회귀를 수행하려는 질의 점수와 해당 이웃 사이의 거리이다. 예를 들어, 분류 문제에서는 각 클래스별로 가중치를 합산한 후, 가중 합이 가장 큰 클래스를 예측 결과로 선택한다. 회귀 문제에서는 이웃들의 목표값에 가중치를 곱한 가중 평균을 계산하여 예측값을 도출한다. 이를 통해 매우 가까운 이웃 하나의 강한 의견이 여러 먼 이웃들의 약한 의견을 압도하는 것을 방지하면서도, 가까운 이웃의 영향력을 적절히 반영할 수 있다.

가중치 함수는 응용 분야와 데이터 특성에 따라 다양하게 선택될 수 있다. 역거리 가중치 외에도, 가우시안 커널을 기반으로 한 가중치나 사용자가 정의한 커널 함수를 사용하기도 한다. 표로 정리하면 다음과 같다.

가중치 함수

공식 (가중치 w)

특징

역거리

w = 1 / d

거리에 정비례하여 가중치 감소. d=0일 때 문제 발생 가능.

역거리 제곱

w = 1 / d²

더 먼 이웃의 영향력을 급격히 줄임.

가우시안 커널

w = exp(-d² / σ²)

매끄러운 가중치 감쇠. 대역폭 매개변수 σ 필요.

균일 가중치

w = 1

표준 K-NN과 동일.

이 기법은 특히 데이터의 분포가 불균일하거나 노이즈가 있을 때 유용하다. 그러나 모든 이웃까지의 거리를 계산해야 하므로 기본 알고리즘보다 계산 오버헤드가 약간 증가할 수 있으며, 최적의 가중치 함수와 매개변수를 선택하는 추가적인 고려가 필요하다는 단점도 있다.

5.2. 차원 축소 기법 적용

K-최근접 이웃 알고리즘은 고차원 데이터에서 성능이 저하되는 차원의 저주 문제에 취약하다. 고차원 공간에서는 모든 데이터 포인트 간의 거리가 비슷해져 유의미한 이웃을 찾기 어려워지고, 계산 비용도 크게 증가한다. 이를 완화하기 위해 주성분 분석이나 t-SNE, UMAP 등의 차원 축소 기법을 사전에 적용하는 방법이 널리 사용된다.

차원 축소는 원본 데이터의 정보를 최대한 보존하면서 특징(feature)의 수를 줄이는 과정이다. 예를 들어, 주성분 분석은 데이터의 분산을 최대화하는 새로운 직교 축을 찾아 저차원 공간으로 투영한다. 이를 통해 노이즈를 제거하고 주요 패턴을 강조할 수 있어, K-NN의 분류 정확도를 향상시키고 계산 효율성을 높이는 데 기여한다.

다음은 주요 차원 축소 기법과 K-NN에 적용 시의 고려사항을 정리한 표이다.

기법

주요 특징

K-NN 적용 시 장점

주성분 분석

선형 변환, 분산 최대화

계산 효율성 향상, 노이즈 감소

t-SNE

비선형, 국소 구조 보존 강조

고차원 데이터의 시각화 후 군집 기반 분류에 유용

UMAP

비선형, 전역 및 국소 구조 보존

대규모 고차원 데이터 처리에 효율적

선형 판별 분석

클래스 분리를 최대화하는 축 찾기

지도 학습 방식의 축소로 분류 성능 개선에 직접적

차원 축소를 적용할 때는 정보 손실과 계산 비용 간의 트레이드오프를 고려해야 한다. 과도하게 차원을 줄이면 원본 데이터의 중요한 패턴이 사라져 오히려 성능이 떨어질 수 있다. 따라서 교차 검증 등을 통해 최적의 축소 차원 수를 결정하는 것이 중요하다.

6. 실제 적용 사례

K-최근접 이웃 알고리즘은 그 직관적인 원리 덕분에 다양한 분야에서 실제 문제 해결에 널리 적용된다. 패턴 인식, 분류, 추천 시스템 등에서 효과적으로 사용되며, 특히 데이터의 분포에 대한 사전 가정이 필요 없다는 점이 강점으로 작용한다.

주요 적용 분야는 다음과 같다.

적용 분야

설명

예시

패턴 인식 및 분류

새로운 데이터 포인트를 가장 가까운 이웃들의 레이블에 기반하여 분류한다.

손글씨 인식, 얼굴 인식, 스팸 메일 필터링, 질병 진단 보조[4]

추천 시스템

사용자의 과거 선호도(평점, 구매 이력)와 유사한 다른 사용자들을 찾아 아이템을 추천한다.

영화나 음악 추천, 전자상거래의 "이 상품을 구매한 고객이 함께 구매한 상품"

지리정보 시스템(GIS)

지리적 근접성을 기반으로 분석하거나 분류한다.

부동산 가격 예측(유사 지역 특성 비교), 토지 이용 분류

유전체학 및 생물정보학

유전자 발현 데이터나 단백질 서열의 유사성을 분석한다.

질병 관련 유전자 분류, 단백질 기능 예측

이 알고리즘은 계산 비용이 크다는 단점에도 불구하고, 데이터의 복잡한 비선형 관계를 모델링할 수 있고 해석이 용이하다는 장점으로 인해 여전히 실용적이다. 또한, 지도 학습의 기본 개념을 설명하는 교육용 예시로도 자주 활용된다.

7. 구현 예시

K-최근접 이웃 알고리즘은 개념적으로 단순하여 다양한 프로그래밍 언어로 비교적 쉽게 구현할 수 있다. 여기서는 파이썬과 scikit-learn 라이브러리를 사용한 기본적인 구현 예시를 제시한다.

먼저, 필요한 라이브러리를 임포트하고 샘플 데이터를 생성한다.

```python

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.neighbors import KNeighborsClassifier

from sklearn.metrics import accuracy_score

# 예시 데이터 생성

X = np.array([[1, 2], [2, 3], [3, 1], [6, 5], [7, 8], [8, 6]])

y = np.array([0, 0, 0, 1, 1, 1]) # 클래스 레이블

```

다음으로, 데이터를 훈련 세트와 테스트 세트로 분할하고, KNeighborsClassifier 모델을 생성하여 학습시킨다. 이 예시에서는 이웃의 수(K)를 3으로 설정한다.

```python

# 데이터 분할

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

# K-NN 모델 생성 및 학습 (K=3)

knn_model = KNeighborsClassifier(n_neighbors=3)

knn_model.fit(X_train, y_train)

# 예측 수행

y_pred = knn_model.predict(X_test)

print("예측 결과:", y_pred)

# 정확도 평가

accuracy = accuracy_score(y_test, y_pred)

print(f"모델 정확도: {accuracy:.2f}")

```

보다 저수준의 원리를 이해하기 위해, 거리 계산과 투표 과정을 직접 구현할 수도 있다. 다음은 유클리드 거리를 계산하고 다수결 투표를 통해 클래스를 예측하는 함수의 간략한 예시이다.

```python

def predict_knn(X_train, y_train, x_test, k=3):

distances = []

# 모든 훈련 데이터 포인트에 대한 거리 계산

for i, x_train in enumerate(X_train):

distance = np.sqrt(np.sum((x_train - x_test) ** 2)) # 유클리드 거리

distances.append((distance, y_train[i]))

# 거리를 기준으로 오름차순 정렬하고, 가장 가까운 k개 선택

distances.sort(key=lambda x: x[0])

k_nearest_labels = [label for (_, label) in distances[:k]]

# 다수결 투표로 가장 흔한 클래스 반환

from collections import Counter

most_common = Counter(k_nearest_labels).most_common(1)

return most_common[0][0]

```

이러한 구현은 알고리즘의 핵심 메커니즘을 명확히 보여주지만, 실제 응용에서는 scikit-learn과 같은 최적화된 라이브러리를 사용하는 것이 효율성과 기능 면에서 유리하다.

8. 관련 문서

  • Wikipedia - K-최근접 이웃 알고리즘

  • Wikipedia - k-nearest neighbors algorithm

  • Scikit-learn 공식 문서 - Nearest Neighbors

  • Towards Data Science - Introduction to K-Nearest Neighbors

  • Google Developers - K-Nearest Neighbors

  • KDnuggets - K-Nearest Neighbors Algorithm

  • 한국과학기술정보연구원(KISTI) - K-최근접 이웃(K-NN) 알고리즘

리비전 정보

버전r1
수정일2026.02.12 06:26
편집자unisquads
편집 요약AI 자동 생성