AI/Math

[부스트캠프] AI_Math 행렬

밍츠 2022. 9. 22. 13:46

행렬이란?

- 행렬(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함수가 잘 이해가 안 된다..!!!! 개념은 알겠는데 예제를 따라 하니 에러가 나는데ㅜㅜ 오늘 안으로 해결해 봐야겠다!