행렬 : 수를 직사각형의 형태로 나열한 것

행렬안의 각 수는 행렬의 원소라 함
행렬의 가로줄을 행(row), 세로줄을 열(column)이라 함
행렬을 표현할 때 'row x column 행렬' 혹은 행렬의 차원이 row x column'이라함
행렬안의 원소 표현


벡터 : 행 혹은 열이 하나인 행렬
(열벡터를 주로 사용)
벡터의 차원표기는 원소의 갯수n으로 'n차원의 열벡터'로 표현
벡터의 원소표현

import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
r = np.random.rand(3, 5) # (3, 5)의 랜덤한 수로 된 행렬 만들기
z = np.zeros((3, 5)) # (3, 5)의 0으로 된 행렬 만들기
a = np.array([[1, 2, 3], [4, 5, 6]])
a[0][2] # 3
같은 위치의 원소를 더함
이때 더하는 두 행렬은 차원이 같아야 함
각 위치의 원소에 스칼라 값을 곱함
m x n 행렬 A와 n x p 행렬 B를 곱한 결과 : m x p 행렬
결과 행렬의 원소 : i행 j열의 원소는 A의 i행과 B의 j열의 곱(각 자리 원소를 곱한 값이 합)
-> A의 i행과 B의 j열은 원소의 수가 같아야함
-> 행렬의 곱은 교환 법칙 성립 X
m x n 행렬 A와 m x n 행렬 B의 외적곱 : m x n 행렬
각 자리의 원소를 곱하면 됨
-> 행렬의 차원이 동일 해야함
a + b # 덧셈
a * 5 # 스칼라 곱
a @ b # 내적곱
np.dot(a, b) # 내적곱
행렬의 열과 행을 바꾼 것

행렬 연산에서 행렬의 차원을 맞추기 위해 사용
at = np.transpose(a) # a의 전치행렬 at
at = a.T # a의 전치행렬 at
행과 열이 같은 정사각형 모양에 행,렬이 같은 원소가 1, 나머지는 0인 행렬

어떤 행렬이든 단위행렬과 곱하면 행렬이 그대로 나온다.
I = np.identity(3) # 3x3 단위행렬
어떤 행렬에 곱했을때 단위 행렬이 나오도록 하는 행렬

모든 행렬에 역행렬이 있는 것은 아님!!
역행렬은 정사가형 모양이어야 한다(결과로 단위행렬이 나와야 함)
a_inv = np.linalg.pinv(a) # a의 역행렬 a_inv
np.linalg.pinv() 함수는 역행렬이 존재하지 않는 함수가 인자로 들어와도 최대한 역행렬과 비슷한 역할을 하는 행렬을 반환한다.

머신러닝을 할때 데이터를 일차식 형태(데이터의 가중치 * 데이터)f로 사용하는 경우가 많고 행렬을 이용하면 데이터의 식을 정돈된 형태로 효율적이게 계산 가능하다.