선형대수

이번 비디오에서는 선형대수 기초를 다룬다.

선형대수는 벡터와 행렬의 성질을 연구하는 수학의 한 분야이다. 여기서는 데이터 분석 기술의 기초를 제공하는 벡터와 행렬의 기본 개념을 소개한다.

벡터

벡터는 보통 유한 개의 숫자를 담고 있으며, 벡터의 길이를 차원(dimension)이라 부른다.

통계 및 물리학에서 많이 사용된다.

벡터 덧셈

차원이 같은 벡터 두 개의 덧셈은 같은 위치에 있는 항목끼기 더한 결과로 이루어진 벡터를 생성한다.

$$(1, 2) + (2, 1) = (1+2, 2+1) = (3, 3)$$$$(165, 53, 20) + (177, 71, 20) = (165+177, 53+71, 20+20) = (342, 124, 40)$$$$(55, 67, 86, 94) + (80, 83, 81, 79) = (55+80, 67+83, 86+81, 94+79) = (135, 150, 167, 173)$$

벡터 덧셈의 기하학적 의미

벡터 $a$와 벡터 $b$의 합 $a+b$의 의미를 아래 그래프에서처럼 해석할 수 있다.

출처: 위키백과

벡터 뺄셈

차원이 같은 벡터 두 개의 덧셈은 같은 위치에 있는 항목끼기 뺀 결과로 이루어진 벡터를 생성한다.

$$(1, 2) - (2, 1) = (1-2, 2-1) = (-1, 1)$$$$(165, 53, 20) - (177, 71, 20) = (165-177, 53-71, 20-20) = (-12, -18, 0)$$$$(55, 67, 86, 94) - (80, 83, 81, 79) = (55-80, 67-83, 86-81, 94-79) = (-25, -16, 5, 15)$$

벡터 뺄셈의 기하학적 의미

벡터 $a$와 벡터 $b$의 합 $a-b$의 의미를 아래 그래프에서처럼 해석할 수 있다.

출처: 위키백과

스칼라 곱셈

숫자 하나와 벡터의 곱셈을 스칼라 곱셈이라 부른다. 스칼라 곱셈은 벡터의 각 항목을 지정된 숫자로 곱해 새로운 벡터를 생성한다.

$$3 \cdot (1, 2) = (3\cdot 1, 3\cdot 2) = (3, 6)$$$$2 \cdot (165, 53, 20) = (2\cdot 165, 2\cdot 53, 2\cdot 20) = (330, 106, 40)$$$$5\cdot (55, 67, 86, 94) = (5\cdot 55, 5\cdot 67, 5\cdot 86, 5\cdot 94) = (275, 335, 430, 470)$$

스칼라 곱셈의 기하학적 의미

출처: 위키백과

예제: 벡터 항목별 평균

같은 길의의 벡터가 여러 개 주어졌을 때 항목별 평균을 구할 수도 있다. 항목별 평균은 항목끼리 모두 더한 후 벡터의 개수로 나누면 된다. 즉, 벡터의 덧셈과 스칼라 곱셈을 이용하면 된다.

$$\frac 1 3 \cdot ((1, 2) + (2, 1) + (2, 3)) = \frac 1 3 \cdot (1+2+2, 2+1+3) = (\frac 5 3, \frac 6 3) = (\frac 5 3, 2)$$

내적

차원이 같은 벡터 두 개의 내적은 같은 위치에 있는 항목끼기 곱한 후 모두 더한 결과를 의미한다.

벡터 내적의 기하학적 의미

두 개의 벡터 $A$와 $B$가 주어졌고, 벡터 $B$의 길이가 1이라고 가정하자. 그러면 내적 $A \cdot B$는 벡터 $A$가 벡터 $B$ 방향으로 사영되었을 때의 길이를 나타낸다.

출처: 위키백과

예제: 벡터 항목별 제곱의 합

내적을 이용하여 벡터 항목별 제곱의 합을 쉽게 구할 수 있다. $v = (v_1, \cdots, v_n)$ 일 때 각 항목별 제곱의 합은 $v$와 $v$ 자신의 내적과 같다.

