[인공지능 수학 - 선형대수]1강 : 선형 시스템
선형 시스템(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로 표현하기(대수적으로 표현하기)
- 선형시스템의 unknowns(미지수)를 모아 column vector(열벡터) x로 표현한다.
- 선형시스템의 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")