1 벡터

벡터(Vector)는 수학적으로 크기와 방향을 갖는 물리량을 의미하며, 컴퓨터 과학에서는 숫자 형태의 자료 배열을 의미합니다.

1.1 행벡터와 열벡터

행벡터는 $n$개의 개수를 가진 숫자 자료를 행(Row)방향으로 배열한 것으로, $1 \times n$의 크기를 가지며 아래와 같이 표현됩니다.

$$\begin{bmatrix} 3 & 4 & 5 & 6 \end{bmatrix} \begin{bmatrix} x_{1} & x_{2} & \cdots & x_{n} \end{bmatrix}$$

열벡터는 $m$개의 개수를 가진 숫자 자료를 열(Column)방향으로 배열한 것으로, $m \times 1$의 크기를 가지며 아래와 같이 표현됩니다.

$$\begin{bmatrix} 3 \\ 4 \\ 5 \\ 6 \end{bmatrix} \begin{bmatrix} x_{1} \\ x_{2} \\ \vdots \\ x_{m} \\ \end{bmatrix} $$

행벡터와 열벡터는 Python 코드로 다음과 같이 구현할 수 있습니다:

NumPy에서 행 벡터는 1차원 배열로 표현되고, 열 벡터는 단일 열이 있는 2차원 배열로 표현됩니다. 이는 NumPy의 배열에 행 우선 순위를 사용하기 때문이고, 내적과 행렬 연산에서 벡터의 방향(행 또는 열)이 계산 결과에 큰 영향을 미치기 때문에 행과 열을 명시적으로 구분하기 위해서입니다.

2 행렬

행렬(Matrix)은 숫자 혹은 다항식을 직사각형 모양으로 배열한 것으로, $m$개의 행과 $n$개의 열로 이루어진 $m\times n$크기의 행렬이라고 하며, 행렬의 각 값들을 성분이라고 합니다.

$$\begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} \begin{bmatrix} 5 & 6 & 7 & 8 \\ 9 & 10 & 11 & 12 \\ 13 & 14 & 15 & 16 \\ 17 & 18 & 19 & 20 \end{bmatrix} \begin{bmatrix} x_{1,1} & x_{1,2} & \cdots & x_{1,n} \\ x_{2,1} & x_{2,2} & \cdots & x_{2, n}\\ \vdots & \vdots & \ddots & \vdots \\ x_{m,1} & x_{m,2} & \cdots & x_{m,n} \\ \end{bmatrix}$$

2.1 행렬의 곱셈

행렬의 곱셈은 앞 행렬의 열의 수와 뒷 행렬의 행의 수가 같을 때 연산된다. 즉, 앞 행렬의 크기가 $m \times k$이고 뒷 행렬의 크기가 $k \times n$일 경우 연산되며, 연산 결과 나오는 행렬의 크기는 $m \times n$이 됩니다.

[그림 1] 행렬곱

 

행렬의 곱셈은 앞 행렬의 각 행의 성분들을 뒷 행렬의 해당 열의 성분들과 순서대로 곱하고, 이 곱한 값들을 모두 더합니다. 이렇게 계산된 값은 결과 행렬의 해당 위치에 들어갑니다.

 

행렬 $A$의 크기가 $3 \times 2$이고, 행렬 $B$의 크기가 $2 \times 2$일 때,