$$v \cdot v = v_1^2 + \cdots + v_n^2$$
$$(1, 2) \cdot (1, 2) = 1^2 + 2^2 = 5$$

예제: 벡터의 크기

$v = (v_1, \cdots, v_n)$ 일 때 벡터 $v$의 크기 $\|v\|$는 각 항목별 제곱을 합한 결과의 제곱근이다. 즉,

$$\|v\| = \sqrt{v \cdot v} = \sqrt{v_1^2 + \cdots + v_n^2}$$
$$\|(1, 2)\| = \sqrt{1^2 + 2^2} = \sqrt{5}$$

예제: 벡터 사이의 거리

$v = (v_1, \cdots, v_n)$이고 $w = (w_1, \cdots, w_n)$ 일 때 벡터 $v$와 벡터 $w$ 사이의 거리는 벡터 $v-w$의 크기이다. 즉,

$$\|v - w\| = \sqrt{(v-w) \cdot (v-w)} = \sqrt{(v_1-w_1)^2 + \cdots + (v_n-w_n)^2}$$
$$\|(1, 2) - (2, 1)\| = \sqrt{((-1)^2 + 1^2} = \sqrt{2}$$

행렬

행렬(matrix)은 보통 숫자들을 직사각형 형태로 배열한 것이다.

예를 들어, $1, 2, 3, 4, 5, 6$ 여섯 개의 항목을 가진 행렬의 모양(shape)은 네 종류가 있다. 이유는 6을 두 개의 양의 정수의 곱셈으로 표현하는 방법이 네 가지이기 때문이다.

$$ 6 = 1\times6 = 2\times 3 = 3 \times 2 = 6 \times 1$$ \begin{bmatrix} 1 & 2 & 3 & 4 & 5 & 6 \end{bmatrix} \begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6 \end{bmatrix} \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix} \begin{bmatrix} 1 \\ 2 \\ 3 \\ 4 \\ 5 \\ 6 \end{bmatrix}

모양(shape)

$n$ 개의 행과 $k$ 개의 열로 구성된 행렬을 $n \times k$ 행렬이라 부르며, $(n,k)$를 해당 행렬의 모양(shape)라 부른다.

주의: 행과 열의 순서

수학에서 행을 '1행', '2행' 등으로, 열을 '1열', '2열' 등으로 부른다.

하지만 파이썬에서는 행을 '0번 행', '1번 행' 등으로, 열을 '0번 열', '1번 열' 등으로 부른다.

특수 행렬

영행렬

영행렬(zero matrix)이란 행렬의 모든 원소의 값이 0인 행렬을 말한다.

예를 들어, 아래 행렬은 $3 \times 2$ 영행렬이다.

\begin{bmatrix} 0 & 0 \\ 0 & 0 \\ 0 & 0 \end{bmatrix}

단위행렬

단위행렬(identity matrix)은 정사각형 모양의 행렬 중에서 대각선 상에 위치한 항목은 1이고 나머지는 0인 행렬을 말한다.

예를 들어, 아래 행렬은 $5\times 5$ 단위행렬이다.

\begin{bmatrix} 1&0&0&0&0 \\ 0&1&0&0&0 \\ 0&0&1&0&0 \\ 0&0&0&1&0 \\ 0&0&0&0&1 \end{bmatrix}

행렬 덧셈과 뺄셈

모양이 같은 두 행렬의 덧셈/뺄셈은 항목별로 더한/뺀 결과로 이루어진 행렬이다. 즉, 벡터의 덧셈/뺄셈과 동일한 방식이다.

예를 들어, $2 \times 3$ 행렬의 덧셈/뺄셈은 다음과 같다.

$$ \begin{bmatrix}1&3&7\\1&0&0\end{bmatrix} + \begin{bmatrix}0&0&5\\7&5&0\end{bmatrix} = \begin{bmatrix}1+0&3+0&7+5\\1+7&0+5&0+0\end{bmatrix} = \begin{bmatrix}1&3&12\\8&5&0\end{bmatrix} $$$$ \begin{bmatrix}1&3&7\\1&0&0\end{bmatrix} - \begin{bmatrix}0&0&5\\7&5&0\end{bmatrix} = \begin{bmatrix}1-0&3-0&7-5\\1-7&0-5&0-0\end{bmatrix} = \begin{bmatrix}1&3&2\\-6&-5&0\end{bmatrix} $$

