캔버라 거리(Canberra Distance)란? AI에서 특징별 상대 차이를 더해 벡터를 비교하는 방법
TL;DR
캔버라 거리는 같은 위치의 두 값 차이를 두 값의 절댓값 합으로 나눈 뒤, 모든 특징의 결과를 더하는 거리입니다. 큰 수치의 절대 차이만 보지 않고 특징마다 상대적인 차이를 비교합니다. 두 값이 모두 0인 항은 0으로 처리하고 한쪽만 0이면 1입니다. 기본 결과는 평균이나 확률이 아니며 작은 잡음·열 수·가중치와 전처리를 함께 확인합니다.[1][5]
핵심 3줄 요약
- 핵심 1
각 특징 안에서 나눈 뒤 더합니다. 전체 차이를 한 번에 나누는 계산과 다르며 작은 값의 변화도 크게 반영될 수 있습니다. - 핵심 2
0과 가까운 값의 해석이 중요합니다. 양쪽 0은 기여가 없지만 0에서 아주 작은 양수로 바뀌어도 그 항은 1입니다. - 핵심 3
합계와 가중치의 기준을 남깁니다. 특징이 여러 개면 거리가 1보다 커질 수 있고 가중치를 두 배로 하면 합계도 두 배가 됩니다.
이 글에서 다룰 내용
- 캔버라 거리의 한 문장 정의
- 세 특징으로 계산하는 상대 차이의 합
- 0 처리·가중치·단위 변환의 작동 원리
- SciPy와 scikit-learn의 입력·반환 형태
- 맨해튼·코사인·마할라노비스 거리와의 차이
- 실전 사용처와 작은 벡터 체크리스트
- 잡음·누락값·중복 특징의 주의점
캔버라 거리를 한 문장으로 정의하면 무엇인가요?
캔버라 거리는 두 벡터의 대응하는 특징마다 절대 차이를 절댓값 합으로 나누고 그 항들을 합산해 차이를 나타내는 거리입니다.
영문명은 Canberra Distance이며 캔베라 거리라고도 표기합니다. 두 입력은 같은 특징을 같은 순서로 담은 수치 벡터입니다. 이름이 비슷한 확률 분포의 거리와 달리 각 열의 값이 직접 짝을 이루며, 좌표 사이에서 확률 질량을 옮기지 않습니다.[1]
한 항은
abs(a - b) / (abs(a) + abs(b))
입니다. 여기서 abs는 절댓값을 뜻합니다. 두 값이 모두 0이면 분모도 0이므로 이 항을 0으로 정합니다. SciPy 공식 문서도 이 규칙을 명시합니다. 음수가 들어오면 분모에 두 값의 합 대신 절댓값의 합을 쓴다는 점도 중요합니다.[1]
한 줄 정리: 특징마다 차이의 비율을 먼저 계산한 뒤 합칩니다. 같은 숫자 차이라도 원래 두 값의 크기에 따라 기여가 달라집니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 AI에 넣을 기록 두 건의 수치 특징을 비교한다고 가정해 보겠습니다. 설명용 벡터는
[1, 10, 0]
과
[2, 20, 5]
입니다. 세 열은 같은 항목끼리 맞춰져 있고 기본 가중치는 모두 1입니다. 실제 서비스 측정이나 분류기의 성능 자료가 아닙니다.
첫 열은 차이 1을 두 값의 합 3으로 나눠
1/3
입니다. 둘째 열은 차이 10을 합 30으로 나누므로 역시
1/3
입니다. 셋째 열은 차이 5를 합 5로 나눠 1입니다. 세 항의 합은
5/3
으로 약 1.6667입니다.
둘째 열의 절대 차이는 첫째 열보다 크지만 두 항은 같습니다. 반대로 셋째 열은 작은 값 하나가 새로 생긴 상황인데 가장 크게 기여합니다. 캔버라 거리가 무엇을 민감하게 보는지 드러나는 예시입니다. 세 항의 평균을 원하면 합계를 다시 3으로 나눈
5/9
이지만 기본 거리 함수가 돌려주는 값은 그 평균이 아닙니다.
한 특징만 비교해도 원리가 보입니다. 1과 2의 항은
1/3
이고 100과 200의 항도
1/3
입니다. 0과
0.000001
은 1인 반면 0과 0은 0입니다. 작은 값이라는 이유만으로 작은 기여를 한다고 예상하면 안 됩니다.
이 글의 분수·0 처리·가중치·단위 변환 예시는 Python 표준 라이브러리 Fraction으로 검산했습니다. SciPy나 scikit-learn 함수를 실행한 결과, 실제 AI의 정확도 비교는 아닙니다. 아래 함수 설명은 접근해 읽은 공식 API와 SciPy 1.18.0 구현을 기준으로 구분합니다.
쉬운 예시: 상대 차이를 보는 선택은 큰 단위의 열이 무조건 지배하는 일을 줄이지만, 0 주변의 미세한 변화를 두드러지게 만들기도 합니다.
왜 AI에서 캔버라 거리가 중요한가요?
특징별 상대 변화라는 비교 기준을 만듭니다
횟수나 양처럼 서로 크기가 다른 수치 특징에서 비율 변화에 주목하는 거리 후보로 검토합니다. 이는 정의를 적용한 활용 예시입니다. 어떤 열에서 두 값이 두 배 차이라는 사실을 비슷하게 반영할지, 원래 단위의 큰 차이를 더 중요하게 볼지 먼저 정해야 거리의 선택을 설명할 수 있습니다.
가까운 사례를 고르는 기준을 점검합니다
같은 입력 표현에서도 거리 기준을 바꾸면 가까운 사례의 순서가 달라질 수 있습니다. scikit-learn DistanceMetric은 canberra 식별자로 이 거리를 제공하며, 한 쌍의 계산과 여러 표본의 쌍별 비교를 연결합니다. 해당 지원이 모든 검색기나 모든 입력 형식의 지원까지 뜻하지는 않습니다.[4]
핵심 인사이트: 거리의 이름보다 어떤 차이에 큰 기여를 주는지 확인하세요. 작은 잡음에 민감한 기준이 실제 분류에서도 좋은 기준인지는 별도 문제입니다.
캔버라 거리는 어떤 순서로 계산하나요?
1. 대응하는 특징과 유효한 값을 맞춥니다
같은 열은 같은 의미와 단위를 사용합니다. 열의 순서가 바뀌거나 한쪽만 단위가 달라지면 다른 항목끼리 나눕니다. 두 일차원 벡터의 길이를 맞추고 NaN·무한값·누락값은 계산 전에 점검합니다. 특징 두 개의 관측값을 넣는 일과 여러 관측의 원자료 목록을 분포로 비교하는 일을 구분합니다.[1]
2. 각 열의 절대 차이를 크기 합으로 나눕니다
양쪽 모두 0이면 0을 놓습니다. 한쪽만 0이고 다른 쪽이 0이 아니면 분자와 분모가 같아 항은 1입니다. 부호가 반대인 0이 아닌 두 값도 절대 차이가 절댓값 합과 같으므로 1입니다. 예를 들어 -1과 1은 1입니다. 이 성질은 공식을 적용해 직접 확인했습니다.
3. 항별 가중치를 곱해 합칩니다
가중치를 쓰지 않으면 각 항을 그대로 더합니다. SciPy 함수에 w를 주면 해당 열의 항에 가중치를 곱한 뒤 합칩니다. 세 특징 예시에서
w=[1, 1, 0]
이면 마지막 항을 빼므로
2/3
입니다.
w=[2, 2, 0]
이면
4/3
입니다. 확인한 구현은 가중치 합으로 나누지 않습니다.[5]
실전 팁: 총거리 옆에 열별 기여를 같이 남기세요. 큰 차이가 한 열의 0 경계 때문인지 여러 열에 퍼진 변화 때문인지 확인하기 쉽습니다.
주요 설정과 반환값은 어떻게 읽나요?
한 쌍의 입력에서는 실수 합계가 나옵니다
scipy.spatial.distance.canberra(u, v, w=None)
는 같은 길이의 일차원 입력 두 개를 비교해 실수를 반환합니다. 기본 가중치는 열마다 1입니다. n개의 유한한 특징을 가중치 없이 비교하면 각 항은 0 이상 1 이하이므로 합계는 0 이상 n 이하입니다. 앞의 1.6667도 오류나 166.67% 확률이 아닙니다.[1]
w는 관측별 비중이 아닌 특징별 비중입니다
SciPy 문서의 w는 벡터의 각 위치에 적용합니다. 각 표본에 주는 학습 가중치나 분포 전체의 확률과 다른 축입니다. 확인한 1.18.0 구현은 음수 가중치를 거부합니다. 입력 길이와 유한성도 별도로 맞추고, 자동 정규화를 기대하지 않습니다.[1][5]
가중치 0인 열은 비교에서 빠지므로 그 열만 다른 두 벡터도 거리 0이 나올 수 있습니다. 모든 가중치가 0이면 유용한 비교 정보가 없습니다. 작은 값을 무조건 지우기보다 어떤 특징을 제외했고 왜 제외했는지 기록합니다. 다른 라이브러리에 SciPy의 w 옵션이 그대로 있다고 가정하지 않습니다.
pdist는 정사각 행렬을 바로 반환하지 않습니다
pdist(X, metric="canberra")
는 행을 관측, 열을 특징으로 받습니다. 같은 자료 안에서 서로 다른 행의 쌍을 한 번씩 계산하고 압축된 일차원 배열을 반환합니다. 관측 3개의 쌍은 세 개입니다. 대각선과 대칭 부분을 포함한 정사각형 행렬이 필요하면 squareform 같은 변환을 따로 확인합니다.[2]
cdist는 두 자료 묶음의 교차 행렬을 만듭니다
cdist(XA, XB, metric="canberra")
의 결과는 XA의 행 수와 XB의 행 수에 대응하는 이차원 거리 행렬입니다. 예를 들어 세 관측과 두 관측을 비교하면
(3, 2)
모양입니다. 양쪽의 열 수는 같아야 합니다. 표본이 늘면 쌍별 결과를 저장하는 부담도 함께 커집니다.[3]
DistanceMetric.get_metric("canberra")
로 얻은 scikit-learn 객체도 pairwise로 표본 간 거리 행렬을 계산하는 인터페이스입니다. 반환값이 자동으로 가장 가까운 이웃 번호나 클래스 예측으로 바뀌는 것은 아닙니다. 행·열에 대응하는 원래 기록 ID를 함께 보관합니다.[4]
캔버라 거리와 헷갈리는 용어는 무엇이 다른가요?
맨해튼 거리는 나누기 전 절대 차이를 더합니다
맨해튼 거리는 각 열의 절대 차이를 더합니다. 캔버라는 열마다 두 값의 절댓값 합으로 나누는 단계가 있습니다. 같은 단위의 오차가 중요한 문제와 상대 변화가 중요한 문제는 다른 선택을 할 수 있습니다. scikit-learn 공식 거리 표에서도 두 계산을 별도 항목으로 제시합니다.[4]
코사인 유사도는 벡터의 방향을 봅니다
코사인 유사도는 두 벡터의 방향을 비교합니다. 양수 벡터
[1, 2]
와
[2, 4]
는 방향이 같지만 캔버라 거리는 각 열의
1/3
을 더한
2/3
입니다. 한쪽 벡터 전체만 두 배로 만든 변화가 캔버라에서 없어지는 것은 아닙니다.
마할라노비스 거리는 특징 사이 관계를 반영합니다
마할라노비스 거리는 공분산의 역행렬로 함께 변하는 방향을 반영합니다. 캔버라는 각 열의 상대 차이를 계산해 합치며 공분산을 추정하지 않습니다. 서로 관련된 특징을 중복해서 넣으면 같은 정보의 기여가 반복될 수 있으므로 입력 설계도 따로 검토합니다.[4][5]
비교 정리: 맨해튼은 절대 차이의 합, 캔버라는 열별 비율의 합입니다. 코사인은 방향을 보고 마할라노비스는 정한 공분산 기준에서 차이를 잽니다.
실전에서는 어디에 쓰이나요?
수치 특징의 이웃 후보를 비교합니다
K-최근접 이웃처럼 가까운 사례를 참고하는 실험에서 거리 후보로 검토합니다. 이 글의 응용 제안이며 정확도 개선을 측정한 결과는 아닙니다. 지원하는 계산 경로를 확인한 뒤 같은 데이터 분할과 특징으로 다른 거리의 이웃 목록·오류를 비교합니다.
집계 벡터의 어떤 항목이 달라졌는지 살핍니다
같은 항목 목록으로 만든 횟수 벡터를 비교하고 열별 기여를 읽는 분석을 설계할 수 있습니다. 작은 항목의 등장·소멸이 강조되므로 원래 건수도 함께 봅니다. 서로 다른 전체 건수를 비율로 바꿀지 원래 횟수로 비교할지는 별도 결정이며 거리 함수가 대신 정하지 않습니다.
캔버라 거리를 적용할 때 어떤 순서로 확인하나요?
1. 입력과 전처리 정책을 고정합니다
열 이름·순서·단위·관측 정의를 적습니다. 0이 실제 부재인지 아직 수집하지 않은 값인지 구별합니다. 동일 열의 양쪽 값에 같은 0이 아닌 배율을 곱하면 그 항의 배율은 상쇄됩니다. 예를 들어 첫 열만 1·2에서 1,000·2,000으로 바꿔도 세 특징의 총거리는 같습니다. 이 조건을 한쪽만 바꾸는 경우와 혼동하지 않습니다.
2. 작은 벡터와 반환 형태를 검산합니다
같은 벡터, 양쪽 0, 한쪽 0, 반대 부호와 가중치 0을 시험합니다. 합과 평균도 구분합니다. 관측 세 개를 쌍별 비교하면 압축 배열의 길이가 3인지, 두 묶음을 비교하면 행렬 축이 원래 관측 순서와 맞는지 확인합니다. 이 글의 압축 순서·행렬 모양 예시는 별도의 표준 라이브러리 산술로 점검했습니다.
3. 최종 업무 오류와 계산 부담을 평가합니다
거리만 낮추는 대신 같은 보류 자료에서 오탐·미탐과 이웃의 실제 의미를 살핍니다. 특징 선택이나 전처리를 조정할 때 테스트 자료를 기준 추정에 섞지 않습니다. 자료가 커지면 모든 쌍을 저장하기 전 작은 묶음에서 시간·메모리를 측정하고 결과와 설정을 함께 보관합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 0 근처의 잡음을 큰 업무 변화로 단정하지 않습니다. 0에서 아주 작은 값으로 바뀌면 한 항이 1이 됩니다. 장비의 측정 한계·수집 오류·실제 등장 여부를 구분합니다. 분모에 임의의 작은 값을 더하면 원래 공식과 다른 계산이므로 변경 근거와 영향을 따로 검증합니다.
둘째, 평균 제거와 행별 정규화를 단순 단위 변환으로 보지 않습니다. 1·2를 101·102로 함께 옮기면 항은
1/3
에서
1/203
으로 바뀝니다. 각 행을 자기 합으로 나누는 변환도 상대 차이를 바꿉니다. 앞의
[1, 2]
와
[2, 4]
를 각각 합 1로 만들면 같은 벡터가 되어 거리는 0입니다.
셋째, 특징 수가 다른 합계를 그대로 비교하지 않습니다. 새 열을 추가하거나 관련 열을 복제하면 거리의 기준도 달라집니다. 평균을 별도로 쓰더라도 0인 열의 추가가 분모를 바꿀 수 있습니다. 열 목록과 가중치 합을 결과 옆에 남기고 합격선을 임의로 옮기지 않습니다.
넷째, 정상 반환을 결측 처리의 증거로 보지 않습니다. 확인한 SciPy 구현은 마지막 합산에 nansum을 사용합니다. 그렇다고 누락값을 안전하게 처리하는 전용 거리라는 뜻은 아닙니다. 유한한 수치만 들어오는지 먼저 검사하고 결측 정책은 독립적으로 설계합니다.[5]
주의: 거리의 수치가 나왔다는 사실만으로 비교할 입력이 적절하거나 AI의 예측이 정확하다고 판정하지 않습니다. 원래 기록·열별 기여·업무 오류를 함께 확인합니다.
자주 묻는 질문
Q1. 캔버라 거리는 항상 0과 1 사이인가요?
아닙니다. 기본은 열별 항의 합입니다. 유한한 n개 특징의 가중치 없는 결과는 0부터 n까지이며 세 특징 예시도 1보다 컸습니다. 합계를 확률로 읽지 않습니다.
Q2. 양쪽 값이 모두 0이면 오류가 나나요?
공식 정의의 관례와 SciPy 문서에서는 그 항을 0으로 둡니다. 한쪽만 0이고 다른 쪽이 0이 아니면 항은 1입니다. 모든 열이 양쪽 0인 벡터끼리의 기본 거리는 0입니다.[1]
Q3. 작은 숫자의 차이는 항상 작게 반영되나요?
아닙니다. 값의 절대 크기보다 두 값의 차이와 크기 합의 비를 봅니다. 0과 아주 작은 양수도 한 항이 1입니다. 잡음과 실제 부재를 구별해 입력을 정합니다.
Q4. 가중치를 넣으면 자동으로 합이 1이 되나요?
확인한 SciPy 함수는 열별 항에 w를 곱해 더하고 가중치 합으로 나누지 않습니다. 모든 가중치를 같은 양수 배율로 바꾸면 결과도 그 배율로 바뀝니다.[5]
Q5. 단위가 달라도 전처리를 신경 쓰지 않아도 되나요?
같은 열의 양쪽에 같은 곱셈 배율을 적용할 때만 그 항이 그대로입니다. 한쪽 단위 변경, 평균을 빼는 이동, 서로 다른 행별 정규화는 다른 변환입니다. 0의 의미와 열의 대응도 확인합니다.
Q6. 캔버라 거리를 쓰면 분류가 더 정확해지나요?
보장하지 않습니다. 상대 차이에 민감한 선택이 데이터와 업무에 맞는지 보류 자료의 실제 오류로 비교합니다. 거리 행렬을 계산한 성공과 좋은 이웃·정확한 분류를 얻은 성공은 구분합니다.
출처
마무리
캔버라 거리는 각 특징의 차이를 두 값의 크기 합으로 나누고 더하는 방법입니다. 큰 열의 절대 차이가 그대로 지배하지 않지만 0 주변 변화에는 민감합니다. 기본 합계·열별 가중치·여러 관측의 반환 축을 구분하면 숫자를 잘못 읽는 일을 줄입니다.
처음에는 세 특징 예시와 양쪽 0부터 확인해 보세요. 실제 AI 자료에서는 열의 의미와 전처리를 고정하고 원래 건수와 열별 기여를 보관합니다. 거리 계산이 맞는지 확인한 다음 실제 이웃과 업무 오류로 그 기준이 유용한지 평가합니다.
