벡터로 표현된 두 개의 데이터를 비교할 때, 비슷한/유사한 정도를 나타내는 용어로 유사도(similarity)와 거리(distance)가 있습니다. 그런데 “두 데이터의 유사도는 어떤가? 거리는 얼마인가?”처럼 이 둘을 혼용해서 많이 사용합니다. 두 용어는 어떠한 차이가 있을까요?


일반적인 단어의 의미를 보면 ‘유사도’와 ‘거리’가 밀접한 관계를 가지는 것을 알 수 있다. “거리가 클수록, 유사성이 떨어진다.” 라는 표현으로 이 둘의 관계를 연결할 수 있다. 비교한다는 성격은 같으나, 측량하는 관점에서는 서로 반대의 개념이다. 그럼 반대 관계만 있는 것일까?

도메인 용어 관점의 정의로 접근해보자. 유사도와 거리를 측정하는 용어를 각각 유사도 함수[6], 거리 함수[7]라고 한다. 위키에 해당 용어에 대한 자세한 설명이 있지만, 이 둘의 차이를 이해하기 쉽지 않다.

이제 수학적인 정의로 살펴보자. 유사도 함수, s(X,Y)는 실수값을 출력하는 함수이고 다른 특별한 정의는 없다. 반면에 거리 함수, d(X,Y)는 다음과 같은 수학적인 특징을 가진다.

  • d(X,Y) \ge 0 (positivity)
  • d(X,Y) = 0 \Leftrightarrow x = y (identity-discerning)
  • d(X,Y) = d(Y,X) (symmetry)
  • d(X,Y) \le d(X,Z) + d(Z,Y) (triangle inequality)

위의 사실만 보면 유사도 함수가 더 일반적(general)이다고 볼 수 있다. 유사도 함수가 위의 조건을 모두 만족한다면 거리 함수와 완벽히 혼용해서 사용할 수 있다.

반대라는 의미와 identity-discerning 공리를 고려하여 유사도 함수와 거리 함수의 관계를 다음과 같이 정의할 수 있다. 단, 유사도 함수의 출력값은 [0, 1] 범위에 있어야 한다.

d(X,Y) = 1 - s(X,Y)

그렇다면 모든 유사도 함수가 위의 거리 함수의 공리(axiom)를 만족할까? 정말 수학적인 정의와 함께 이 둘이 서로 같아질 수 있을까?

가장 많이 사용하는 코사인 유사도(cosine similarity)를 살펴보자. 코사인 유사도의 식은 다음과 같다. 두 벡터 사이의 각(angle)으로 유사성을 측정한다.

s_{cos}(X,Y) = cos(\theta) = \displaystyle {X \cdot Y \over { \left\lVert X \right\rVert \left\lVert Y \right\rVert }}

코사인 함수는 [0,1]에 항상 매핑되므로 다음과 같이 거리 함수인 코사인 거리(cosine distance)로 변환할 수 있다.

d_{cos}(X,Y) = 1 - cos(\theta)

변환된 d_{cos}(X,Y) 함수를 위에서 정의한 거리 함수, d(X,Y)라 할 수 있을까?

그렇지 않다. 삼각 부등식(triangle inequality) 공리를 만족하지 못하기 때문이다. 이에 대한 수학적 증명은 [3]을 참고하길 바란다. 즉, 겉모습만 거리 함수 이름을 달고 있는 셈이다(예: scikit-learn에서 cosine distance 함수를 제공한다)

많은 유사도 함수의 경우 삼각 부등식 공리를 만족하지 못한다. 삼각 부등식 공리가 거리 함수의 정체성이기도 하다. 다음은 삼각 부등식의 예시를 나타내는 그림[8]이다.

직관적으로 보면, d(X,Y)의 출력값에 크기와 방향이 있는 벡터 정보가 숨어 있다고 볼 수 있고, d_{cos}(X,Y)는 동일한 스칼라 출력값이지만 이러한 정보가 없다고 생각할 수 있다.

