노름(Norm)
벡터 노름 (Vector Norm)
식 1의 벡터 x는 원점에서 n개의 좌표로 지정된 지점($x_1, x_2, \cdots, x_n$)까지 같이 벡터들 사이에서 계산된 거리(D)를 계산한 것으로 norm(노름) 또는 유클리드 거리(Euclidean distance)라 하고 $\Vert{x}\Vert$로 나타냅니다.
\begin{align}x&=\begin{bmatrix}x_1\\x_2\\\vdots\\v_n \end{bmatrix}\\ \text{D}&=\sqrt{(x_1-0)^2+(x_2-0)^2+\cdots+(x_n-0)^2}\\ &=\sqrt{x^Tx} = \Vert {x} \Vert\\ \Leftarrow x^Tx&=\begin{bmatrix}x_1& x_2& \vdots& v_n \end{bmatrix}\begin{bmatrix}x_1\\x_2\\\vdots\\v_n \end{bmatrix}\\&= x_1^2+x_2^2+\cdots+x_n^2\end{align} | (식 1) |
식 1의 xTx는 벡터 x의 전치벡터와의 곱으로 벡터의 내적(inner product)입니다.
유클리드 놈은 때때로 $\Vert{x}\Vert_2$와 같이 아래첨자 2로 작성됩니다. 아래 첨자 2는 x의 요소들의 제곱의 합임을 의미합니다. 벡터의 유클리드 놈은 벡터의 크기(magnitude)를 의미하며 numpy.linalg 모듈의 norm() 함수로 계산할 수 있습니다.
import numpy as np import numpy.linalg as la
x=np.array([2,-1,2]) x_norm=np.sqrt(sum(x**2));x_norm
3.0
la.norm(x)
3.0
유클리드 놈은 크기입니다. 이것은 스칼라의 크기 역시 식 1의 식으로 계산될 수 있으며 결과는 스칼라의 절대값과 같습니다. 벡터와 같은 배열의 노름을 표시하기 위해 이중 막대를 사용하는 것은 스칼라의 크기와 구분하기 위한 것입니다.
크기를 계산하기 위해 기준이 존재해야 하며 식 1은 제로벡터(zero vector)를 기준으로 한 것으로 시점과 종점이 명시된 경우 식 2와 같이 계산됩니다.
\begin{align}a&=\begin{bmatrix}a_1\\a_2\\a_3 \end{bmatrix},\; b= \begin{bmatrix}b_1\\b_2\\b_3 \end{bmatrix} \\ \Vert{\overrightarrow{ba}}\Vert &= \sqrt{(a_1-b-1)^2+(a_2-b_2)^2+(a_3-b_3)^2}\end{align} | (식 2) |
다음은 벡터 a의 놈을 계산한 것입니다. 이 벡터의 시점은 명시되지 않은 경우로 0 벡터([0, 0, 0])가 됩니다.
a=np.array([5, 3, 7]) print(a)
[5 3 7]
la.norm(a).round(2)
9.11
위 코드에서 사용한 .round()
메소드는 지정한 자릿수까지 반올림을 실행합니다.
np.sqrt((5-0)**2+(3-0)**2+(7-0)**2).round(2)
9.11
[노름(Norm)의 특성]
x, y는 벡터, β는 스칼라입니다.
- 스칼라 곱에의한 벡터의 놈: ‖βx‖ = |β|‖x‖
- 두 벡터의 합에 대한 유클리드 놈(Euclidean norm)
- ‖x + y‖ ≤ ‖x‖+‖y‖(삼각부등식)
- ‖x‖ ≥ 0
- x = 0인 경우에만 ‖x‖ = 0
위 특성 1, 3, 그리고 4번은 쉽게 이해 될 수 있는 정의입니다. 특히 3과 4번의 특성은 양의 명확성(positive definitness)이라고 합니다. 2번째 특성의 경우는 삼각부등식이라고 합니다.
Norm of sum
두 벡터 x와 y 합의 노름은 식 3와 같습니다.
$$\Vert{x+y}\Vert=\sqrt{\Vert{x}\Vert^2+2x^Ty+\Vert{y}\Vert}^2$$ | (식 3) |
식 3은 식 4와 같이 유도할 수 있습니다.
‖x + y‖2 | = (x + y)T(x + y) | (식 4) |
= xTx + xTy + yTx +yTy | ||
= ‖x‖2 + 2xTy + ‖y‖2 |
벡터는 1차원 객체이므로 두 벡터의 내적은 식 5와 같이 동일한 인덱스의 요소들의 곱의 합으로 xTy = yTx가 성립합니다.
\begin{align}x&=\begin{bmatrix} x_1\\x_2\end{bmatrix},\; y= \begin{bmatrix}y_1\\y_2 \end{bmatrix}\\ x^Ty&=\begin{bmatrix} x_1& x_2\end{bmatrix}\begin{bmatrix}y_1\\y_2 \end{bmatrix}=x_1y_1+x_2y_2 \\ yTx&=\begin{bmatrix}y_1& y_2 \end{bmatrix}\begin{bmatrix} x_1\\x_2\end{bmatrix}=x_1y_1+x_2y_2\end{align} | (식 5) |
Distance
두 벡터 a와 b의 유클리드 거리는 식 6와 같이 두 벡터 차이에 대한 유클리드 놈으로 정의할 수 있습니다.
dist(a, b) = ‖a - b‖ | (식 6) |
다음 코드들은 벡터 u, v, 그리고 w의 사이의 거리를 numpy.linalg.norm()
함수를 사용하여 계산한 것입니다.
u=np.array([1.8, 2.0, -3.7, 4.7]).reshape(-1,1) v=np.array([0.6, 2.1, 1.9, -1.4]).reshape(-1,1) w=np.array([2.0, 1.9, -4.0, 4.6]).reshape(-1,1) u_v=la.norm(u-v) round(u_v, 3)
8.368
u_w=la.norm(u-w) round(u_w, 3)
0.387
v_w=la.norm(v-w) round(v_w, 3)
8.533
행렬노름(Matrix Norm)
행렬은 1개 이상의 행과 열로 구성된 배열이므로 두 벡터간의 거리를 사용하여 계산되는 벡터노름을 직접적으로 적용할 수 없습니다. 대신에 Ax=b가 성립되는 벡터 x와 그 행렬과의 행렬곱에 의한 결과로 행렬노름을 식 7과 같이 정의합니다.
$$\|A\|=\underset{x \neq 0}{\text{max}}\frac{\|Ax\|}{\|x\|} \Rightarrow \|Ax\| \leq \|A\|\|x\|$$ | (식 7) |
식 Matrix Norm은 1차 노름이며 이를 일반화하기 위해 식 8과 같이 p-norm으로 나타냅니다.
$$\|A\|_p=\underset{x \neq 0}{\text{max}}\frac{\|Ax\|_p}{\|x\|_p} \Rightarrow \|Ax\|_p \leq \|A\|_p\|x\|_p$$ | (식 7) |
행렬 노름 역시 la.norm(객체, ord, axis=None)로 계산할 수 있습니다. 인수 ord는 위 식 Matrix pNorm의 p를 나타내는 것으로서 다양한 옵션이 존재합니다.
a = np.array([[1, 0, -1], [0, 1, 0], [1, 0, 1]]);a
array([[ 1, 0, -1], [ 0, 1, 0], [ 1, 0, 1]])
la.norm(a, 'fro')
2.23606797749979
la.norm(a, axis=0)#축을 지정하면 각 벡터 노름이 계산
array([1.41421356, 1. , 1.41421356])
댓글
댓글 쓰기