Statistics

[선형대수] 벡터의 연산 - norm 놈 노름, Similarity 유사도

eun2ng 2024. 12. 4. 14:49

출처: https://en.wikipedia.org/wiki/Linear_algebra

벡터의 놈과 유사도는 감정분석에서 강도유형을 구분하는 데 핵심적인 역할을 합니다.

놈은 감정의 강도를 나타내며, 문맥에서 감정이 얼마나 강한지 결정하는 데 사용됩니다.

유사도는 감정의 종류(긍정, 부정, 중립)를 분류하는 데 사용됩니다.
이 두 가지를 효과적으로 결합하면 더 정밀하고 강력한 감정분석 모델을 구축할 수 있습니다.

이번 게시물에서는 벡터의 놈과 유사도에 대해서 알아보도록 하겠습니다.

 

Norm 놈, 노름

벡터의 크기(magnitude) 또는 길이(length)를 측정하는 방법입니다.

즉 벡터가 원점에서 얼마나 떨어져있는지를 나타낸다고 볼 수 있습니다.

L(p) 노름의 수식 표현은 다음과 같습니다.

 

 

다음으로는 벡터가 주어졌을 때 벡터 놈을 계산하는 방법입니다.

 

L1-norm 맨해튼 놈(Manhatten norm)

벡터에 포함된 요소의 절대값의 합으로 정의됩니다.

L1-norm은 쉽게 말해 대각선으로 갈 수 없다고 생각하시면 됩니다.L1-norm이 뉴욕, 맨해튼의 격자형 도로망과 유사하다고 해서 맨해튼 놈이라고도 부릅니다.

 

[L1 노름의 수식표현] 

위의 그림과 같이 2차원 평면 위의 벡터 (4,3)을 예시로 든다면 | 4 | + | 3 | 이 L1-norm의 값이 됩니다.

 

L1노름의 값을 구하는 python 코드는 

torch.norm(a, p = 1)

입니다.

 

L2-norm  유클리드 놈(euclidean norm)

벡터에 포함된 요소의 제곱합의 제곱근으로 정의할 수 있습니다.

L2 노름은 유클리드 공간에서 두 점 사이의 최단 거리 구하는 방법과 같기 때문에 유클리드 노름이라고도 부릅니다.

x=[x1,x2, ... xn] 일 때 수식표현은 다음과 같습니다.

또 L2 -norm의 기하학적 표현을 보시면 우리가 익히 알고 있는 피타고라스의 정리로 빗변을 구했던 기억을 떠올리실 수 있습니다.

python으로 L2-norm을 구하는 공식은 

torch.norm(a, p=2)

입니다.

 

L∞ norm

벡터에 포함된 요소의 절대값 중 최대값으로 정의할 수 있습니다.

x=[x1,x2, ... xn] 일 때 수식표현은 다음과 같습니다.

x=[x1,x2]일 때 L∞-norm을 기하학적으로 표현한 것은 다음과 같습니다.

python으로 L -norm을 구하는 공식은

torch.norm(a, p = float(‘inf’))

입니다.

 

노름에 따른 기하학적 의미

출처 : https://towardsdatascience.com/vector-norms-explained-e72bf26e4a38

L1 노름의 경우 거리가 1인 점들의 집합은  |x1| + |x2| = 1 (2차원 기준)인 모든 점입니다.
이를 좌표평면에 그리면, 각 축에 대해 절대값의 합이 일정하므로 사분면마다 직선 형태의 경계가 그려지고, 전체적으로 마름모 모양의 "원"이 형성됩니다

 

노름은 벡터의 길이를 계산하는 방식으로, 우리가 흔히 떠올리는 원형 거리와 같습니다.
노름에서 거리가 1인 점들은 반지름이 1인 원을 형성합니다.

 

노름에서 거리가 1인 점들의 집합은 max(|x1|,|x2|)을 만족하는 모든 점입니다. 이는 각 좌표의 절대값이 최대 1을 넘지 않음을 의미합니다.
2차원에서는 |x1|, |x2| ≤ 1인 점들의 경계가 형성되며, 이는 정사각형 모양의 "원"을 그립니다.

 