대표적인 거리 함수인 유클리디안(euclidean), 맨하탄(manhattan), 최대(maximum (or) chebyshev) 거리는 다음과 같은 벡터 정보를 담고 있다[1]. 사실, 거리라는 이름에서 이러한 정보가 있는 것을 대략적으로 유추할 수 있다.

참고로 다음은 위의 3가지 거리 함수를 모두 표현할 수 있는 민코프스키 거리(minkowski distance)이다. 이는 대표적인 거리 함수 공식이지만, 단순히 공식과 특징을 보고 거리 함수인지 아닌지 판별하기는 어렵다.

d_{mski}(X,Y)=\left(\sum_{i=1}^n |x_i-y_i|^p\right)^\frac{1}{p}

다른 유사도 함수로 자카드(jaccard)를 알아보자. 자카드도 코사인과 같이 [0, 1]로 매핑되므로 (1 – 유사도)로 자카드 거리를 나타낼 수 있다.

s_{jacd}(X,Y) = \displaystyle {{|X \cap Y|}\over{|X \cup Y|}} = {{|X \cap Y|}\over{|X| + |Y| - |X \cap Y|}}

d_{jacd}(X,Y) = 1 - s_{jacd}(X,Y)

식을 보면 자카드는 집합 연산으로 정의된 것을 알 수 있다. 그럼에도 불구하고 자카드 거리는 삼각 부등식 조건을 만족한다. 증명은 [4]를 참고하길 바란다. 표현 방식의 차이일 뿐 내부적으로 수학 성질들은 거리 함수 요건을 만족한다.

정리하면, 특정 함수에 따라 유사도 함수와 거리 함수는 내부 성질까지 같을 수도 있고 다를 수도 있다. 예를 들어, 코사인 유사도는 거리 함수와 같은 부호를 가질 수 있지만 특성까지 같을 순 없다. 반면, 자카드 유사도는 완전한 보완 관계가 되면서 유사도와 거리 함수를 자유롭게 넘나들 수 있다.

코사인 유사도와 유클리디안 거리는 비슷한 정도를 측정하는 방법에 큰 차이가 있다. 이 차이가 위에서 알아본 수학적인 성질 차이와 직결된다. 다음 그림[5]을 보면. 유사한 이웃이 서로 확연히 다름을 알 수 있다. 따라서, 데이터와 도메인 특성에 맞게 측정 함수를 잘 선택해야 한다.


거리와 유사도 자체는 비슷한 의미를 가지지만 이를 측정하는 거리와 유사도 함수는 서로 다릅니다. 거리 함수는 수학적 정의를 가지고, 유사도 함수는 없기에, 거리 함수만의 고유한 특징이 있습니다. 단순히 유사도 함수의 역을 취해 거리 함수라 하기도 합니다(예[10]: Cosine distance is defined as 1.0 minus the cosine similarity). 하지만, 수학적 성질을 갖는 진짜 거리 함수인지는 따져봐야 합니다.

따라서, 거리와 유사도 함수를 구별하는 일은 중요하지 않고, 측정법(ex. cosine, jaccard, euclidean, …)의 특성을 충분히 이해하는 것이 중요합니다. 사실, 측정법을 이해하는 과정에서 거리와 유사도 함수의 차이를 이해하는 부분이 포함되어 있습니다.


Reference

  1. Journocode – Similarity and distance in data: Part 1
  2. Quara – What’s the difference between similarity measure and distance measure?
  3. StackExchange – Proving that cosine distance function defined by cosine similarity between two unit vectors does not satisfy triangle inequality
  4. Paper – A note on the triangle inequality for the Jaccard distance
  5. Sasi Nagella – Cosine Similarity Vs Euclidean Distance
  6. Wikipedia – Similarity measure
  7. Wikipedia – Metric (mathematics)
  8. Wikipedia – Triangle inequality
  9. Wikipedia – Euclidean vector
  10. Scikit-learn – sklearn.metrics.pairwise.cosine_distances