$$A = \left[\begin{matrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{matrix}\right] \quad B = \left[\begin{matrix} 7 & 8 \\ 9 & 10 \end{matrix}\right]$$

 

두 행렬의 곱 $AB$는 $3 \times 2$ 크기의 행렬이 됩니다.

$$AB = \left[\begin{matrix} (1\times7) + (2\times9) & (1\times8) + (2\times10) \\ (3\times7) + (4\times9) & (3\times8) + (4\times10) \\ (5\times7) + (6\times9) & (5\times8) + (6\times10) \end{matrix}\right] = \left[\begin{matrix} 25 & 28 \\ 57 & 64 \\ 89 & 100 \end{matrix}\right]$$

 

위 행렬 연산을 Python 코드로 구현하면 다음과 같습니다:

NumPy 라이브러의 두 행렬 사이의 행렬 곱셈을 수행하는 matmul() 함수에 두 행렬 A, B를 인자로 전달하여 행렬곱 연산을 수행합니다. 또한 @ 연산자를 사용하여 행렬 곱셈을 수행할 수 있는데, A @ B를 작성하면 numpy.matmul(A, B)와 동일한 결과를 얻을 수 있습니다.

2.1.1 행렬의 곱셈에서 교환법칙은 성립하지 않는다

위의 두 행렬 $A, B$의 곱 $AB$는 $BA$와 같을까? 정답은 $AB \neq BA$, 같지 않다 이다.

$BA$의 경우 앞 행렬이 $2 \times \textcolor{red}{2}$, 뒷 행렬이 $\textcolor{red}{3} \times 2$으로 행렬 곱셈이 불가능하다.

 

만약, 두 행렬 $A,B$가 같은 크기를 가지는 경우에는 교환법칙이 가능할까? 정답은 그렇지 않다 이다.

$A$와 $B$를 같은 크기의 행렬로 만들어 이를 증명해보자.

 

$$A = \left[\begin{matrix} 1 & 2 \\ 3 & 4 \end{matrix}\right] \quad B = \left[\begin{matrix} 5 & 6 \\ 7 & 8 \end{matrix}\right]$$

$$AB = \left[\begin{matrix} 19 & 22 \\ 43 & 50 \end{matrix}\right] \quad B = \left[\begin{matrix} 23 & 34 \\ 31 & 46 \end{matrix}\right]$$

 

$AB \neq BA$ 즉, 교환법칙은 성립하지 않는 것을 알 수 있다.

2.2 연립 일차방정식과 행렬의 연관성

연립 일차방정식은 행렬의 연산으로 나타낼 수 있습니다. 아래와 같이 연립 일차방정식이 있을 때,

$$\begin{align*} 2x + 3y &= 3 \\ 8x + 5y &= 5 \end{align*}$$

이를 행렬의 연산으로 나타내면 아래와 같으며, 첫 번째 행렬은 계수, 두 번째 벡터는 미지수, 세 번째 벡터는 상수 항을 나타냅니다.

$$\left[\begin{matrix} 2 & 3 \\ 8 & 5 \end{matrix}\right] \left[\begin{matrix} x \\ y \end{matrix}\right]=\left[\begin{matrix} 3 \\ 5 \end{matrix}\right]$$

이를 응용하면 여러개의 연립 방정식 또한 행렬의 연산으로 표현할 수 있습니다. 아래와 같이 여러개의 연립 일차방정식이 있을 때,

$$\begin{align*} 2x_1 + 3y_1 &= 3 \\ 8x_1 + 5y_1 &= 5 \end{align*}$$

$$\begin{align*} 2x_2 + 3y_2 &= 6 \\ 8x_2 + 5y_2 &= 7 \end{align*}$$

$$\begin{align*} 2x_3 + 3y_3 &= 8 \\ 8x_3 + 5y_3 &= 9 \end{align*}$$

이는 행렬의 연산으로 다음과 같이 간단하게 나타낼 수 있습니다.

$$\left[\begin{matrix} 2 & 3 \\ 8 & 5 \end{matrix}\right] \left[\begin{matrix} x_1 & x_2 & x_3 \\ y_1 & y_2 & y_3 \end{matrix}\right]=\left[\begin{matrix} 3 & 6 & 8 \\ 5 & 7 & 9 \end{matrix}\right]$$

3 벡터의 크기와 방향

행 벡터 $V=\left[\begin{matrix}3 & 5\end{matrix}\right]$일 때, 이를 좌표 평면에 나타내면 다음과 같습니다.

[그림 2] 좌표평면의 벡터 V

 

벡터의 첫 번째 성분은 $x$축을 따라 얼마나 움직였는가를 의미하고, 두 번째 성분은 $y$축에 나란히 얼마나 움직였는가를 의미합니다. 그럼으로, 위 그림의 벡터 $V$는 $x$축을 따라 3만큼 움직이고, $y$축에 나란히 5만큼 움직였다고 할 수 있겠네요.

3.1 벡터의 크기

벡터의 크기(길이)는 원점 으로부터 종점까지 얼마나 떨어져 있느냐를 나타냅니다.
그리고, 이를 측정하는 방법에 따라 $L_1$ norm Manhattan norm 과 $L_2$ norm Euclidean norm 의 방법으로 측정할 수 있습니다.

 

노름(norm)은 $p \geq 1$ 일 때, 아래와 같이 정의됩니다.

$$|x|_p=\left(\sum_i^n\left|x_i\right|^p\right)^{\frac{1}{p}}$$

3.1.1 L1 노름

$L_1$ 노름은 $|x|_1=\left(\sum_i^n\left|x_i\right|^1\right)^{\frac{1}{1}}=\left(\left|x_1\right|^1+\left|x_2\right|^1+\cdots+\left|x_n\right|^1\right)^{\frac{1}{1}}$ 으로, 벡터 $V$의 크기는 $(\left|3\right|^1+\left|5\right|^1)^{\frac{1}{1}}$ 이 됩니다.

3.1.2 L2 노름

$L_2$ 노름은 $|x|_2=\left(\sum_i^n\left|x_i\right|^2\right)^{\frac{1}{2}}=\left(\left|x_1\right|^2+\left|x_2\right|^2+\cdots+\left|x_n\right|^2\right)^{1 / 2}$ 으로,벡터 $V$의 크기는 $(\left|3\right|^2+\left|5\right|^2)^{\frac{1}{2}}$ 즉, $\sqrt{3^2 + 5^2}$ 이 됩니다.

 

만약, $|x|$ 와 같이 별도의 $L_{1}, L_{2}$ 노름 구분이 없다면 일반적인 경우 이는, $L_{2}$ 노름을 의미합니다.

 

벡터 $V$에 대한 $L_1, L_2$ norm을 Python 코드로 구현하면 다음과 같습니다:

NumPy 라이브러리의 linalg 모듈에 있는 norm() 함수에 벡터 $V$를 인자로 전달하여 노름을 계산할 수 있습니다. 이 때, 함수의 ord 파라미터를 통해 계산하고자 하는 노름을 지정할 수 있습니다. ord = 1은 $L_1$  노름을, ord = 2는 $L_2$ 노름을 나타냅니다.

3.2 벡터의 방향

벡터의 방향은 $x$축과 벡터의 사잇 각 을 나타냅니다.
이 각도는 주로 $\theta$ 로 표기되며, 벡터의 방향은 $x$축과 $\theta$도의 각을 이룬다고 표현할 수 있습니다.


Reference

'Mathematics for AI > Linear Algebra' 카테고리의 다른 글

전치와 내적  (0) 2024.03.13

+ Recent posts