최근접 중심 분류(Nearest Centroid)란? AI에서 클래스의 대표점으로 새 입력을 분류하는 방법
TL;DR
최근접 중심 분류는 정답 클래스마다 대표점 하나를 만들고 새 입력을 가까운 대표점의 클래스로 나누는 지도학습 방법입니다. 기본적인 유클리드 방식은 클래스별 평균을 비교합니다. 개별 이웃을 투표시키는 KNN이나 라벨 없이 군집을 만드는 K-means와 다릅니다. 거리·특징의 척도·중심 수축·사전확률 설정을 확인하고, 대표점 하나가 복잡한 클래스 모양까지 설명한다고 믿지는 않습니다.
핵심 3줄 요약
- 핵심 1
라벨별 대표점을 학습합니다. 같은 정답을 가진 사례를 모아 중심을 구하므로 학습에는 클래스 라벨이 필요합니다. - 핵심 2
이웃 투표와 목적이 다릅니다. KNN은 주변 사례의 라벨을 모으지만 이 방법은 클래스별 대표점을 비교합니다. - 핵심 3
가까움에도 조건이 있습니다. 단위와 거리, 수축·사전확률을 바꾸면 예측이 달라집니다. 별도 평가로 오류를 확인합니다.
이 글에서 다룰 내용
- 최근접 중심 분류의 한 문장 정의
- 두 클래스의 평균으로 이해하는 쉬운 예시
- 대표점 계산과 거리 비교의 작동 방식
- 평균·중앙값·중심 수축·사전확률의 뜻
- KNN·K-means·LDA와의 차이
- 문서·수치 특징의 사용처와 점검 순서
- 클래스 모양·입력 척도·평가의 주의점
최근접 중심 분류를 한 문장으로 정의하면 무엇인가요?
최근접 중심 분류(Nearest Centroid Classification)는 라벨이 붙은 학습 사례를 클래스별 대표점으로 요약하고, 새 입력과 대표점의 관계로 소속 클래스를 예측하는 방법입니다.
가장 기본적인 설명은 각 클래스의 평균을 구한 뒤 새 입력과 유클리드 거리가 가장 가까운 평균을 고르는 것입니다. 중심점은 실제 학습 사례 중 하나일 필요가 없습니다. 여러 사례를 요약한 좌표이므로 원본에는 없는 점이 될 수 있습니다.
scikit-learn에서는
NearestCentroid
로 제공합니다. 거리 설정이 맨해튼이면 특징별 중앙값을 대표점으로 삼습니다. 중심 수축이나 사전확률을 사용하는 구현도 있으므로, 모든 설정을 단순한 원본 평균 비교와 같다고 설명해서는 안 됩니다.
한 줄 정리: 정답별로 대표점을 먼저 만든 뒤 새 사례가 어느 대표점과 가까운지 비교합니다. 라벨 없이 그룹을 발견하는 작업과 구분합니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 두 품종 A와 B를 수치 특징 두 개로 구분한다고 가정해 보겠습니다. 두 특징의 단위를 이미 같은 기준으로 맞췄고, 중심 수축은 쓰지 않으며 클래스 사전확률도 동일하게 둡니다. 아래 좌표는 원리를 설명하려고 만든 예시입니다.
- 품종 A의 학습 좌표는
(1, 3)과(3, 1)입니다. 두 좌표의 평균은(2, 2)입니다. - 품종 B의 학습 좌표는
(7, 9)와(9, 7)입니다. 평균은(8, 8)입니다. - 새 입력
(3, 2)에서 A 중심까지의 거리 제곱은 1, B 중심까지의 거리 제곱은 61입니다. 가까운 중심은 A입니다.
이 예측은 주변 기록 여러 개의 투표를 세어 얻은 결과가 아닙니다. 클래스별 대표 좌표 두 개를 비교한 결과입니다. 거리 제곱으로 비교해도 유클리드 거리의 순서는 같으므로 예시에서는 제곱근 계산을 생략했습니다. Python 표준 라이브러리로 평균과 거리 제곱을 확인한 교육용 계산이며 실제 품종 데이터의 성능 실험은 아닙니다.
각 품종이 한 덩어리로 모여 있으면 중심이 유용한 요약이 됩니다. 반대로 같은 품종이 서로 멀리 떨어진 두 집단으로 나뉘면 평균은 사례가 거의 없는 중간에 놓일 수 있습니다. 그때도 숫자로는 중심이 계산되지만 새 입력을 잘 분류한다는 보장은 없습니다.
쉬운 예시: 품종마다 실제 감자 한 개를 대표로 뽑기보다 여러 기록의 평균 좌표를 대표로 둔다고 생각하면 됩니다.
왜 AI에서 최근접 중심 분류가 중요한가요?
간단한 분류 기준을 만듭니다
현재 입력 특징이 클래스별 중심을 구분하는지 빠르게 살펴볼 기준 모델입니다. 복잡한 신경망을 만들기 전에 대표점 비교로 어느 정도 구분되는지 확인하면 특징 표현의 유용성을 점검할 단서가 생깁니다. 기본 구조가 간단하다는 말이 평가를 생략해도 된다는 뜻은 아닙니다.
대표점 하나에 담긴 정보와 빠진 정보를 드러냅니다
클래스별 중심 좌표는 각 특징의 전반적인 차이를 보여 줍니다. 다만 중심만으로 클래스의 굽은 모양이나 여러 봉우리, 특징 사이의 관계를 모두 보존하지는 않습니다. 공식 사용자 가이드도 비볼록한 클래스와 클래스별 퍼짐이 크게 다른 경우의 한계를 설명합니다.
핵심 인사이트: 대표점은 데이터의 요약입니다. 대표점이 분리되어 있는지와 실제 사례가 잘 분류되는지는 별도로 확인합니다.
최근접 중심 분류는 어떤 순서로 작동하나요?
1. 입력 특징과 정답 클래스를 맞춥니다
한 행은 하나의 사례, 한 열은 숫자 특징으로 준비합니다. 정답 라벨로 사례를 나누기 때문에 같은 입력끼리 저절로 그룹을 찾는 방법이 아닙니다. 학습 이후 새 입력을 예측할 때는 그 입력의 정답을 미리 요구하지 않습니다.
2. 클래스마다 대표점을 계산합니다
기본 유클리드 방식은 같은 라벨의 좌표를 특징별로 평균 냅니다. 맨해튼 방식은 특징별 중앙값을 구합니다. 예를 들어 값이
[1, 2, 12]
인 한 특징의 평균은 5, 중앙값은 2입니다. 같은 자료라도 요약 규칙이 달라지면 대표 좌표가 달라집니다.
중심 수축을 사용하지 않는 기본 모델은 K-means처럼 새 군집 배정과 중심 갱신을 반복하지 않습니다. 이미 주어진 정답별 사례를 모아 중심을 정합니다. K-means의 초기 중심점이나 군집 수 선택을 이 모델의 필수 절차로 가져오면 목적이 섞입니다.
3. 대표점과의 관계로 클래스 라벨을 반환합니다
동일한 사전확률을 두는 기본 예측은 설정한 거리에서 가장 가까운 대표점을 고릅니다.
predict
가 반환하는 것은 클래스 이름이며, 중심까지의 거리 자체를 확률이나 실제 정답률로 읽지는 않습니다. 사전확률이 서로 다르면 구현의 판별 점수 경로도 확인합니다.
거리와 중심 수축, 사전확률은 무엇을 뜻하나요?
metric은 대표점과 거리 계산을 함께 바꿉니다
이번에 확인한 scikit-learn 1.9.1 API는 유클리드와 맨해튼 거리를 안내합니다.
metric="euclidean"
은 평균,
metric="manhattan"
은 특징별 중앙값을 사용합니다. KNN이 지원하는 거리 설정을 그대로 복사하거나 미리 계산한 거리 행렬을 같은 방식으로 입력하지 않습니다.
shrink_threshold는 클래스의 중심 차이를 줄입니다
중심 수축은 클래스 중심과 전체 중심의 차이를 클래스 내부 변동과 표본 수를 반영한 척도로 조정한 뒤, 작은 차이를 줄이는 방식입니다. 설정이
None
이면 중심을 수축하지 않습니다. 양의 임계값을 주면 작은 차이가 0이 될 수 있습니다.
특징의 모든 클래스 차이가 사라지면 대표점들을 구별하는 데 그 특징이 기여하지 않습니다. 이는 원래 입력 숫자에서 임계값을 일괄 빼거나 입력 열을 물리적으로 삭제하는 작업과 다릅니다. 공식 소스는 수축한 차이를 다시 전체 중심에 더해 대표 좌표를 재구성합니다.
priors는 거리 밖의 클래스 비중을 반영합니다
현재 API의 생성자 기본값은
priors="uniform"
입니다. 각 클래스에 같은 비중을 둡니다.
priors="empirical"
은 학습 라벨의 관찰 비율을 사용합니다. 문서의 일반 설명만 보지 말고 지정값과 학습된
class_prior_
를 함께 확인합니다.
확인한 공식 구현은 사전확률이 동일하지 않을 때 클래스 내부 표준편차로 조정한 거리와 사전확률을 판별 점수에 반영합니다. 단순 거리 결과에 빈도만 덧붙이는 옵션이라고 생각하면 부정확합니다. 표본을 의도적으로 많이 모은 클래스의 수집 비율도 실제 운영 비율과 구분합니다.
실전 팁: 대표 좌표인 centroids_, 클래스 순서인 classes_, 사전확률과 거리·수축 설정을 함께 보관하세요. 설정이 달라진 실험은 같은 모델의 이름만으로 비교하지 않습니다.
최근접 중심 분류와 헷갈리는 용어는 무엇이 다른가요?
KNN과의 차이
기존 K-최근접 이웃(KNN) 글은 새 입력과 가까운 학습 사례를 골라 라벨을 투표시키는 방법을 설명합니다. 최근접 중심 분류는 정답 클래스별 대표점과 비교합니다. 이웃 수 k를 정하는 질문과 클래스의 요약 좌표가 적절한지 묻는 질문은 다릅니다.
KNN은 주변의 국소적인 구성을 참고하고, 대표점 방식은 클래스 전체를 요약한 좌표를 참고합니다. 한 클래스가 여러 덩어리로 나뉘면 두 방식은 다른 결과를 낼 수 있습니다. 어느 쪽이 낫다는 결론은 동일한 평가 자료의 오류를 비교한 뒤에 내립니다.
K-means와의 차이
K-means는 라벨 없이 정한 K개 군집에 표본을 배정하고 중심을 반복 갱신합니다. 최근접 중심 분류는 이미 붙어 있는 클래스 라벨별로 중심을 구합니다. 중심이라는 말은 같지만 학습에 쓰는 정보와 반환하는 라벨의 의미가 다릅니다.
LDA·QDA와의 차이
선형 판별 분석(LDA)는 클래스 평균뿐 아니라 공유 공분산을 추정해 특징의 퍼짐과 관계를 반영합니다. QDA는 공분산도 클래스별로 따로 추정합니다. 기본 유클리드 대표점 분류는 이런 공분산을 모두 학습한 모델의 다른 이름이 아닙니다.
특정한 공분산과 사전확률 조건에서는 LDA와 최근접 평균 분류가 연결됩니다. 하지만 원본 좌표에서 평균만 비교하는 규칙을 일반적인 LDA와 같다고 단정하지 않습니다. 특히 LDA의 지도 차원 축소 기능을 최근접 중심 분류의 기본 기능으로 옮겨 설명하지 않습니다.
비교 정리: KNN은 이웃의 정답, K-means는 라벨 없는 군집, 최근접 중심 분류는 라벨별 대표점, LDA·QDA는 클래스 분포의 퍼짐까지 살펴보는 방법입니다.
실전에서는 어디에 쓰이나요?
문서의 수치 특징으로 주제를 분류합니다
공식 텍스트 분류 예제는 TF-IDF 희소 특징에 최근접 중심 분류를 적용해 다른 분류기와 비교합니다. 이 맥락에서는 로키오(Rocchio) 분류기로도 불립니다. 원시 문장을 평균 내는 것이 아니라 문서의 숫자 특징을 클래스별로 요약합니다.
단어 사전을 만드는 데이터, 불필요한 머리말과 인용문의 처리, 평가 분할을 함께 확인합니다. 문서 주제 대신 발신자나 형식의 흔적으로 정답을 맞히는 결과는 실제 목적과 다를 수 있습니다. 공식 예제의 점수를 새 한국어 문서의 예상 정확도로 가져오지는 않습니다.
수치 특징 분류의 기준 결과를 비교합니다
센서나 측정 특징으로 상태를 나누는 문제에서 후보 기준으로 검토합니다. 공식 Iris 예제는 두 특징과 여러 중심 수축 설정으로 경계를 그립니다. 이 예제의 표시 정확도는 학습에 사용한 입력을 다시 예측해 얻었으므로 독립 테스트 성능과 구분합니다.
최근접 중심 분류를 적용할 때 어떤 순서로 확인하나요?
1. 클래스의 의미와 데이터 분리를 정합니다
예측할 정답 이름과 라벨 기준을 먼저 적습니다. 같은 사람·장비의 반복 관측이나 같은 문서의 복사본이 학습과 평가에 섞이지 않게 나눕니다. 클래스별 표본 수를 확인해 대표점이 극소수 기록만으로 결정되는 그룹도 표시합니다.
2. 전처리를 학습 자료 안에서 맞춥니다
서로 다른 단위의 특징은 큰 숫자 범위가 거리를 지배할 수 있습니다. 공식 스케일링 예제는 거리 기반 모델의 경계가 입력 척도에 따라 바뀌는 모습을 보여 줍니다. 표준화가 항상 최선이라는 뜻은 아니며 실제 특징의 의미도 살펴야 합니다.
결측값 대체나 표준화 통계는 학습 자료로 구하고 평가에는 같은 변환을 적용합니다. 교차 검증에서는 전처리와 분류기를 파이프라인으로 묶어 각 학습 구간에서 다시 맞춥니다. 중심만 학습 자료로 구하더라도 전처리에 전체 자료를 쓰면 누수가 남습니다.
3. 거리·수축·사전확률을 같은 분할에서 비교합니다
유클리드 기본값과 필요한 대안을 비교하고, 수축을 사용한다면 강도는 검증 자료로 선택합니다. 사전확률을 지정한 이유와 클래스 순서를 기록합니다. 입력이 희소 행렬인 경우 현재 API는 중심 수축을 지원하지 않으므로 메모리 부담을 무시하고 무조건 밀집 배열로 바꾸지 않습니다.
4. 대표점과 실제 오류 사례를 함께 읽습니다
클래스별 중심, 입력 열 순서와 평가 지표를 저장합니다. 전체 정확도만 보지 말고 드문 클래스를 놓친 사례와 다른 클래스를 잘못 고른 사례를 원본에 연결합니다. KNN이나 LDA와 비교할 때도 같은 분할과 전처리 조건을 사용합니다.
한 줄 정리: 데이터 분리 → 전처리 학습 → 대표점과 설정 확인 → 별도 자료의 오류 검토 순서로 진행합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 클래스마다 대표점 하나면 충분한지 확인합니다. 같은 정답이 여러 덩어리로 흩어져 있거나 구부러진 형태라면 한 중심이 그 구조를 잘 요약하지 못합니다. 중심만 그리지 말고 실제 사례의 분포도 살펴봅니다.
둘째, 평균과 중앙값을 혼동하지 않습니다. 유클리드 방식의 평균은 극단값의 영향을 받습니다. 맨해튼 방식으로 바꾸면 대표점과 거리 규칙이 함께 달라집니다. 중앙값을 썼다는 사실만으로 라벨 오류나 다중 집단 문제가 해결되지는 않습니다.
셋째, 중심 수축을 자동 성능 향상으로 읽지 않습니다. 불필요한 차이를 줄이려는 설정이지만 구분에 필요한 작은 차이도 사라질 수 있습니다. 공식 예제의 한 데이터에서 좋아진 결과가 모든 입력에 적용되는 법칙은 아닙니다.
넷째, 가장 가까운 클래스가 곧 정상 입력은 아닙니다. 학습 때 없던 유형도 기존 대표점 중 하나와 가장 가까울 수 있습니다. 분류 라벨을 새로운 클래스 탐지나 안전 보증으로 대신 사용하지 말고 별도 검토 기준을 둡니다.
주의: 높은 학습 정확도, 잘 나뉜 경계 그림, 가까운 대표점은 서로 다른 관찰입니다. 모델이 보지 못한 자료에서 목적에 맞는 오류를 확인하세요.
자주 묻는 질문
Q1. 최근접 중심 분류는 정답 라벨 없이도 학습하나요?
이 방법의 학습에는 클래스 라벨이 필요합니다. 라벨별로 사례를 모아 대표점을 만듭니다. 라벨 없이 가까운 묶음을 찾으려는 목적이라면 K-means 같은 군집화와 구분해야 합니다.
Q2. 중심점은 실제 학습 사례 중 하나인가요?
반드시 그렇지는 않습니다. 기본 유클리드 방식의 중심은 클래스별 평균 좌표입니다. 맨해튼 방식의 특징별 중앙값도 모든 좌표를 합친 실제 사례와 일치할 필요는 없습니다.
Q3. KNN의 k는 여기서 몇으로 정하나요?
최근접 중심 분류는 개별 이웃 k개의 투표를 사용하는 모델이 아닙니다. 정답 클래스마다 대표점을 구합니다. 클래스 수와 참고할 개별 이웃 수를 같은 설정으로 읽지 않습니다.
Q4. 중심 수축은 원본 데이터의 열을 삭제하나요?
수축은 전체 중심과 클래스 중심의 차이를 줄입니다. 차이가 사라진 특징은 중심 구별에 기여하지 않지만, 입력 배열에서 그 열을 직접 삭제하는 처리와는 다릅니다.
Q5. 가까운 중심까지의 거리를 확률로 봐도 되나요?
거리 자체는 확률이 아닙니다. 확률 출력이 필요하면 설치 버전과 거리 설정의 지원 조건, 점수 계산 방식을 별도로 확인합니다. 큰 확신 값도 실제 정답률을 보증하지 않습니다.
Q6. 기본 모델은 클래스 수가 많은 쪽을 자동으로 선호하나요?
현재 생성자의 기본 사전확률은 uniform으로 클래스마다 같습니다. 학습 라벨의 빈도를 반영하려면 empirical을 명시합니다. 학습한 class_prior_를 읽고 수집 비율과 운영 비율이 같은지 확인하세요.
출처
- scikit-learn API, NearestCentroid
- scikit-learn User Guide, Nearest Neighbors
- scikit-learn Example, Nearest Centroid Classification
- scikit-learn 공식 소스, NearestCentroid
- scikit-learn User Guide, Linear and Quadratic Discriminant Analysis
- scikit-learn Example, Importance of Feature Scaling
- scikit-learn User Guide, Common pitfalls and recommended practices
- scikit-learn Example, Classification of text documents using sparse features
마무리
최근접 중심 분류는 정답 클래스마다 대표점을 만들고 새 입력을 가까운 대표점의 범주로 예측하는 방법입니다. KNN의 이웃 투표나 K-means의 군집 발견과는 다릅니다. 거리 설정에 따라 평균과 중앙값이 바뀌며 중심 수축과 사전확률도 결과에 관여합니다.
처음 적용한다면 라벨 기준과 데이터 분리, 입력 특징의 단위부터 확인하세요. 대표점과 설정을 저장한 뒤 별도 평가 자료의 오류를 원본에 연결합니다. 대표점 하나가 클래스의 모양을 충분히 설명하는지까지 살펴야 이 간단한 모델이 현재 문제의 기준으로 적절한지 판단할 수 있습니다.
