[부스트캠프] AI_Math 행렬
행렬이란?
- 행렬(matrix)은 벡터를 원소로 가지는 2차원 배열이다. (벡터의 확장판!)
- numpy에선 행(row)이 기본 단위임으로, 행렬을 '행 벡터를 원소로 가지는'이라고 생각하면 쉽다.
- 행렬은 행(row)와 열(column)이라는 인덱스(index)를 가진다. (2개)
- 행렬의 특정행(열)을 고정하면 행(열) 벡터라고 부른다.
- a11 : 행렬 A에서 1번째 행에 있는 1번째 원소
전치 행렬(transpose matrix)
- 행과 열의 인덱스가 바뀐 행렬
- 전치행렬을 사용하는 이유는 행렬과 행렬의 연산 시 모양을 맞추기 위해서이다. (뒤에서 자세히)
행렬의 의미 (1)
- 벡터가 공간에서 한 점을 의미한다면 행렬은 여러 점들을 나타낸다.
- 행렬의 행벡터 Xi는 i번째 데이터를 의미한다.
- 행렬의 xij는 i번째 데이터의 j번째 변수의 값을 말한다.
행렬의 덧셈, 뺄셈, 성분곱, 스칼라곱
- 벡터와 마찬가지로 행렬끼리 같은 모양을 가지면 덧셈, 뺄셈, 성분곱, 스칼라곱을 계산할 수 있다.
- 벡터의 계산 방식과 똑같다.
* 성분곱은 각 원소의 곱(아래에서 나오는 행렬 곱셈과 다름)
행렬 곱셈(matrix multiplication)
- i번째 행벡터와 j번째 열 벡터 사이의 내적을 성분으로 가지는 행렬 계산
- 행렬 X와 Y의 행렬 곱셈은 X의 행의 개수와 Y의 열의 개수가 같아야 한다.
- np.inner는 i번째 행 벡터와 j번째 행벡터 사이의 내적을 성분으로 가지는 행렬을 계산한다. (수학에서 말하는 내적과 다름)
np.inner vs np.dot
import numpy as np
a=np.array([[1,2],[3,4]])
b=np.array([[11,12],[13,14]])
print(np.inner(a,b))
print(np.dot(a,b))
Output:
[[35 41]
[81 95]]
[[37 40]
[85 92]]
행렬의 의미 (2)
- 행렬은 벡터 공간에서 사용되는 연산자(operator)로 이해한다.
- 행렬 곱을 통해 벡터를 다른 차원의 공간으로 보낼 수 있다.
- AX = Z
- A : (n * m) , X:(m *1) -> Z:(n*1)
-> m차원 공간에서 n차원 공간으로 보낸다.
- 행렬 곱을 통해 패턴을 추출할 수 있고 데이터를 압축할 수 있다. (기계학습에서 많이 사용)
- 모든 선형 변환은 행렬 곱으로 계산할 수 있다.
역행렬
- 어떤 행렬 A의 연산을 거꾸로 되돌리는 행렬을 역행렬(inverse matrix)라고 한다.
-> n차원 공간에서 n차원 공간으로 보낸다.
- 조건 : 행과 열 숫자가 같고 (n=m) 행렬식이 0이 아닌 경우
import numpy as np
X = np.array([[1,2,3],[-1,2,-4],[2,1,-1]])
print(np.linalg.inv(X))
print(X @ np.linalg.inv(X)) #I에 근접
Output:
[[-0.06451613 -0.16129032 0.4516129 ]
[ 0.29032258 0.22580645 -0.03225806]
[ 0.16129032 -0.09677419 -0.12903226]]
[[ 1.00000000e+00 -6.93889390e-17 5.55111512e-17]
[ 1.11022302e-16 1.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 1.38777878e-17 1.00000000e+00]]
Error : numpy.linalg.LinAlgError: Singular matrix 발생한다면 역행렬이 존재하지 않는다는 에러이다.
유사 역행렬 (무어-펜로즈 역행렬)
- 역행렬을 계산할 수 없을 때 사용하는 방법이다.
- 역행렬 조건과 다르게 행과 열의 숫자가 달라도 된다.
- n차원에서 m차원 공간으로 보낸다.
- 행, 열의 대소 관계에 따라 계산 순서가 다르다!!
- 그리고 행렬과 유사 역행렬의 행렬곱의 순서에 따라 항등 행렬이 성립한다.
import numpy as np
Y = np.array([[1,2,3],[-1,2,-4]])
print(np.linalg.pinv(Y))
print(np.linalg.pinv(Y) @ Y) #I에 근접
유사 역행렬 응용
1. 연립방정식 풀기
- n <= m 인 경우로 식이 변수 개수보다 작거나 같아야 한다.
2. 선형 회귀식 찾기
- n >=m 인 경우로 데이터가 변수 개수보다 많거나 같아야 한다. (자주 볼 수 있는 경우)
- 연립방정식과 달리 행이 더 크므로 방정식을 푸는 건 불가능하기 때문에 L2노름을 최소화하는 경우를 찾는다.
ex) Xβ = y (y의 근사값, y L2 노름의 최소화)
선형 회귀식에서 sklearn의 LinearRegression과 같은 방식으로 계산하지만 결과가 다르다
왜냐하면 sklearn은 y절편의 항을 자동으로 계산해주기 때문이다.
같은 결과를 가져오려면 y절편의 항을 직접 추가해야 한다.
y = ax_1 + bx_2 + c라는 수식이 주어졌을 때 c를 절편인데, 이를 내적으로 표현하자면 (x_1, x_2, 1)과 (a, b, c)의 내적으로 볼 수 있어
-> 유사 역행렬을 구하기 전에 y절편에 해당하는 값에 1을 추가한다.
회고
행렬을 사용하는 의미를 이해하고, 역행렬을 계산할 수 없을 때 유사 역행렬을 사용한다는 것을 알았다.
역행렬을 numpy로 계산하는 방법을 알았지만 직접 계산하는 방법은 까먹었기에.. 복습할 예정이다!
유사 역행렬을 구할 때 행과 열의 수에 따라 계산 방법의 차이가 있어 조심해야 될 것 같다. 그리고 numpy의 append함수가 잘 이해가 안 된다..!!!! 개념은 알겠는데 예제를 따라 하니 에러가 나는데ㅜㅜ 오늘 안으로 해결해 봐야겠다!