마할라노비스 거리(Mahalanobis Distance)란? AI에서 공분산으로 특징의 차이를 재는 방법
TL;DR
마할라노비스 거리는 특징별 분산과 특징 사이의 공분산을 반영해 두 벡터의 차이를 재는 거리입니다. 자주 함께 변하는 방향과 드물게 어긋나는 방향을 다르게 봅니다. AI의 수치 특징 비교와 이상 후보 검토에 쓰지만 거리 자체가 이상 확률은 아닙니다. 기준 공분산의 추정 범위, 역행렬의 안정성, 반환값이 거리인지 제곱 거리인지까지 확인합니다.
핵심 3줄 요약
- 핵심 1
퍼짐과 함께 변하는 방향을 봅니다. 각 열의 크기만 맞추는 계산과 달리 열 사이의 선형 관계도 거리에서 반영합니다. - 핵심 2
기준 자료가 거리의 뜻을 정합니다. 어떤 자료로 중심과 공분산을 추정했는지에 따라 같은 입력의 거리도 달라집니다. - 핵심 3
거리와 제곱 거리를 구별합니다. SciPy의 거리 함수와 scikit-learn 공분산 추정기의 같은 이름 메서드는 반환 척도가 다릅니다.
이 글에서 다룰 내용
- 마할라노비스 거리의 한 문장 정의
- 두 특징의 같은 방향·반대 방향 차이를 보는 예시
- 공분산과 정밀도 행렬의 계산 순서
- SciPy·scikit-learn의 입력과 반환값
- 표준화·백색화·NCA와의 차이
- 실전 사용처와 자료 분리 체크리스트
- 특이행렬·이상치·확률 해석의 주의점
마할라노비스 거리를 한 문장으로 정의하면 무엇인가요?
마할라노비스 거리(Mahalanobis Distance)는 두 벡터의 차이에 공분산의 역행렬을 적용해 방향별 퍼짐을 반영하는 거리입니다.
공분산 행렬의 대각 원소는 특징별 분산이고 비대각 원소는 특징들이 함께 변하는 정도입니다. 역행렬은 이 관계를 거리 계산의 기준으로 바꿉니다. 공분산이 대칭 양의 정부호일 때 일반적인 거리의 성질을 갖습니다.
두 관측값 사이를 비교할 수도 있고, 한 관측값과 기준 자료의 중심을 비교할 수도 있습니다. 중심에서의 거리를 구하려면 중심도 별도로 정해야 합니다. 거리라는 이름에 평균이나 정상 기준이 자동으로 포함되는 것은 아닙니다.
한 줄 정리: 숫자가 얼마나 달라졌는지에 더해 기준 자료에서는 그 방향의 차이가 얼마나 큰지도 반영합니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 두 센서 특징을 함께 살핀다고 가정해 보겠습니다. 설명을 단순하게 하려고 중심은
[0, 0]
이고 두 특징의 분산은 모두 1, 공분산은 0.8인 기준을 직접 정합니다. 실제 센서 측정이나 AI 모델의 성능 자료가 아닙니다.
- 기준 공분산은
V = [[1, 0.8], [0.8, 1]]입니다. - A의 중심 대비 차이는
[1, 1], B의 차이는[1, -1]입니다. - 두 점의 유클리드 거리는 모두 약 1.4142입니다.
- 마할라노비스 거리는 A가 약 1.0541, B가 약 3.1623입니다.
두 특징은 기준에서 같은 방향으로 움직이는 경향이 있습니다. A는 그 방향을 따르지만 B는 한쪽이 커질 때 다른 쪽이 작아집니다. 각 축에서의 변화량 크기는 같아도 B의 조합이 기준의 좁은 방향으로 더 멀리 벗어납니다.
이때 제곱 거리는 A가
10 / 9
, B가 10입니다. 마지막에 제곱근을 취해야 위의 거리 숫자가 됩니다. 이 글의 작은 행렬과 거리는 Python 표준 라이브러리로 검산했으며 SciPy·scikit-learn 함수를 실행한 벤치마크가 아닙니다.
쉬운 예시: 평소 함께 오르내리는 두 값이 서로 반대로 움직이면 각 값만 따로 볼 때와 다른 검토 순서가 나옵니다.
왜 AI에서 마할라노비스 거리가 중요한가요?
특징의 단위와 상관을 함께 반영합니다
수치 특징의 범위가 다르면 원래 유클리드 거리에서 큰 단위의 열이 지배하기 쉽습니다. 분산만 대각 행렬로 반영하면 축별 척도를 조정하는 거리가 됩니다. 전체 공분산을 사용하면 여러 열이 함께 흔들리는 방향까지 계산에 들어갑니다.
한 변수로 놓치기 쉬운 조합을 살핍니다
각 센서값이 개별 허용 범위에 있어도 평소 함께 나타나지 않는 조합일 수 있습니다. 중심 대비 거리를 정렬하면 이런 사례를 검토 후보로 모읍니다. 공식 강건 공분산 예제도 이상치 검토와 관측값 순위화 등을 사용처로 설명합니다. 이상 원인이나 고장 여부는 원본과 별도 기준으로 확인합니다.
핵심 인사이트: 큰 거리는 선택한 기준의 퍼짐에서 멀다는 뜻입니다. 기준 자체가 잘못됐거나 정상 유형이 여러 개라면 해석도 달라집니다.
마할라노비스 거리는 어떤 순서로 계산하나요?
1. 기준 자료와 비교 대상을 나눕니다
한 행은 사례, 한 열은 수치 특징으로 맞춥니다. 중심 대비 이탈을 보려면 대표할 기준 구간을 먼저 정합니다. 미래 자료의 성능을 평가하는 실험에서는 보류 자료를 빼고 훈련 부분에서 중심과 공분산을 추정합니다. 열의 순서와 결측 처리도 같은 기준을 유지합니다.
2. 공분산에서 정밀도 행렬을 구합니다
공분산을 V, 역행렬을 VI라고 하겠습니다. VI는 정밀도 행렬이라고도 부릅니다. 각 원소의 역수를 따로 구하는 연산이 아닙니다. 두 특징 예시의 VI는
[[25/9, -20/9], [-20/9, 25/9]]
입니다. 비대각 원소가 두 특징의 조합에 영향을 줍니다.
3. 차이 벡터의 이차형식과 제곱근을 구합니다
행 벡터로 쓴 차이를 delta라고 하면 제곱 거리는
delta @ VI @ delta.T
이고 거리는 그 값의 제곱근입니다. 두 점 비교에서는
delta = u - v
, 중심 비교에서는
delta = x - center
를 사용합니다. 같은 VI를 적용한다면 두 점 계산에서 공통 중심은 차이에서 없어집니다.
V가 단위행렬이면 이 계산은 유클리드 거리와 같습니다. V가 대각 행렬이면 각 차이의 제곱을 해당 분산으로 나눈 뒤 더합니다. 앞 예시처럼 비대각 성분이 있으면 축별 나눗셈만으로 같은 결과를 얻지 못합니다.
실전 팁: 원본 특징, 중심, 공분산, 정밀도, 제곱 거리와 최종 거리를 나눠 저장하면 입력 문제와 척도 혼동을 구별하기 쉽습니다.
주요 설정과 반환값은 어떻게 읽나요?
SciPy는 두 벡터와 역공분산을 받습니다
scipy.spatial.distance.mahalanobis(u, v, VI)
는 두 일차원 벡터 사이의 거리를 반환합니다. VI 자리에 공분산 V를 그대로 넣지 않습니다. 함수가 두 점만 보고 대표 공분산을 학습하거나 평균을 자동으로 빼는 것으로 이해하면 안 됩니다. 입력 열 수와 행렬의 양쪽 차원을 맞춥니다.
여러 점을 비교하는
cdist(XA, XB, metric='mahalanobis', VI=precision)
는 XA의 행 수 × XB의 행 수 모양인 거리 행렬을 반환합니다. 이는 점마다 하나인 중심 대비 점수 배열과 다릅니다. 비교할 점이 많으면 반환 행렬의 메모리도 커집니다.
cdist의 자동 추정 범위를 확인합니다
SciPy cdist 문서는 VI를 생략하면 XA와 XB를 합친 자료의 공분산에서 역행렬을 계산한다고 안내합니다. 보류 자료 XB가 기준 추정에 들어가면 독립 평가라는 설계와 어긋날 수 있습니다. 훈련에서 정한 정밀도를 명시하면 비교 배치가 바뀔 때 기준도 함께 바뀌는 일을 막습니다.
공분산 추정기의 메서드는 제곱 거리를 줍니다
scikit-learn의
EmpiricalCovariance().fit(X_train)
는 중심
location_
, 공분산
covariance_
등을 추정합니다.
mahalanobis(X_new)
의 반환값은 저장한 중심에서의 제곱 거리입니다. 새 입력의 중심을 또 빼서 전달하지 않고 학습 때와 같은 특징 좌표를 전달합니다.
이 추정기의
assume_centered=False
가 기본값입니다. 참으로 바꾸면 공분산 계산 전에 중심화하지 않으므로 자료가 이미 적절히 중심화됐다는 전제를 확인합니다.
precision_
는 저장 옵션이 켜졌을 때 보관되는 추정 공분산의 의사역행렬입니다. 단순 역행렬과 같은 조건인지도 따로 살핍니다.
마할라노비스 거리와 헷갈리는 용어는 무엇이 다른가요?
표준화와는 열 사이 관계의 처리가 다릅니다
표준화는 열별 평균과 표준편차로 값을 바꿉니다. 그 뒤 유클리드 거리를 재면 열별 분산은 반영하지만 남아 있는 열 사이 상관까지 자동으로 제거하지는 않습니다. 같은 기준 공분산이 대각일 때 연결되는 특수한 경우와 일반적인 경우를 구별합니다.
백색화는 좌표 변환이고 거리는 비교값입니다
데이터 백색화는 공분산을 단위행렬로 만드는 좌표 변환을 다룹니다. 양의 정부호 공분산에 맞는 완전한 백색화를 적용하면 변환 공간의 유클리드 거리가 원래 공간의 마할라노비스 거리와 연결됩니다. 차원을 버리거나 안정화한 경우까지 원래 거리와 항상 같다고 부르지 않습니다.
NCA는 라벨로 거리의 표현을 학습합니다
이웃 성분 분석(NCA)는 클래스 라벨로 선형 변환을 배우는 지도 방법입니다. NCA의 행렬에서 마할라노비스 형태의 이차식을 만들 수 있어도 그 행렬이 경험적 공분산의 역행렬과 같지는 않습니다. 여기서는 공분산 기준의 거리 계산과 추정 품질에 초점을 둡니다.
비교 정리: 표준화는 열별 척도 조정, 백색화는 공분산에 따른 좌표 변환, NCA는 라벨을 활용한 거리 표현 학습입니다. 마할라노비스 거리는 주어진 기준에서 두 벡터의 차이를 하나의 값으로 잽니다.
실전에서는 어디에 쓰이나요?
수치 특징의 이탈 후보를 검토합니다
대표적인 정상 구간을 정할 수 있는 센서·측정 특징에서 중심 대비 거리를 비교합니다. 거리가 큰 사례의 원본, 수집 시각과 장비 상태를 함께 확인합니다. 드문 정상 사례를 자동으로 삭제하면 다음 기준 자료가 더 편향될 수 있으므로 검토 결과를 남깁니다.
공분산 추정 방식의 차이를 비교합니다
scikit-learn의 공식 예제는 같은 오염 자료에서 경험적 공분산과 강건 추정 MCD가 만드는 거리의 차이를 보여 줍니다. 이상치가 기준의 퍼짐을 키우면 이상 사례의 거리가 작아 보일 수 있습니다. 예제의 결과를 모든 데이터에서 MCD가 우수하다는 순위로 옮기지 않고 같은 검증 자료에서 비교합니다.
마할라노비스 거리를 적용할 때 어떤 순서로 확인하나요?
1. 기준 자료와 추정법을 고정합니다
어떤 상태·기간·집단을 기준으로 삼았는지 적고 표본 수와 특징 수를 확인합니다. 경험적 추정, 수축 추정, 강건 추정은 같은 선택이 아닙니다. 같은 자료여도 중심화 방식과 공분산 정규화 규칙이 다르면 거리 크기가 달라질 수 있으므로 계산 설정도 보관합니다.
2. 작은 행렬과 반환 척도를 검산합니다
단위행렬, 대각 공분산과 상관이 있는 공분산을 각각 시험합니다. 같은 점의 거리가 0인지, 고정된 VI에서 두 점의 순서를 바꿔도 같은지 확인합니다. 거리와 제곱 거리의 관계를 시험해 임계값을 잘못 옮기지 않도록 합니다. 행렬의 랭크와 작은 고윳값도 함께 살핍니다.
3. 검증과 운영에서 같은 기준을 재사용합니다
거리로 경보를 나누려면 검증 구간에서 오탐·미탐과 검토량을 확인해 기준을 정합니다. 테스트 결과를 보고 기준을 다시 맞추지 않습니다. 운영에서는 열 순서·전처리·중심·행렬·반환 척도를 함께 고정하고 재학습하면 경보 기준도 다시 평가합니다.
실전 팁: 공분산을 바꾼 실험에서는 임계값 숫자만 같게 둔다고 공정한 비교가 되지는 않습니다. 같은 보류 자료와 오류 비용에서 다시 대조합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 특이행렬을 조용히 넘기지 않습니다. 중복 열이나 표본 부족 때문에 역행렬이 없거나 불안정할 수 있습니다. 수축 추정은 안정화 후보지만 추정 기준을 바꿉니다. 의사역행렬을 쓰면 일부 방향의 차이를 놓쳐 서로 다른 점의 거리가 0이 될 수도 있습니다.
둘째, 강건 추정을 만능으로 보지 않습니다. MinCovDet 공식 문서는 정규분포 자료 또는 단봉형 대칭 분포에서의 사용을 설명하며 다봉형 자료를 대상으로 설계하지 않았다고 밝힙니다. 여러 정상 집단을 한 중심으로 합치면 거리만으로 정상·이상을 잘 나누기 어렵습니다.
셋째, 거리를 확률로 읽지 않습니다. 거리가 3이라는 숫자는 이상일 확률 3%도 신뢰도 점수도 아닙니다. 분포 가정과 추정 오차를 확인하지 않은 채 다른 장비의 경보 임계값을 복사하지 않습니다. 이 글의 예시 숫자는 운영 판정 기준을 제안하지 않습니다.
넷째, 기준 오염과 분포 변화를 구분합니다. 측정 오류가 학습 자료에 섞인 상황과 정상 운영 조건이 실제로 바뀐 상황은 대응이 다릅니다. 큰 거리만 보고 모두 삭제하거나 새 배치마다 공분산을 다시 맞추기보다 수집 상태와 기준 버전을 먼저 조사합니다.
주의: 거리 계산이 정상 종료돼도 기준 자료의 대표성, 공분산의 안정성, 경보의 정확성이 함께 보장되지는 않습니다.
자주 묻는 질문
Q1. 공분산 행렬을 그대로 VI에 넣어도 되나요?
아닙니다. SciPy의 VI는 공분산의 역행렬을 뜻합니다. 각 원소를 따로 뒤집는 계산도 아닙니다. 공분산과 정밀도 행렬을 따로 구분해 저장하고 입력 특징의 순서를 맞춥니다.
Q2. mahalanobis라는 이름이면 언제나 같은 숫자가 나오나요?
아닙니다. SciPy의 두 벡터 함수는 거리를, scikit-learn 공분산 추정기의 메서드는 중심 대비 제곱 거리를 줍니다. 중심·공분산·비교 대상까지 같아야 제곱과 제곱근 관계를 대조합니다.
Q3. 자료가 정규분포여야 거리 자체를 계산하나요?
거리를 정의하는 데 정규분포가 필수인 것은 아닙니다. 다만 공분산의 양의 정부호 조건과 추정 안정성을 확인합니다. 이상 판정이나 특정 추정기의 적합성을 해석할 때는 별도의 분포 가정이 중요합니다.
Q4. 표준화만 한 뒤 유클리드 거리를 쓰면 같나요?
전체 공분산이 대각인 조건에서는 연결되지만 상관이 남은 일반 자료에서는 같지 않습니다. 두 특징 예시처럼 각 열의 분산이 이미 1이어도 함께 변하는 방향에 따라 거리는 달라집니다.
Q5. 테스트 자료까지 넣어 공분산을 구하면 더 정확한가요?
독립 평가를 하려면 테스트 입력이 기준 추정에 들어가지 않도록 나눕니다. cdist의 자동 추정 범위를 확인하고 훈련에서 정한 VI를 명시합니다. 라벨을 쓰지 않았다는 사실만으로 누수가 없어지지는 않습니다.
Q6. 큰 거리의 관측값은 바로 삭제해도 되나요?
바로 삭제하지 않습니다. 오류인지 드문 정상 사례인지 원본과 수집 조건으로 검토합니다. 하나의 타원형 기준으로 설명하기 어려운 집단에서는 기준을 다시 설계하거나 다른 방법과 비교합니다.
출처
마무리
마할라노비스 거리는 특징의 분산과 함께 변하는 방향을 반영해 벡터의 차이를 재는 방법입니다. 중심 대비 이탈을 살피거나 여러 관측값을 비교할 때 쓰며 같은 차이도 기준 공분산에 따라 다른 크기로 읽습니다. 거리 함수와 공분산 추정기는 역할이 다릅니다.
처음 적용한다면 기준 자료와 공분산을 어디서 정했는지부터 확인하세요. VI가 정밀도 행렬인지, 반환값이 거리인지 제곱 거리인지, 작은 고윳값과 이상치가 기준을 흔들지 않는지 차례로 점검합니다. 마지막 판단은 보류 자료의 실제 오류와 원본 검토로 확인합니다.