행렬 스칼라 곱셈

숫자 하나와 행렬의 곱셈을 행렬 스칼라 곱셈이라 부른다. 스칼라 곱셈은 행렬의 각 항목을 지정된 숫자로 곱해 새로운 행렬을 생성한다. 즉, 벡터의 스칼라 곱셈과 동일한 방식이다.

예를 들어, $2 \times 3$ 행렬의 스칼라 곱셈은 다음과 같다.

$$ 2\cdot \begin{bmatrix}1&8&-3\\4&-2&5\end{bmatrix} = \begin{bmatrix}2\cdot 1&2\cdot 8&2\cdot -3\\2\cdot 4&2\cdot -2&2\cdot 5\end{bmatrix} = \begin{bmatrix}2&16&-6\\8&-4&10\end{bmatrix} $$

행렬 곱셈

$m \times n$ 행렬 $A$와 $n \times p$ 행렬 $B$의 곱은 $m \times p$ 행렬이며, 각 $(i, j)$번째 항목은 다음과 같이 정의된다.

$$ (A\cdot B)_{ij} = \sum _{k=0}^{n-1} A_{ik} \cdot B_{kj} = A_{i0} \cdot B_{0j} + A_{i2} \cdot B_{2j} + \cdots + A_{i(n-1)} \cdot B_{(n-1)j} $$

주의: 인덱스가 $0$부터 출발해서 $(n-1)$까지이다.

그림으로 나타내면 다음과 같다.

출처: 위키백과

즉, 좌측 행렬 열의 수 $n$과 우측 행렬 행의 수 $n$이 같은 경우에만 곱셈이 가능하다.

예를 들어, $2 \times 3$ 행렬과 $3 \times 2$ 행렬의 곱셈은 다음과 같다.

$$ \begin{bmatrix} 1&0&2\\-1&3&1 \end{bmatrix} \cdot \begin{bmatrix} 3&1\\2&1\\1&0 \end{bmatrix} = \begin{bmatrix} (1\cdot 3+0\cdot 2+2\cdot 1)&(1\cdot 1+0\cdot 1+2\cdot 0)\\(-1\cdot 3+3\cdot 2+1\cdot 1)&(-1\cdot 1+3\cdot 1+1\cdot 0) \end{bmatrix} = \begin{bmatrix} 5&1\\4&2 \end{bmatrix} $$

항등원

영행렬은 행렬 덧셈의 항등원이며, 단위행렬은 행렬 곱셈의 항등원이다.

$$ \begin{bmatrix} 3&1 \\ 2&1 \\ 1&0 \end{bmatrix} + \begin{bmatrix} 0&0 \\ 0&0 \\ 0&0 \end{bmatrix} = \begin{bmatrix} (3+0)&(1+0)\\ (2+0)&(1+0)\\ (1+0)&(0+0) \end{bmatrix} = \begin{bmatrix} 3&1\\ 2&1\\ 1&0 \end{bmatrix} $$
$$ \begin{bmatrix} 3&1 \\ 2&1 \\ 1&0 \end{bmatrix} \cdot \begin{bmatrix} 1&0 \\ 0&1 \end{bmatrix} = \begin{bmatrix} (3\cdot 1+1\cdot 0)&(3\cdot 0+1\cdot 1) \\ (2\cdot 1+1\cdot 0)&(2\cdot 0+1\cdot 1) \\ (1\cdot 1+0\cdot 0)&(1\cdot 0+0\cdot 1) \\ \end{bmatrix} = \begin{bmatrix} 3&1\\ 2&1\\ 1&0 \end{bmatrix} $$

전치행렬

행렬의 전치란 행과 열을 바꾸는 것으로, 행렬 $A$의 전치는 $A^T$로 나타낸다. 즉, $A$가 $m \times n$ 행렬이면 $A^T$는 $n \times m$ 행렬이며, 그리고 $A^T$의 $i$행의 $j$열번째 값은 $A$의 $j$행의 $i$열번째 값이다. 즉,

