[2주차]인공지능 수학 - 211213

Jupyter notebook 단축키(윈도우 기준)

Enter / Esc : 명령 모드(푸른색), 입력 모드(녹색) 전환

Ctrl + Enter / Shift + Enter : 셀 실행

DD(명령 모드) : 셀 삭제

M / Y : 마크다운, 코드 셀 전환

A / B : 위, 아래에 셀 추가

앞으로 자주 사용하면서 체득하도록 해야겠다.

아나콘다를 이용하여 주피터 노트북 환경을 구축했다.

속도에서 유리한 numpy

앞으로 인공지능을 위한 복잡한 계산을 하게 될 것이고, 이를 위해 numpy를 활용하기로 했다.

그 이유는 파이썬이 기본적으로 속도에서 불리한 언어이고, numpy는 이를 보완하여 최적화에 따라 수십 배의 작업 속도 향상을 보여준다고 한다.

간단한 예시로 속도 비교를 해보면,

l = range(1000)
%timeit [i**2 for i in l]

200 µs ± 2.4 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

n = np.arange(1000)
%timeit n**2

1.32 µs ± 16.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

짧은 반복에서 100배 이상의 속도 차이가 났다.

선형시스템

선형방정식(linear equation)
3x+y+z=43x+y+z=4

해의 집합이 직선, 평면으로 이루어져야한다

그러기 위해서는 모든 미지수의 차수가 1이어야 한다

미지수(unknown/variable)

선형방정식을 만족시키는 해 x, y, z

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

n개의 선형 방정식과 k개의 미지수로 이루어진 방정식
n x k linear system(선형 시스템)

선형 시스템의 대수적 표현

대수적 표현이란?

정형화된 형태로 가공했다고 생각하면 된다.

규칙성을 가진 형태로 표현되었기 때문에, 일반적인 원리의 계산을 수행, 알고리즘을 적용할 수 있게 된다.

Ax=b로 표현하기
3x+y+z=43x+y+z=4
x2yz=1x -2y-z=1
x+y+z=2x+y+z=2
  1. 선형 시스템의 미지수를 모아 column vector로 표현

    [xyz]\left[ \begin{matrix} x \\ y \\ z \\ \end{matrix} \right]
  2. 선형 시스템의 선형 방정식에 대해서, coefficient(계수)를 모아 A의 row vector로 표현

    [312121111]\left[ \begin{matrix} 3 & 1 & 2 \\ 1 & -2 & -1 \\ 1 & 1 & 1 \end{matrix} \right]
  3. constant(상수)를 모아 b에 표현

[412]\left[ \begin{matrix} 4 \\ 1 \\ 2 \end{matrix} \right]
Ax=b
[312121111][xyz]=[412]\left[ \begin{matrix} 3 & 1 & 2 \\ 1 & -2 & -1 \\ 1 & 1 & 1 \end{matrix} \right] \left[ \begin{matrix} x \\ y \\ z \\ \end{matrix} \right] = \left[ \begin{matrix} 4 \\ 1 \\ 2 \end{matrix} \right]

m x n 선형 시스템에 대해서,
A = m x n 행렬
x = n 벡터
b = m 벡터

numpy를 이용한 선형 대수 계산

numpy 행렬 선언
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)
vector 코딩
# 편의성을 위해 굳이 세워서 1 x3 행렬로 만들지 않아도, numpy 의 계산이 가능함
b = np.array([4, 1, 2])

print(b)
print(np.shape(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)

정밀도의 문제로 정확히 0으로 표현되지 못 했지만 -7.40148683e-17은 0으로 봐야 한다

결과 검증
## 결과 검증
x = A_inv @ b
print(x)
print(np.shape(x))

[ 1. -1.  2.]
(3,)
## 결과 검증
A_inv = np.array([[0.5, 0, -0.5], [1, -1, -2], [-1.5, 1, 3.5]])
x = A_inv @ b
print(x)
print(np.shape(x))

[ 1. -1.  2.]
(3,)

앞서 -7.40148683e-17 대신 0을 직접 입력해도 같은 결과가 나온다.

# bb = np.matmul(A, x)
bb = A @ x
print(bb)
[4. 1. 2.]

@ 는 행렬곱을 의미한다. np.matmul(행렬1, 행렬2)와 같은 역할을 한다.

if np.linalg.norm(b - bb) < 1e-3:
    print("Ok")
else:
    print("something wrong")
    
Ok

numpy의 linalg.norm 함수를 이용하여 계산 결과를 검증한다.
부동소수점 계산의 정밀도의 문제가 있어서 정확히 같은지 여부가 아니라 오차를 따져서 검증한다.

가우스 소거법

선형 시스템의 해
  1. 해가 하나인 경우
  2. 해가 없는 경우
  3. 해가 여러개인 경우
  • Ax=b에서, 역행렬이 존재하지 않는 행렬 A가 존재할 때, A는 특이(singular)하다.
  • 해가 있다 = 선형시스템이 consistent하다
  • 해가 없다 = 선형시스템이 inconsistent하다
  • 해가 없는 경우, 해가 여러개인 경우 모두 A가 singular한 특징이 있다.
가우스 소거법 적용 방법
  1. 전방소거법을 수행
  2. 후방대입법을 수행
전방소거법

주어진 선형 시스템을 아래로 갈수록 더 단순한 형태의 선형방정식을 가지도록 변형한다.

[0][x1xn][]\left[ \begin{matrix} * & * & * & \dots & *\\ & * & * & \dots & *\\ & & \ddots & \ddots & \vdots\\ & & & \ddots & *\\ 0 & & & & *\\ \end{matrix} \right] \left[ \begin{matrix} x_{1} \\ \vdots \\ x_{n} \\ \end{matrix} \right] \left[ \begin{matrix} * \\ \vdots \\ * \\ \end{matrix} \right]

A 행렬의 성분이 i행과 j열에 대해서 A = a(i, j)일 때,
i==j인 위치를 이은 것이 주 대각선이다.

행렬의 주대각선을 기준으로 아래쪽 항들을 모두 0으로 만들어서 상삼각행렬(upper triangular matrix)를 만든다.

이는 첫번째 행에서부터, 우하향의 원소들을 대상으로 진행한다.

그 결과, 해가 있는지(consistent) 혹은 해가 없는지(inconsistent)를 알 수 있으며,

주어진 선형 시스템의 랭크(rank)를 알 수 있다.

랭크 = 의미있는 식의 개수
(의미있는 식 = 다른 식의 배수로 표현될 수 없는 유니크한 식)

후방대입법

아래에서부터 위로 미지수를 실제값으로 대체한다.

좋은 웹페이지 즐겨찾기