그냥 가져다 사용하지 않고, 정확한 개념을 알고, 또 잊지 않기 위해 정리하고자 책을 읽으며 개념을 익히고, 파이썬에서는 어떻게 구현하는지를 메모해두려 한다.
읽는 책은 장철원 작가님의 선형대수와 통계학으로 배우는 머신러닝 with 파이썬
리뷰 중 깊이가 없다는 글도 있지만 기본적인 개념을 잡고 거기서 더 나아가는 것은 학습자의 역할이지 그것까지 저자가 떠먹여줄 수는 없다고 생각한다. 책의 목적 자체도 머신러닝을 위해 선형대수와 통계학을 다루는 것이니 필요 이상으로 깊이 파고들 이유도 없을 것 같고.
Linear Algebra. 기초적이고도 필수적인 요소...지 아마. 개념은 어렵지 않은데, 막상 이용해서 문제를 풀라거나 응용하거나 하면 벽에 부딪힐지도 모르겠다.
Vector, scalar, matrix, tensor
vector는 scalar의 집합니다. 행 방향이면 row vector, 열 방향이면 column vector. matrix는 또 벡터들의 집합. row vectors의 집합이느냐 column vectors의 집합으로 보느냐에 따라 dimension까지도 달라질 수 있다. 예를 들어
// 1, 2, 3, 4, 5, 6 을 행렬로 늘어놓을 때
// 행 벡터의 집합으로 보았을 때 2차원이 되는 경우.
A = ( (1, 5),
(3, 4),
(5, 2), )
// 물론 실제로 이런 모양으로 표기하지는 않지만,
// 열 벡터의 집합으로 보았을 때 3차원이 되는 경우.
A = ( (1, (2,
3, 4,
5,), 6,) )
행x열의 2차원 행렬에서 n차원 matrix로 일반화 할 경우 Tensor로 부른다. 위의 예시의 경우 Tensor라고 말할 수 있을 것.
diagonal matrix, identity matrix
- diagonal matrix | 대각 행렬 : 대각 원소 이외의 모든 elements가 0인 행렬
- identity matrix | 단위 행렬 : 중앙 대각선 (11, 22, 33...) element가 1이며 나버지 원소는 0인 square matrix
numpy.identity(n)
으로 nxn의 단위 행렬을 만들 수 있다.
연산량이 많아졌을 때 행렬을 대각 or 단위 행렬로 변환하여 연산량을 줄여 자원을 아낄 수 있다.
transposed matrix
- 행과 열을 바꾼 행렬 ex) 32 -> 23
numpy.arr.transpose()
로 nparray를 transpose 시킬 수 있다.
multiplication
- 스칼라곱이 행렬을 구성하는 벡터들의 길이를 늘리는 것과 같다면, matrix multiplication(행렬곱)은 행렬 간의 곱셈이다. 이때, 앞 행렬의 열 크기와 뒷 행렬의 행 크기가 일치해야 곱할 수 있다.
- matrix element multiplication (element-wise multiplication)(행렬원소곱)은 행렬곱과 달리 차원이 동일한 두 행렬의 동일 위치 원소를 곱한다.
numpy.multiply(arr1, arr2)
,arr1*arr2)
은 기본적으로 원소곱이다.- 행렬곱을 하고 싶은 경우
numpy.matmul(arr1, arr2)
를 이용한다.
determinant
- determinant(행렬식) == n : 행렬이 단위 공간의 부피의 n배와 같다. == 0 : 부피가 0이다.
- 행렬식을 구한다는 것은 행렬을 구성하는 벡터로 만들 수 있는 도형의 부피를 계산한다는 것.
inverse matrix
- AA^-1 = Identity Matrix 를 만족하는 A^-1.
- 행렬의 행렬식 != 0 일 때 역행렬이 존재 : invertible matrix (가역 행렬)
numpy.linalg.inv(arr)
를 이용해 역행렬을 구할 수 있다.