Similarity 유사도

유사도란 두 벡터가 얼마나 유사한지에 대한 측정값을 의미합니다. 이러한 유사도는 군집화(Clustering)알고리즘에서 데이터들이 얼마나 유사한지를 판단하는 중요한 기준이 됩니다.

유사도의 값이 1에 가까울 수록 두 벡터가 유사하다고 판단할 수 있습니다.

벡터의 유사도를 측정하는 방법중 가장 중요한 것은 코사인 유사도 입니다.

 

Manhattan Similarity 맨해튼 유사도

두 벡터 사이의 맨해튼 거리를 역수로 변환하여 계산한 값입니다.

맨해튼 거리 값이 작아질수록 맨해튼 유사도의 값은 커집니다.

맨해튼 유사도 = 1 / (1 +  맨해튼 거리) 이므로 우선적으로 맨해튼 거리를 구해야합니다. 

x = [ x1, x2 ] y = [y1, y2] 라는 벡터의 맨해튼 거리는 |x1 - y1| + |x2 - y2| 로 구할 수 있습니다.

유사도를 구할 때 분모에 1을 더해주는 이유는 거리가 0이 되게 되면 분모가 0이 될 수는 없기 때문입니다.

유사도가 1이면 거리가 0인 것이고 즉 두 벡터가 일치한다는 것을 알 수 있습니다.

맨해튼 거리를 구하는 코드 표현

manhattan_distance = torch.norm(b – c, p = 1)

맨해튼 유사도를 구하는 코드 표현

1 / (1 + manhattan_distance)

 

 

Euclidean Similarity 유클리드 유사도

두 벡터 사이의 유클리드 거리를 역수로 변환하여 계산한 값입니다.

맨해튼 유사도와 마찬가지로 유클리드 거리 값이 작아질수록 유클리드 유사도의 값은 커지고 1에 가까울 수록 두 벡터가 유사하다는 것을 알 수 있습니다.

유클리드 거리를 구하는 코드 표현

euclidean_distance = torch.norm(b – c, p = 2)

유클리드 유사도를 구하는 코드 표현

1 / (1 + euclidean_distance)

 

 

Cosine Similarity 코사인 유사도

두 벡터 사이의 각도를 측정하여 유사도를 계산합니다.

벡터가 이루는 각도가 작을 수록(뱡항이 비슷할수록) 유사도가 높습니다.

코사인 유사도는 cosθ 라고 할 수 있는데 우리는 벡터 사이의 각도를 모릅니다.

이 cosθ는 백터의 내적을 통해서 구할 수 있습니다.

분모 : 벡터의 L2노름 크기, 분자 : 벡터의 내적

[벡터의 내적]

내적을 영어로 하면 inner product 로, 내적은 벡터를 수처럼 곱하는 개념입니다.

벡터에는 방향이 있으므로, 방향이 일치하는 만큼만 곱하면 됩니다.

따라서 내적은 한 벡터를 다른 벡터로 정사영 시켜서, 그 벡터의 크기를 곱합니다.

만약 벡터의 방향이 같으면, 두 벡터의 크기를 그냥 곱하면 됩니다.

따라서 벡터의 내적은 다음 공식을 통해 구할 수 있고

이 공식을 정리하면 cosθ는 백터의 내적 / 벡터의 L2 노름 크기 라는 것을 알 수 있습니다.

 

벡터의 내적을 구하려면 각 요소를 곱해서 더하면 됩니다.

x = [x1, x2, ••• xn] y = [y1, y2, ••• yn] 이라는 두 벡터가 있을 때 내적은 각 요소를 곱해서 더해주면 됩니다.

<x , y> = x1 • y1 + x2 • y2 + • • • xn • yn

 

예를들어 [1,2] [2,4] 라는 두 벡터의 코사인 유사도를 구하는 방법은

이고 유사도가 1이므로 벡터의 방향이 일치한다는 것을 알 수 있습니다.