[인공지능 수학 - 선형대수]1강 : 선형 시스템

4 minute read

선형 시스템(Linear System)

배울 내용

  • 선형시스템 복습 : 초등/중등 교과과정
  • 선형시스템 : Ax = b, 연립일차방정식의 대수적 표현
  • 가우스 소거법 : 선형시스템을 푸는 방법
  • LU 분해 : 가우스 소거법 과정을 행렬로 표현
  • 프로그래밍 실습

선형시스템 복습 : 초등/중등 교과과정부터 시작하기

가장 간단한 형태의 linear system(선형시스템) 문제는 다음과 같다.
$3x = 6$
$x = 2$

다음은 중등 교과과정에서 연립일차방정식이라고 배운 linear system(선형시스템) 문제이다.
$3x + y = 2$
$x - 2y = 3$
$x = 1, y = -1$
연립일차방정식을 소거법으로 풀었을텐데, 이것을 좀더 정형화한 것이 Gauss 소거법이다.

중등 교과과정에서 배운 조금 복잡한 연립일차방정식인 linear system(선형시스템) 문제이다.
$3x + y + z = 4$
$x - 2y - z = 1$
$x + y + z = 2$
이것을 푸는 소거법 방법 또한 Gauss 소거법.

자, 그렇다면 더 복잡한 연립일차방정식인 linear system(선형시스템)문제도 풀 수 있을 것이다.

선형대수(Linear Algebra)의 목표

선형대수(Linear Algebra)의 목표는 어떤 연립이차방정식, 즉 linear system(선형시스템)문제라도 정형적인 방법으로 표현하고 해결하는 방법을 배우는 것이다.

Linear System(선형시스템)의 구성요소 : Linear Equations(선형방정식)

아래의 linear system(선형시스템)은 우선 3개의 방정식으로 되어있다.
$3x + y + z = 4$
$x - 2y -z = 1$
$x + y + z = 2$
이 방정식들을 각각 linear equation(선형방적식)이라고 한다.
linear : 선의 형태이다. 어떤 방정식의 해가 올곧게, 직선으로, 평면에 그려지면 선형 방정식이다.

Linear System(선형시스템)의 구성요소 : Unknowns(미지수)

아래의 linear system(선형시스템)은 우리가 알아내려는 3개의 미지수 x, y, z를 가지고 있다.
$3x + y + z = 4$
$x - 2y -z = 1$
$x + y + z = 2$
이러한 미지수를 각각 unknown(혹은 variable)이라고 한다.

m*n Linear System(선형시스템)

아래와 같이 3개의 linear equations과 3개의 unknowns로 구성된 연립일차방정식을
$3x + y + z = 4$
$x - 2y -z = 1$
$x + y + z = 2$
3*3(식의개수 * 미지수의개수) linear system이라고 한다.

Linear System(선형시스템)과 Linear Equation(선형방정식)의 예시

2*3 linear system(선형시스템)
$3x + y + z = 4$
$x - 2y - z = 1$

1*2 linear system(선형시스템)
$2x + y = 3$

3*2 linear system(선형시스템)
$3x + y = 2$
$x - 2y = 3$
$2x - 4y = 6$

선형시스템이 되려면, 각각의 수식이 선형방정식이어야 한다. 그리지 않고도 선형방정식인지 알 수 있는 방법이 있을까?
선형방정식 : 미지수의 승수가 1승으로만 구성되어 있다.
비선형방정식 : sin과 같이 곡선형태를 띄거나, 미지수의 승수가 1승보다 큰 것으로 구성되어 있다.

non-linear equation(비선형(곡선)방정식)
$sinx + y = 2$
$3x + y^3 = 2$

linear equation(선형방정식)
$2x + y = 3$

아래의 경우는?
$xy + z = 3$
비선형 방정식이다. 미지수의 각각의 승수가 1승이긴 하지만, xy가 곱해져 있으므로 결과적으로 미지수 자체에 대해 2승이 된다.
미지수에 대해서 각각 1승으로만 구성되어 있어야 선형방정식이다!

선형시스템의 표현 : Ax = b(연립일차방정식의 대수적 표현)

다음 선형시스템을 Ax = b로 표현해 보자.
$3x + y = 2$
$x - 2y = 3$
$2x - 4y = 6$

Ax = b로 표현하기(대수적으로 표현하기)

  1. 선형시스템의 unknowns(미지수)를 모아 column vector(열벡터) x로 표현한다.
  2. 선형시스템의 linear equation(선형방정식)에 대해 다음을 수행한다.
    • coefficients(계수)를 모아 A의 row vector(행벡터)로 표현한다.
    • constant(상수)를 모아 b에 표현한다.