$$ A ^{T}_{ij} = A_{ji} $$

예를 들어, $2\times 3$ 행렬의 전치는 $3 \times 2$ 행렬이 되며 다음과 같이 작동한다.

$$ \begin{bmatrix} 9&8&7\\ -1&3&4 \end{bmatrix}^{T} = \begin{bmatrix} 9&-1\\ 8&3\\ 7&4 \end{bmatrix} $$

전치의 성질

$a$를 스칼라, $A, B$를 크기가 같은 행렬이라 하자. 이때 다음이 성립한다.

  1. $(A^T)^T = A$
  2. $(A + B)^T = A^T + B^T$
  3. $(A - B)^T = A^T - B^T$
  4. $(a\cdot A)^T = a\cdot A^T$
  5. $(A\cdot B)^T = B^T \cdot A^T$

행렬 곱셈, 벡터 내적, 그리고 전치행렬

행렬 $A\cdot B$의 $(i, j)$번째 항목 $(A\cdot B)_{ij}$는 벡터 내적 또는 전치행렬과 깊이 연관되어 있다.

먼저, $m \times n$ 행렬 $A$와 $n \times p$ 행렬 $B$의 곱 $A \times B$의 $(i, j)$ 번째 항목은 다음과 같다.

$$ (A\cdot B)_{ij} = \sum _{k=0}^{n-1} A_{ik} \cdot B_{kj} = A_{i0} \cdot B_{0j} + A_{i2} \cdot B_{2j} + \cdots + A_{i(n-1)} \cdot B_{(n-1)j} $$

행렬 곱셈과 벡터 내적

행렬 $A$의 $i$ 행벡터를

$$A^0_i = (A_{i0},\dots, A_{i(n-1)}),$$

행렬 $B$의 $j$ 열벡터를

$$B^1_j = (B_{0j},\dots, B_{(n-1)j})$$

라 할 때 다음이 성립한다.

$$(A\cdot B)_{ij} = A^0_i \cdot B^1_j$$

즉, $A$의 $i$ 행벡터와 $B$의 $j$ 열벡터의 내적으로 정의된다.

행렬 곱셈과 전치행렬

행렬 $A$의 $i$ 행벡터를 $(1,n)$ 모양의 행렬로 볼 수 있다. 즉,

$$A^0_i = \begin{bmatrix} A_{i0} & \cdots & A_{i(n-1)} \end{bmatrix}$$

행렬 $B$의 $j$ 열벡터 역시 $(1,n)$ 모양의 행렬로 볼 수 있는데, 이 행렬의 전치 $(B^1_j)^T$는 $(n, 1)$ 모양의 행렬이 된다. 즉,

$$(B^1_j)^T = \begin{bmatrix} B_{0i}\\ \vdots\\ B_{(n-1)i} \end{bmatrix}$$

이제 다음이 성립한다.

$$(A\cdot B)_{ij} = A^0_i \cdot (B^1_j)^T$$

예제

$2 \times 3$ 행렬과 $3 \times 2$ 행렬의 곱셈을 다시 살펴보자.

$$ \begin{bmatrix} 1&0&2\\-1&3&1 \end{bmatrix} \cdot \begin{bmatrix} 3&1\\2&1\\1&0 \end{bmatrix} = \begin{bmatrix} (1\cdot 3+0\cdot 2+2\cdot 1)&(1\cdot 1+0\cdot 1+2\cdot 0)\\ (-1\cdot 3+3\cdot 2+1\cdot 1)&(-1\cdot 1+3\cdot 1+1\cdot 0) \end{bmatrix} = \begin{bmatrix} 5&1\\4&2 \end{bmatrix} $$

위 계산을 벡터 내적으로 표현해보자.

$A, B$ 행렬을 지정한다.

$$ A = \begin{bmatrix} 1&0&2\\-1&3&1 \end{bmatrix} \qquad B = \begin{bmatrix} 3&1\\2&1\\1&0 \end{bmatrix} $$

그러면

$$(A\cdot B)_{11} = -1\cdot 1+3\cdot 1+1\cdot 0 = 2$$

이고, 이것은 아래 결과와 동일하다.

