[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)
해의 집합이 직선, 평면으로 이루어져야한다
그러기 위해서는 모든 미지수의 차수가 1이어야 한다
미지수(unknown/variable)
선형방정식을 만족시키는 해 x, y, z
선형시스템(linear system)
n개의 선형 방정식과 k개의 미지수로 이루어진 방정식
n x k linear system(선형 시스템)
선형 시스템의 대수적 표현
대수적 표현이란?
정형화된 형태로 가공했다고 생각하면 된다.
규칙성을 가진 형태로 표현되었기 때문에, 일반적인 원리의 계산을 수행, 알고리즘을 적용할 수 있게 된다.
Ax=b로 표현하기
-
선형 시스템의 미지수를 모아 column vector로 표현
-
선형 시스템의 선형 방정식에 대해서, coefficient(계수)를 모아 A의 row vector로 표현
-
constant(상수)를 모아 b에 표현
Ax=b
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 함수를 이용하여 계산 결과를 검증한다.
부동소수점 계산의 정밀도의 문제가 있어서 정확히 같은지 여부가 아니라 오차를 따져서 검증한다.
가우스 소거법
선형 시스템의 해
- 해가 하나인 경우
- 해가 없는 경우
- 해가 여러개인 경우
- Ax=b에서, 역행렬이 존재하지 않는 행렬 A가 존재할 때, A는 특이(singular)하다.
- 해가 있다 = 선형시스템이 consistent하다
- 해가 없다 = 선형시스템이 inconsistent하다
- 해가 없는 경우, 해가 여러개인 경우 모두 A가 singular한 특징이 있다.
가우스 소거법 적용 방법
- 전방소거법을 수행
- 후방대입법을 수행
전방소거법
주어진 선형 시스템을 아래로 갈수록 더 단순한 형태의 선형방정식을 가지도록 변형한다.
A 행렬의 성분이 i행과 j열에 대해서 A = a(i, j)일 때,
i==j인 위치를 이은 것이 주 대각선이다.
행렬의 주대각선을 기준으로 아래쪽 항들을 모두 0으로 만들어서 상삼각행렬(upper triangular matrix)를 만든다.
이는 첫번째 행에서부터, 우하향의 원소들을 대상으로 진행한다.
그 결과, 해가 있는지(consistent) 혹은 해가 없는지(inconsistent)를 알 수 있으며,
주어진 선형 시스템의 랭크(rank)를 알 수 있다.
랭크 = 의미있는 식의 개수
(의미있는 식 = 다른 식의 배수로 표현될 수 없는 유니크한 식)
후방대입법
아래에서부터 위로 미지수를 실제값으로 대체한다.
Author And Source
이 문제에 관하여([2주차]인공지능 수학 - 211213), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@withdongyeong/211213저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)