$ \begin{bmatrix} 3 & 1\cr 1 & -2\cr 2 & -4 \end{bmatrix} * \begin{bmatrix} x\cr y \end{bmatrix} = \begin{bmatrix} 2\cr 3\cr 6 \end{bmatrix} $
이와 같은 방식으로 Ax = b로 표기한다.

Linear System(선형 시스템)의 대수적 표현(연습문제)

2*3 선형시스템

$3x_1 + x_2 + x_3 = 4$
$x_1 - 2x_2 - 3x_3 = 1$

Ax = b의 대수적 표현은 다음과 같다.

$ \begin{bmatrix} 3 & 1 & 1\cr 1 & -2 & -1 \end{bmatrix} * \begin{bmatrix} x_1\cr x_2\cr x_3 \end{bmatrix} = \begin{bmatrix} 4\cr 1 \end{bmatrix} $

3*5 선형시스템

$-x_1 + 2x_2 - x_3 = 3$
$-x_2 + 2x_3 - x_4 = 2$
$-x_3 + 2x_4 - x_5 = 5$

Ax = b의 대수적 표현은 다음과 같다.

$ \begin{bmatrix} -1 & 2 & -1 & 0 & 0\cr 0 & -1 & 2 & -1 & 0\cr 0 & 0 & -1 & 2 & -1 \end{bmatrix} * \begin{bmatrix} x_1\cr x_2\cr x_3\cr x_4\cr x_5 \end{bmatrix} = \begin{bmatrix} 3\cr 2\cr 5 \end{bmatrix} $
Ax = b로부터 linear system(선형시스템) 표현하는 방식, 즉 행렬계산도 익혀두자.(가로 * 세로!)

정리 : Linear System(선형시스템)의 대수적 표현

선형시스템
$3x + y = 2$
$x - 2y = 3$
$2x - 4y = 6$

Ax=b
$ \begin{bmatrix} 3 & 1\cr 1 & -2\cr 2 & -4 \end{bmatrix} * \begin{bmatrix} x\cr y \end{bmatrix} = \begin{bmatrix} 2\cr 3\cr 6 \end{bmatrix} $

m*n 선형시스템의 Ax=b 표현을 정리하면..

  • 식은 행이고, 행은 식이다.
  • m은 선형방정식의 개수이다.
  • n은 미지수의 개수이다.
  • A는 m*n 행렬이다.
  • x는 n-벡터이다.
  • b는 m-벡터이다.

프로그래밍 실습

행렬과 벡터의 코딩 및 연산

$ \begin{bmatrix} 3 & 1 & 1\cr 1 & -2 & -1\cr 1 & 1 & 1 \end{bmatrix} * \begin{bmatrix} x_1\cr x_2\cr x_3 \end{bmatrix} = \begin{bmatrix} 4\cr 1\cr 2 \end{bmatrix} $
이 3*3 linear system의 해를 구해볼 것이다.

import numpy as np
# 행렬 코딩
A = np.array([[3, 1, 1], [1, -2, -1], [1, 1, 1]])
print(A)
print(np.shape(A))

결과

[[ 3  1  1]
 [ 1 -2 -1]
 [ 1  1  1]]
(3, 3)
# 벡터 코딩
b = np.array([4, 1, 2])
print(b)
print(np.shape(b))

결과

[4 1 2]
(3,)

$Ax = b$가 있으면, 해를 구하기 위해
$A^{-1}(Ax) = A^{-1}b$
$x = A^{-1}b$
이와 같은 과정이 필요하다. 따라서 역행렬을 구한다.

# 역행렬 구하기
A_inv = np.linalg.inv(A)
print(A_inv)
print(np.shape(A_inv))

결과

[[ 5.00000000e-01 -7.40148683e-17 -5.00000000e-01]
 [ 1.00000000e+00 -1.00000000e+00 -2.00000000e+00]
 [-1.50000000e+00  1.00000000e+00  3.50000000e+00]]
(3, 3)

이제 역행렬을 이용해서 선형시스템의 해를 구해보자.
$x = A^{-1}b$를 구하는 방법은 다음과 같다.

# 역행렬을 이용한 선형시스템 Ax=b의 해 구하기
# x = np.matmul(A_inv, b)
x = A_inv @ b
print(x)
print(np.shape(x))
[ 1. -1.  2.]
(3,)

행렬곱을 쓰기 위해서는 @ 또는 np.matmul을 사용한다.

이제 구한 해의 값이 맞는 값인지 검증해보자.

## 결과 검증
# bb = np.matmul(A, x)
bb = A @ x # 구한 x를 행렬 A에 곱한다

print(np.shape(bb))
print(bb)

if np.linalg.norm(b-bb) < 1e-3: # b와 bb가 거의 비슷하면 맞는 해라고 볼 수 있다. norm은 벡터의 크기를 말한다.
    print("OK")
else:
    print("something wrong")