$$ A^0_1 \cdot (B^1_1)^T = \begin{bmatrix} -1&3&1 \end{bmatrix} \cdot \begin{bmatrix} 1\\1\\0 \end{bmatrix} = \begin{bmatrix} -1\cdot 1+3\cdot 1+1\cdot 0 \end{bmatrix} = \begin{bmatrix} 2 \end{bmatrix} $$

단, $A^0_1$와 $B^1_1$는 다음과 같다.

$$ A^0_1 = \begin{bmatrix} -1&3&1 \end{bmatrix} \qquad B_1^1 = \begin{bmatrix} 1&1&0 \end{bmatrix} $$

벡터와 행렬의 활용

파이썬 데이터분석에스는 길이가 $n$인 벡터를 많은 경우 $(1, n)$ 모양의 행렬로 다룬다. 또한 행렬을 여러 개의 벡터로 구성된 리스트로 다룬다.

이 강의에서도 벡터와 행렬의 활용을 많이 보게 될 것이다.

활용 예제 1

1,000명에 대한 키, 몸무게, 나이가 주어졌다면 $1000 \times 3$ 행렬로 표현할 수 있다.

$$ \begin{bmatrix} 70 & 170 & 40 \\ 65 & 120 & 26 \\ 77 & 250 & 19 \\ & \vdots & \\ 72 & 200 & 23 \end{bmatrix} $$

활용 예제 2

$k$ 차원의 벡터를 $n$ 차원의 벡터로 변환해주는 $n \times k$ 행렬로 표현할 수 있다. 왜냐하면, $n\times k$ 행렬과 $k \times 1$ 행렬을 곱하면 $n \times 1$ 행렬을 얻기 때문이다.

예를 들어, $B$가 3차원 벡터 $(3, 2, 1)$이면, $2\times 3$ 행렬과의 곱을 이용하여 2차원 벡터를 구할 수 있다.

$$ A = \begin{bmatrix} 1&0&2\\-1&3&1 \end{bmatrix} \qquad B = \begin{bmatrix} 3&2&1 \end{bmatrix} $$
$$ C = A \cdot B^T = \begin{bmatrix} 1&0&2\\-1&3&1 \end{bmatrix} \cdot \begin{bmatrix} 3\\2\\1 \end{bmatrix} = \begin{bmatrix} 3+0+2 \\ -3 + 6 + 1 \end{bmatrix} = \begin{bmatrix} 5\\4 \end{bmatrix} $$

따라서 $C^T = \begin{bmatrix}5&4\end{bmatrix}$ 에 해당하는 2차원 벡터 $(5,4)$를 얻는다.

활용 예제 3

이진 관계를 행렬로 표현할 수 있다.

예를 들어, 사용자 아이디 $i$와 $j$가 친구사이라는 사실을 $(i, j)$로 표시한다고 하자. 그리고 열 명의 사용자 사이의 친구관계가 다음과 같다고 가정하자.

$$ F = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (3, 4), (4, 5), (5, 6), (5, 7), (6, 8), (7, 8), (8, 9)] $$

그런데 이렇게 하면 사용자들 사이의 친구관계를 쉽게 파악하기 어렵다. 반면에 아래와 같이 $10\times 10$ 행렬로 표시하면 다르게 보인다.

$$ F = \begin{bmatrix} 0&1&1&0&0&0&0&0&0&0\\ 1&0&1&1&0&0&0&0&0&0\\ 1&1&0&1&0&0&0&0&0&0\\ 0&1&1&0&1&0&0&0&0&0\\ 0&0&0&1&0&1&0&0&0&0\\ 0&0&0&0&1&0&1&1&0&0\\ 0&0&0&0&0&1&0&0&1&0\\ 0&0&0&0&0&1&0&0&1&0\\ 0&0&0&0&0&0&1&1&0&1\\ 0&0&0&0&0&0&0&0&1&0 \end{bmatrix} $$

즉, 사용자 $i$와 사용자 $j$ 사이의 친구관계 성립여부는 행렬 $F$의 $(i,j)$ 번째 항목이 1이면친구관계이고, 0이면 아니라는 것을 바로 확인할 수 있다. 즉, $F_{ij} = 1$인가를 확인만 하면 된다.