평균 이동(Mean Shift)이란? AI에서 밀도가 높은 중심을 찾아 데이터를 묶는 방법
TL;DR
평균 이동(Mean Shift)은 주변 데이터의 평균 쪽으로 중심 후보를 반복해서 옮겨 밀도가 높은 위치를 찾는 군집화 방법입니다. 군집 수를 먼저 정하지 않고 대역폭으로 이웃 범위를 조절합니다. 가까운 중심 후보를 정리한 뒤 데이터에 군집 번호를 붙이며, 대역폭·특징 단위·외딴 점 처리와 새 데이터 예측의 차이를 함께 확인해야 합니다.
핵심 3줄 요약
- 핵심 1
주변 평균을 따라 중심을 옮깁니다. 현재 위치에서 가까운 점들을 모으고 그 평균 위치로 이동하는 과정을 반복합니다. - 핵심 2
대역폭이 묶음의 크기를 바꿉니다. 군집 수를 직접 입력하지 않아도 이웃 범위를 어떻게 정하느냐에 따라 결과가 달라집니다. - 핵심 3
새 데이터는 기존 중심에 붙입니다. 학습 때 중심을 찾는 과정과 새 점에 가장 가까운 군집을 배정하는 예측은 다릅니다.
이 글에서 다룰 내용
- 평균 이동의 한 문장 정의
- 점들이 모인 위치로 이해하는 쉬운 예시
- 대역폭·시드·중심 후보를 처리하는 흐름
- K-means·KDE·DBSCAN과의 차이
- 특징 탐색과 이미지 처리의 실전 사용처
- 입력 단위·군집 수·새 데이터 점검법
- 계산 비용과 외딴 점을 해석할 때의 주의점
평균 이동을 한 문장으로 정의하면 무엇인가요?
평균 이동은 데이터의 국소적인 밀도 봉우리를 찾도록 중심 후보를 이웃 점들의 평균 방향으로 반복 이동시키고, 남은 중심을 기준으로 데이터를 묶는 비지도학습 방법입니다.
영문 이름의 mean은 평균, shift는 이동을 뜻합니다. 데이터 전체를 평균 하나로 바꾸는 전처리와는 다릅니다. 움직이는 것은 중심 후보의 위치이며, 각 단계에서 어떤 점이 이웃인지 다시 확인합니다.
scikit-learn의 MeanShift는 일정한 범위 안의 점에 같은 가중치를 주는 평탄 커널을 사용합니다. 일반적인 평균 이동은 커널에 따라 이웃의 기여를 다르게 줄 수도 있습니다. 여기서는 공식 구현의 평탄 커널을 기준으로 설명합니다.
한 줄 정리: 평균 이동은 중심 후보 주변의 점들을 평균 내고 그 위치로 옮기는 과정을 반복해 데이터가 모인 곳을 찾습니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 이미지에서 뽑은 두 가지 특징을 좌표로 그렸다고 가정해 보겠습니다. 점들은 몇 군데에 모여 있지만 묶음 수나 이름은 정해져 있지 않습니다. 아래 설명은 실제 이미지 분석 결과가 아니라 작동 원리를 보여 주는 가정입니다.
한 점 근처에 원을 그리고 그 안에 들어온 점들의 평균 위치를 구합니다. 원의 중심을 그 평균으로 옮기면 원 안에 포함되는 점도 달라질 수 있습니다. 새 위치에서 이웃을 찾고 평균을 계산하는 일을 반복합니다.
점이 많이 모인 곳 근처에서는 이동 폭이 작아집니다. 여러 출발점이 비슷한 곳에 도착하면 가까운 중심 후보들을 정리해 대표 중심을 남깁니다. 마지막으로 각 데이터를 중심과 연결해 군집 번호를 붙입니다.
원의 범위를 너무 좁히면 작은 덩어리들이 따로 남고, 너무 넓히면 구분하고 싶었던 덩어리가 합쳐질 수 있습니다. 군집 수를 입력하지 않는 대신 이 범위를 정하는 대역폭이 결과를 크게 바꿉니다.
쉬운 예시: 여러 위치에서 출발한 중심 후보가 주변 점들의 평균을 따라 움직이고, 비슷한 목적지에 도착한 후보를 하나로 정리한다고 생각하면 됩니다.
왜 AI에서 평균 이동이 중요한가요?
군집 수를 모르는 자료를 탐색합니다
K-means처럼 시작 전에 묶음 수를 고르기 어려운 데이터에서 후보 구조를 살펴볼 때 유용합니다. 평균 이동은 대역폭과 데이터 분포에 따라 중심을 남깁니다. 발견한 군집 수가 자연에 존재하는 유일한 정답이라는 뜻은 아닙니다.
전체 평균에 가려진 중심을 찾습니다
여러 집단이 떨어져 있을 때 전체 평균은 집단 사이의 빈 곳에 놓일 수 있습니다. 평균 이동은 현재 위치 주변만 보고 옮겨 가므로 서로 다른 밀집 영역의 중심 후보를 찾습니다. 각 중심과 실제 표본을 같이 보면 어떤 특징이 모였는지 해석하기 쉽습니다.
정답 라벨 없이 특징 공간을 살펴봅니다
분류용 정답을 만들기 전에 비슷한 특징의 표본을 모아 검토하는 데 쓸 수 있습니다. 군집 번호에는 사물 이름이나 정상·불량의 의미가 들어 있지 않습니다. 사람이 원본 데이터를 확인하고 목적에 맞는 이름과 기준을 붙입니다.
평균 이동은 어떤 순서로 작동하나요?
1. 대역폭과 출발 위치를 정합니다
대역폭은 중심 후보 주변에서 이웃을 찾는 범위를 정하는 양수입니다. scikit-learn에서는
bandwidth
로 지정합니다. 직접 넣지 않으면
estimate_bandwidth
로 추정하지만, 추정값이 모든 목적에 맞는 최적값은 아닙니다.
출발 위치를 시드라고 부릅니다. 기본적인 흐름에서는 여러 데이터 위치에서 탐색을 시작합니다.
bin_seeding=True
를 사용하면 대역폭 크기의 격자에 데이터를 모아 더 적은 출발점을 고를 수 있습니다.
seeds
를 직접 주면 이 옵션은 무시됩니다.
2. 이웃 평균으로 중심 후보를 옮깁니다
현재 중심 후보에서 대역폭 범위 안에 있는 점들을 찾습니다. 평탄 커널에서는 이웃들의 좌표를 같은 비중으로 평균 내고 그 위치로 후보를 옮깁니다. 현재 위치에서 새 평균까지의 차이가 평균 이동 벡터입니다.
이웃은 첫 단계에서 고정되지 않습니다. 후보가 움직일 때마다 범위 안의 점을 다시 찾습니다. 충분히 작은 이동으로 수렴하거나 구현의 반복 한도에 도달하면 해당 시드의 탐색을 끝냅니다.
max_iter
는 시드별 반복 한도입니다.
3. 가까운 후보를 정리하고 라벨을 붙입니다
다른 출발점이 비슷한 위치에 도달할 수 있으므로 가까운 후보를 후처리해 중복 중심을 줄입니다. 남은 중심 좌표는
cluster_centers_
에, 학습 데이터의 군집 번호는
labels_
에 담깁니다.
기본 설정인
cluster_all=True
에서는 중심의 커널 범위 밖에 남은 점도 가장 가까운 중심에 배정합니다.
cluster_all=False
로 학습하면 이런 외딴 점에 -1을 붙입니다. 이 숫자는 품질이나 위험도를 계산한 점수가 아닙니다.
실전 팁: 중심 좌표만 저장하지 말고 대역폭, 입력 열 순서, 전처리 통계와 외딴 점 처리 설정을 함께 남기세요. 같은 숫자 좌표도 특징 단위가 달라지면 의미가 달라집니다.
평균 이동과 헷갈리는 용어는 무엇이 다른가요?
K-means와 평균 이동의 차이
K-means는 정한 수의 중심과 표본 배정을 번갈아 갱신하며 군집 안의 제곱거리 합을 줄입니다. 평균 이동은 각 후보 주변의 이웃을 따라 밀집 위치를 찾고 중심을 정리합니다. 둘 다 중심을 쓰지만 군집 수와 이웃을 정하는 방식이 다릅니다.
커널 밀도 추정과 평균 이동의 차이
커널 밀도 추정은 관측 자료로 연속적인 확률밀도를 나타내는 방법입니다. 평균 이동은 이런 밀도 관점에서 봉우리를 찾아가는 과정과 연결됩니다. scikit-learn의 MeanShift 결과는 중심과 라벨이며, KDE처럼 새 점의 로그밀도를 반환하는 모델과는 구분합니다.
DBSCAN과 평균 이동의 차이
DBSCAN은 이웃 수가 충분한 핵심점에서 밀도 연결 관계를 확장하고 노이즈를 구분합니다. 평균 이동은 이웃 평균을 따라 이동하는 중심 후보가 핵심입니다. DBSCAN의 eps와 평균 이동의
bandwidth
는 모두 거리 범위와 관련되지만 같은 설정값처럼 교환해서 쓰지 않습니다.
표준화와 평균 이동의 차이
표준화는 학습 평균을 빼고 표준편차로 나눠 특징의 척도를 맞추는 전처리입니다. 평균 이동은 중심 후보를 반복 갱신하는 군집화입니다. 표준화한 자료에 평균 이동을 적용할 수 있지만, 이름에 평균이 들어간다고 같은 개념은 아닙니다.
비교 정리: K-means는 정해진 수의 중심, KDE는 밀도 함수, DBSCAN은 밀도 연결, 평균 이동은 이웃 평균을 따라 찾은 중심으로 이해하면 됩니다.
실전에서는 어디에 쓰이나요?
수치 특징의 밀집 구간을 탐색합니다
서비스 이용 기록이나 센서 측정값에서 비슷한 특징의 표본이 어디에 모이는지 살펴볼 수 있습니다. 초기 탐색에서는 특징 수를 줄이고 군집별 실제 표본을 확인하는 편이 해석하기 쉽습니다. 처리 시간과 요청 길이처럼 단위가 다른 값은 거리 계산 전에 척도를 점검합니다.
이미지의 색상과 위치 특징을 묶습니다
픽셀의 색상이나 공간 좌표를 특징으로 만들어 비슷한 영역을 묶는 데 평균 이동의 원리를 활용할 수 있습니다. 색상만 쓰면 떨어진 위치의 같은 색도 함께 묶일 수 있습니다. 색상과 위치를 함께 쓸 때는 두 종류의 특징에 어떤 척도를 줄지 정해야 합니다.
이것만으로 사진 속 사람이나 자동차의 이름을 알아내는 것은 아닙니다. 이미지 특징의 묶음과 객체의 의미는 다릅니다. 영역 후보를 만든 뒤 원본 이미지와 비교하며 쓸 만한 분할인지 검토합니다.
기존 중심으로 새 표본을 분류합니다
학습한 MeanShift의
predict
는 새 표본에 가장 가까운 기존 중심의 번호를 반환합니다. 새 표본마다 평균 이동 학습을 다시 실행하거나 새로운 군집을 만드는 기능은 아닙니다. 기존 중심에서 아주 먼 입력도 가까운 중심 하나로 배정될 수 있습니다.
활용 기준: 군집 탐색에는 학습 결과를, 새 입력의 배정에는 예측 결과를 씁니다. 새 집단이 등장했는지 보려면 거리 변화와 재학습 필요성을 별도로 점검합니다.
평균 이동을 사용할 때 어떤 순서로 확인하나요?
1. 한 행과 한 열의 의미를 정합니다
입력은 행이 표본, 열이 특징인 배열입니다. 고객 한 명을 한 행으로 볼지 방문 한 번을 한 행으로 볼지 먼저 결정합니다. 식별용 고객 번호를 연속형 수치처럼 넣거나 단위가 바뀐 열을 섞으면 거리와 평균이 업무 의미에서 벗어납니다.
2. 대역폭을 여러 값으로 비교합니다
작은 값과 큰 값에서 군집 수, 군집 크기, 중심 위치가 얼마나 바뀌는지 봅니다.
estimate_bandwidth
의
quantile
은 거리 분포를 이용한 추정에 관여하고
n_samples
는 추정에 사용할 표본 수를 제한합니다. 기본값을 쓰더라도 결과를 직접 검토합니다.
3. 시드와 계산 시간을 함께 기록합니다
격자 기반 시딩과
min_bin_freq
를 조정하면 출발점 수를 줄일 수 있습니다. 적은 점만 들어 있는 격자를 시드에서 제외하는 선택이므로 드문 집단의 중심을 놓치지 않는지 확인합니다. 실행이 빨라졌다는 이유만으로 같은 결과라고 판단하지 않습니다.
4. 외딴 점과 새 데이터 동작을 나눠 시험합니다
학습 때 -1을 남기는 설정과 예측 때 가장 가까운 중심을 고르는 규칙은 따로 확인합니다. 특히
cluster_all=False
로 학습했더라도
predict
가 먼 새 입력을 자동으로 -1로 거부한다고 가정하면 안 됩니다. 학습에 없던 집단을 섞은 시험 자료로 확인하는 편이 안전합니다.
5. 군집 번호보다 표본과 안정성을 확인합니다
번호가 바뀌어도 같은 점들이 함께 묶일 수 있습니다. 번호 자체 대신 군집 구성, 대표 표본, 중심 거리와 작은 설정 변화에 대한 안정성을 봅니다. 후속 예측 모델의 입력으로 쓴다면 전처리와 중심 학습도 평가 데이터와 분리합니다.
한 줄 정리: 입력 단위, 대역폭, 출발점, 외딴 점, 새 입력의 배정 규칙을 각각 확인하면 군집 수 하나만 보고 판단하는 실수를 줄일 수 있습니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 군집 수를 안 정한다고 설정이 없는 방법은 아닙니다. 대역폭과 특징 척도에 따라 봉우리가 합쳐지거나 나뉩니다. 보기 좋은 군집 수를 얻으려고 설정을 바꾸었다면 그 선택 이유와 비교 결과를 남깁니다.
둘째, 대역폭 추정이 전체 실행의 병목이 될 수 있습니다. 공식 문서는
estimate_bandwidth
의 계산 시간이 표본 수에 대해 적어도 제곱 수준으로 늘어난다고 설명합니다. 큰 자료에서는 추정용 표본 수를 제한하고 군집화 시간과 추정 시간을 나눠 측정합니다.
셋째, 높은 차원과 많은 출발점에서는 이웃 검색을 반복하는 비용이 커집니다. 저차원 예제에서 빨랐다는 이유로 대규모 문서 임베딩에도 같은 속도를 기대하면 안 됩니다. 필요한 특징과 표본 규모부터 검토합니다.
넷째, 모든 점에 라벨이 붙었다고 이상치가 없다는 뜻은 아닙니다. 기본 설정은 범위 밖의 점도 중심에 붙입니다. 외딴 점을 남기더라도 -1만으로 사기·고장·불량을 확정하지 않고 원본 기록을 확인합니다.
다섯째, 한 대역폭으로 서로 다른 밀도의 집단을 모두 잘 나누기 어려울 수 있습니다. 군집별 표본 수와 모양을 확인하고 다른 알고리즘과도 비교합니다. 합성 데이터의 예쁜 그림만으로 실제 업무에 적합하다고 결론짓지 않습니다.
주의: 평균 이동의 중심은 라벨 없는 데이터에서 찾은 특징 공간의 후보입니다. 사람의 행동이나 위험도를 자동 확정하는 정답표로 쓰지 않습니다.
자주 묻는 질문
Q1. 군집 수를 미리 입력해야 하나요?
아닙니다. 평균 이동은 대역폭과 데이터 분포에 따라 중심을 남깁니다. 다만 군집 수를 직접 입력하지 않는 것과 분석자의 선택이 전혀 필요 없는 것은 다릅니다. 대역폭을 바꾼 결과를 비교해야 합니다.
Q2. 대역폭은 크면 클수록 좋은가요?
아닙니다. 넓은 이웃 범위는 가까운 봉우리를 합칠 수 있고 좁은 범위는 작은 묶음을 많이 남길 수 있습니다. 찾고 싶은 구조의 크기, 입력 단위와 군집의 안정성을 함께 봅니다.
Q3. 중심점은 반드시 실제 데이터 중 하나인가요?
그렇지 않습니다. 중심 후보를 이웃 점의 평균으로 옮기므로 실제 관측에 없는 좌표가 될 수 있습니다. 설명용 대표 사례가 필요하면 중심 좌표와 가까운 실제 표본을 따로 찾아 제시합니다.
Q4. 새 데이터가 오면 새 군집을 자동으로 만드나요?
scikit-learn의
predict
는 기존 중심 중 가장 가까운 곳에 배정합니다. 새 군집을 추가하는 재학습과는 다릅니다. 입력 분포가 바뀌었다면 기존 중심과의 거리, 오류 사례와 재학습 기준을 따로 점검합니다.
Q5. 평균 이동으로 확률밀도도 바로 얻나요?
MeanShift는 군집 중심과 라벨을 반환하는 구현입니다. 데이터가 모인 봉우리를 찾는 원리는 밀도 추정과 연결되지만, 각 점의 확률밀도나 로그밀도가 필요하면 KDE 같은 밀도 추정 도구를 별도로 검토합니다.
출처
마무리
평균 이동은 주변 평균으로 중심 후보를 옮겨 데이터가 모이는 위치를 찾는 방법입니다. 군집 수를 먼저 정하지 않지만 대역폭, 특징 단위와 출발점 선택이 결과를 좌우합니다. 중심을 찾는 학습과 기존 중심에 새 점을 배정하는 예측도 나눠 이해해야 합니다.
처음에는 작은 자료에서 대역폭을 바꾸고 군집별 표본과 외딴 점을 직접 살펴보세요. 밀도 함수 자체가 궁금하다면 커널 밀도 추정(KDE) 용어 설명을 함께 읽으면 두 방법의 역할을 구분하기 쉽습니다.
