Enter / Esc : 명령 모드(푸른색), 입력 모드(녹색) 전환
Ctrl + Enter / Shift + Enter : 셀 실행
DD(명령 모드) : 셀 삭제
M / Y : 마크다운, 코드 셀 전환
A / B : 위, 아래에 셀 추가
앞으로 자주 사용하면서 체득하도록 해야겠다.
아나콘다를 이용하여 주피터 노트북 환경을 구축했다.
앞으로 인공지능을 위한 복잡한 계산을 하게 될 것이고, 이를 위해 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배 이상의 속도 차이가 났다.
해의 집합이 직선, 평면으로 이루어져야한다
그러기 위해서는 모든 미지수의 차수가 1이어야 한다
선형방정식을 만족시키는 해 x, y, z
n개의 선형 방정식과 k개의 미지수로 이루어진 방정식
n x k linear system(선형 시스템)
정형화된 형태로 가공했다고 생각하면 된다.
규칙성을 가진 형태로 표현되었기 때문에, 일반적인 원리의 계산을 수행, 알고리즘을 적용할 수 있게 된다.
선형 시스템의 미지수를 모아 column vector로 표현
선형 시스템의 선형 방정식에 대해서, coefficient(계수)를 모아 A의 row vector로 표현
constant(상수)를 모아 b에 표현
m x n 선형 시스템에 대해서,
A = m x n 행렬
x = n 벡터
b = m 벡터
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)
# 편의성을 위해 굳이 세워서 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 함수를 이용하여 계산 결과를 검증한다.
부동소수점 계산의 정밀도의 문제가 있어서 정확히 같은지 여부가 아니라 오차를 따져서 검증한다.
주어진 선형 시스템을 아래로 갈수록 더 단순한 형태의 선형방정식을 가지도록 변형한다.
A 행렬의 성분이 i행과 j열에 대해서 A = a(i, j)일 때,
i==j인 위치를 이은 것이 주 대각선이다.
행렬의 주대각선을 기준으로 아래쪽 항들을 모두 0으로 만들어서 상삼각행렬(upper triangular matrix)를 만든다.
이는 첫번째 행에서부터, 우하향의 원소들을 대상으로 진행한다.
그 결과, 해가 있는지(consistent) 혹은 해가 없는지(inconsistent)를 알 수 있으며,
주어진 선형 시스템의 랭크(rank)를 알 수 있다.
랭크 = 의미있는 식의 개수
(의미있는 식 = 다른 식의 배수로 표현될 수 없는 유니크한 식)
아래에서부터 위로 미지수를 실제값으로 대체한다.