[부스트캠프 AI Tech 5기] Pre-Course : (9) 행렬이 뭐예요?

araseo·2022년 12월 16일
0
post-thumbnail

📖 행렬은 뭔가요?

  • 행렬(matrix)은 벡터를 원소로 가지는 2차원 배열

# numpy 에선 행(row)이 기본 단위입니다.
X = np.array([[1, -2, 3],
			 [7, 5, 0],
             [-2, -1, 2]])
  • 행렬은 행(row)와 열(column)이라는 인덱스(index)를 가짐
  • 행렬의 특정 행(열)을 고정하면 행(열)벡터라 부름
  • 전치행렬(transpose matrix)은 행과 열의 인덱스가 바뀐 행렬을 말함

📖 행렬을 이해하는 방법 (1)

  • 벡터가 공간에서 한 점을 의미한다면 행렬은 여러 점들을 나타냄
  • 행렬의 행벡터 xi 는 i번째 데이터를 의미함
  • 행렬의 xij는 i번째 데이터의 j번째 변수의 값을 말함

📖 행렬의 덧셈, 뺄셈, 성분곱, 스칼라곱

  • 행렬은 벡터를 원소로 가지는 2차원 배열임
  • 행렬끼리 같은 모양을 가지면 덧셈, 뺄셈을 계산할 수 있음

  • 성분곱은 벡터와 똑같음

  • 스칼라 곱도 벡터와 차이가 없음

📖 행렬 곱셈

  • 행렬 곱셈(matrix multiplication)은 i번째 행벡터와 j번째 열벡터 사이의 내적을 성분으로 가지는 행렬을 계산함

X = np.array([[1, -2, 3],
			  [7, 5, 0],
              [-2, -1, 2]])

Y = np.array([[0 ,1],
			  [1, -1],
              [-2, 1]])

# numpy에선 @ 연산을 사용한다
X @ Y
array([[-8,  6],
       [ 5,  2],
       [-5,  1]])

📖 행렬도 내적이 있을까?

  • 넘파이의 np.inner 는 i번째 행벡터와 j번째 행벡터 사이의 내적을 성분으로 가지는 행렬을 계산함
  • 수학에서 말하는 내적과는 다르므로 주의

X = np.array([[1, -2, 3],
			  [7, 5, 0],
              [-2, -1, 2]])

Y = np.array([[0, 1, -1],
			  [1, -1, 0]])

np.inner(X, Y)
array([[-5,  3],
       [ 5,  2],
       [-3, -1]])

📖 행렬을 이해하는 방법 (2)

  • 행렬은 벡터공간에서 사용되는 연산자(operator)로 이해할 수 있음
  • 행렬곱을 통해 벡터를 다른 차원의 공간으로 보낼 수 있음
  • 행렬곱을 통해 패턴을 추출할 수 있고 데이터를 압축할 수도 있음
  • 모든 선형변환(linear transform)은 행렬곱으로 계산할 수 있음

📖 역행렬 이해하기

  • 어떤 행렬 A의 연산을 거꾸로 되돌리는 행렬을 역행렬(inverse matrix)이라 부르고 A-1이라 표기함
  • 역행렬은 행과 열 숫자가 같고 행렬식(determinant)이 0이 아닌 경우에만 계산할 수 있음

X = np.array([[1, -2, 3],
			  [7, 5, 0],
              [-2, -1, 2]])

np.linalg.inv(X)
array([[ 0.21276596,  0.0212766 , -0.31914894],
       [-0.29787234,  0.17021277,  0.44680851],
       [ 0.06382979,  0.10638298,  0.40425532]])
X @ np.linalg.inv(X)
array([[ 1.00000000e+00,  0.00000000e+00,  0.00000000e+00],
       [ 0.00000000e+00,  1.00000000e+00,  0.00000000e+00],
       [-5.55111512e-17,  0.00000000e+00,  1.00000000e+00]])
  • 만일 역행렬을 계산할 수 없다면 유사역행렬(pseudo-inverse) 또는 무어-펜로즈(Moore-Penrose) 역행렬 A+을 이용함

Y = np.array([[0, 1],
			  [1, -1],
              [-2, 1]])

np.linalg.pinv(Y)
array([[ 5.00000000e-01,  1.11022302e-16, -5.00000000e-01],
       [ 8.33333333e-01, -3.33333333e-01, -1.66666667e-01]])
np.linalg.pinv(Y) @ Y
array([[ 1.00000000e+00, -2.22044605e-16],
       [ 1.11022302e-16,  1.00000000e+00]])

📖 응용 1: 연립방정식 풀기

  • np.linalg.pinv 를 이용하면 연립방정식의 해를 구할 수 있다.

📖 응용 2: 선형회귀분석

  • np.linalg.pinv 를 이용하면 데이터를 선형모델(linear model)로 해석하는 선형회귀식을 찾을 수 있다.

# Scikit Learn 을 활용한 회귀분석
from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(X, y)
y_test = model.predict(x_test)

# Moore-Penrose 역행렬
X_ = np.array([np.append(x,[1]) for x in X]) # intercept 항 추가
beta = np.linalg.pinv(X_) @ y
y_test = np.append(x, [1]) @ beta

<이 게시물은 임성빈 교수님의 '행렬은 뭔가요?' 강의 자료를 참고하여 작성되었습니다.>

본 포스트의 학습 내용은 [부스트캠프 AI Tech 5기] Pre-Course 강의 내용을 바탕으로 작성되었습니다.
부스트캠프 AI Tech 5기 Pre-Course는 일정 기간 동안에만 운영되는 강의이며,
AI 관련 강의를 학습하고자 하시는 분들은 부스트코스 AI 강좌에서 기간 제한 없이 학습하실 수 있습니다.
(https://www.boostcourse.org/)

profile
AI를 공부하고 있는 학생입니다:)

0개의 댓글