- 거리란?
두 기준점이 서로 얼마나 떨어져있는지에 대한 수치입니다.
물리적으로는, 공간상 두 기준점의 떨어진 정도이고,
분류문제로 본다면,
어떠한 특징을 지닌 데이터(변수가 한개 이상의 다변량 데이터)가, 속하고자하는 데이터군에 얼마나 근접한지를 나타내는 지표가 됩니다.
- 대표적으로는 유클리디언 거리가 있습니다.
sqrt(sum((X-X`)^2))
으로, X데이터에서 X`에의 거리를, 각 특징들을 서로 빼준 값을 제곱하고, 그 값들을 전부 더한 후 루트를 씌운 값입니다.
쉽게 말하자면, 피타고라스의 정리에 따라 좌표평면의 두 점의 거리를 구하는 공식을 생각하시면 됩니다.
다변량 데이터에도 사용할수 있으며,
각 특징별 수치 데이터의 차이값을 제곱하고 모두 더하여 루트한 것이란 걸 다시 설명합니다.
- 유클리디언 거리는 매우 간단하고 효율적으로 거리를 파악할수 있기에 많이 사용되기는 하지만,
물리적 거리가 아닌 정보간의 거리를 나타내는데는 그다지 좋지 않습니다.
가장 대표적으로는,
사이즈 단위에 따라 결과값이 매우 민감하게 달라집니다.
같은 의미를 지녔다고 하더라도, 0.1단위의 데이터와 10000단위의 데이터로 사이즈만 교체하더라도, 서로 다른 거리가 나옵니다.
예를들어, 같은 의미를 지녔지만, km단위를 cm로 바꾼다던지, 화폐 단위를 바꾼다던지 하는 것으로, 결과값이 달라집니다.
이것에 대해서는, 데이터에,
(x-평균) / 분산
을 하여 standardization을 하면 해결이 됩니다.
하지만, 이는 모든 컬럼의 의미가 같을 때에, 사이즈를 맞춰주는 것일 뿐입니다.
거리라는 의미를 지닌 특징만 존재하는 데이터 공간에서, 그 거리를 측정하는 방식일 뿐이죠.
다변량 데이터의 경우에는, 거리 개념이 있을수도 있고, 화폐 가치, 통행량...
정말 여러가지 의미를 지닌 특징들이 하나로 뭉쳐서 한개의 데이터를 구성하고 있으니, 그저 동일한 기준에서 거리를 측정하는 방식으로는, 어느 데이터가 어느 데이터군에 가까운지와 같은 분류의 기준이 되는 의미의 거리를 측정하지 못합니다.
결과적으로 어디에 포함되게 된다는 분류 문제에서, 모든 특징이 같은 가중치를 가지는 것은 아닙니다.
무슨 말이냐면, A라는 클래스에 속하게 됨을 알아보기 위한 기준으로 특징 x1, x2, x3... 가 있을 때,
x1가 A에 속하는 매우 중요한 특징이고, 나머지는 정말 아주아주 미세한 영향력만을 가지는데,
이를 모두 동일한 방식으로 유클리디언 거리를 구하면,
x1- x1`가 10인 사람보다,
x2-x2` 가 8인 사람이 더 관련이 높고, 즉 거리가 가깝다고 나올 것입니다.
(특징별 가중치에 대한 것은, 인공신경망쪽 설명에 부합되지만, 일단 유클리디언이 이걸 해결하지 못한다는 설명으로 붙였습니다.)
뿐만 아니라, 현실적인 데이터 분포는 위와 비슷하게, 각 특징별 상호관계를 가질텐데,
바로 이 특징별 상호관계에 대한 개념을 추가시킨 거리 개념이 마할라노비스 거리입니다.(서로 상관관계가 있는 두 변수간의 거리를 측정하기 위한 방법)
여기까지 요약하자면, x축 y축이 모두 좌표평면상 거리의 개념으로 된 공간에서는 유클리디언 거리가 잘 동작하지만,
일반적인 다변량 데이터에서 두 데이터간 제대로된 거리를 파악하기 위해서는, 각 특징별 상관관계를 고려해야 한다는 것입니다.
- 마할라노비스는,
서로 다른 의미를 지닌 특징간의 상관관계에 따라 거리를 조정하기 위하여,
공분산 행렬(Covariance matrix)이라는 개념을 사용했습니다.
공분산이란, 두 특징간에서 나타나는 데이터의 방향성과 상관도를 나타낸 것으로,
COV(x,y) = E{(x-E(x)){(y-E(y))}
이렇게 구하며,
Cov(X, Y) > 0 X가 증가 할 때 Y도 증가한다.(같은 방향)
Cov(X, Y) < 0 X가 증가 할 때 Y는 감소한다.(다른 방향)
Cov(X, Y) = 0
공분산이 0이라면 두 변수간에는 (선형적인) 상관관계가 없으며 두 변수는 서로 독립적인 관계에 있음을 알 수 있습니다.
그러나 두 변수가 독립적이라면 공분산은 0이 되지만, 공분산이 0이라고 해서 항상 독립적이라고 할 수 없습니다.(방향성 없음)
위와 같은 것으로 데이터의 방향성을 알수 있고,
공분산의 절대값이 커질수록, 두 데이터간에는 뚜렷한 상관관계가 존재한다는 것을 나타내줍니다.
(자세한 것은 https://wiserloner.tistory.com/1085)
공분산 행렬은, 이러한 공분산을 행렬화한 것으로,
다변량 데이터에서, 특징들 사이의 공분산을 모두 구한 것입니다.
x1 | x2 | x3x | |
x1 | Var(x1) | Cov(x1, x2) | Cov(x1,x3) |
x2 | Cov(x2, x1) | Var(x2) | Cov(x2, x3) |
x3 | Cov(x3, x1) | Cov(x3, x2) | Var(x3) |
보시다시피 각 특징별 공분산을 구한 행렬로,
각 특징의 방향과 상관정도를 파악할수 있는 수치가 들어있습니다.
특이점을 보시면, x1과 x1, x2와 x2... 이렇게, 동일한 변수라면, 결국 공분산이 아니라 분산을 구하는 것과 같다는 것이네요.
- 마할라노비스 거리 공식은,
sqrt((x-m).T * C^-1 * (x-m))
입니다.
x는 데이터, m은 각 특징들의 평균,
T를 하는 것은 dot product를 하기 위해 transpose를 하는 것이고,
C의 경우엔 공분산으로,
역수를 취한 것이죠.
이를 보았을 때, 가장 먼저 눈에 들어오는 것은, x-m 부분입니다.
C부분이 단위행렬이라면,
위 공식의 값은 그저 유클리디언 거리 공식과 같습니다.(평균값과의 거리)
체가 참고한 출처 블로그에서 공식에 대한 해석이 있었는데,
So, how to understand the above formula?
Let’s take the (x – m)^T . C^(-1) term.
(x – m) is essentially the distance of the vector from the mean. We then divide this by the covariance matrix (or multiply by the inverse of the covariance matrix).
If you think about it, this is essentially a multivariate equivalent of the regular standardization (z = (x – mu)/sigma). That is, z = (x vector) – (mean vector) / (covariance matrix).
So, What is the effect of dividing by the covariance?
If the variables in your dataset are strongly correlated, then, the covariance will be high. Dividing by a large covariance will effectively reduce the distance.
Likewise, if the X’s are not correlated, then the covariance is not high and the distance is not reduced much.
So effectively, it addresses both the problems of scale as well as the correlation of the variables that we talked about in the introduction.
즉, x에 m값을 빼주는 이유는, standardization을 위한 것이고,
나눠주는 분산의 경우는 위에서 구한 공분산으로 사용합니다.
cov값의 역수를 곱해주는 것이 행렬계산에서 그러한 역할을 하며,(역수의 곱은 나눗셈)
즉, 공분산이 클수록, 해당 특징의 상관관계가 높을수록, x와 평균 사이의 거리가 작게 나오고,
상관관계가 작을수록, 거리가 크게 나온다는 것입니다.
- 이렇듯, 마할라노비스 거리는, 유클리디언의 거리 개념을 가져오면서, 스케일의 차이와 변수간 의미의 차이 역시 해결해주는 좋은 개념입니다.
- 마할라노비스 거리 측정 파이썬 코드
def mahalanobis(x=None, data=None, cov=None):
"""Compute the Mahalanobis Distance between each row of x and the data
x : vector or matrix of data with, say, p columns.
data : ndarray of the distribution from which Mahalanobis distance of each observation of x is to be computed.
cov : covariance matrix (p x p) of the distribution. If None, will be computed from data.
"""
x_minus_mu = x - np.mean(data)
if not cov:
cov = np.cov(data.values.T)
inv_covmat = sp.linalg.inv(cov)
left_term = np.dot(x_minus_mu, inv_covmat)
mahal = np.dot(left_term, x_minus_mu.T)
return mahal.diagonal()
df_x = df[['carat', 'depth', 'price']].head(500)
df_x['mahala'] = mahalanobis(x=df_x, data=df[['carat', 'depth', 'price']])
df_x.head()
데이터셋과, 해당 데이터셋으로 거리를 구할 x값을 넣어줍니다.
보이듯, 데이터셋의 평균과 x의 차이를 구하고,
넘파이에서 제공하는 공분산 함수를 이용해서 공분산 행렬을 구합니다.
inverse를 한 후,
공식대로 차이값과 공분산 역행렬을 곱합니다.
다시 차이값의 transpose값을 곱해주면, 마할라노비스 거리를 출력할수 있습니다.
- https://www.youtube.com/watch?v=spNpfmWZBmg&t=147s,
https://www.machinelearningplus.com/statistics/mahalanobis-distance/등을 참고했습니다.
'Study > Data Science' 카테고리의 다른 글
고차원 데이터에서 차원의 저주란? (딥러닝 학습시 데이터 특징을 제한하는 이유와 빅데이터 기술의 중요성) (구 블로그 글 복구) (0) | 2025.04.10 |
---|---|
정보이론 기초 정리(정보량 + 정보 엔트로피) (구 블로그 글 복구) (0) | 2025.04.09 |
딥러닝 Optimizer 종류 정리 (1) | 2025.04.09 |
데이터 사이언스 실습을 위한 개발 환경 준비(Python, Anaconda, CUDA, Torch) (0) | 2025.04.02 |
최대 우도 추정법(MLE : Maximum Likelihood Estimation)이란? (0) | 2024.10.14 |