MLOps 부트캠프 by 한경+토스뱅크/Machine Learning

선형대수학 - 행렬

나니니 2024. 8. 6. 22:31

행렬과 벡터 구분행렬이란?

행렬(matrix)은 수를 직사각형의 형태로 나열한 것으로 행렬의 가로줄을 행, 영어로는 row라고하며, 세로줄은 열, 영어로는 column이라고 한다. 
A의 경우 행이 3개 있고 열이 4개 있는데, 이런 걸 3 x 4 행렬 또는 "이 행렬의 차원이 3 x 4다"라고도 한다. 

원소 표기

 m x n인 행렬이 있다면 원소들을 아래처럼 표현할 수 있다.

벡터

벡터도 일종의 행렬로써, 행이 하나밖에 없거나 열이 하나밖에 없는 행렬을 의미한다.

a는 열이 하나만 있으므로 열 벡터라고 하며 b는 행이 하나만 있기 때문에 행 벡터라고 한다. 다만, 열 벡터를 사용하는 경우가 더 많기 때문에, 그냥 벡터라고 하면 열 벡터를 뜻한다. 

벡터의 차원

벡터는 무조건 열이 하나밖에 없거나 행이 하나밖에 없다. 그러므로 벡터의 차원을 이야기할 때는 굳이 몇 x 몇... 이렇게 하지 않고, 원소의 개수를 얘기한다. 즉, a는 5차원의 열 벡터고, b는 4차원의 행 벡터라고 할 수 있다.
그리고 벡터의 원소를 나타낼 때는 숫자 하나만 사용한다. 이에 m 차원의 벡터를 일반화해보면, 아래와 같다. 

 

행렬과 벡터 구분

벡터가 아닌 일반 행렬은 주로 대문자 알파벳으로 나타내고, 벡터는 주로 소문자 알파벳으로 나타낸다. 

행렬 연산

숫자/행렬 스칼라 곱은 *
행렬 덧셈은 +
행렬 곱셈은 @

덧셈

행렬 덧셈은 같은 위치에 있는 원소들끼리 더해 주면 된다.

스칼라곱

행렬과 수를 곱하는 것이다. 

선형대수학에서는 행렬의 원소가 아닌 일반 수를 스칼라라고 하므로 i는 스칼라라고 할 수 있다. 즉, 행렬 A를 스칼라 i와 곱하는 것이기 때문에 스칼라곱이라고 한다.

곱셈

행렬 차원

A와 B를 곱하면, A가 행을 제공하고 B가 열을 제공한다. 결과 행렬의 행 수는 A의 행 수랑 같고, 열 수는 B의 열 수랑 같다. 즉, A의 열 수와 B의 행 수가 동일해야 두 행렬을 곱할 수 있다.

 

조금 더 설명하자면, m x n인 행렬 A와 n x p인 행렬 B를 곱한다고 가정해보자. 이때 A의 열 수와 B의 행 수가 딱 맞아 떨어지기 때문에 두 행렬을 곱할 수 있다. 그리고 곱하면 A의 행 수와 B의 열 수를 따서 m x p 행렬이 결과로 나오게 된다.

교환 법칙 성립 안 함

행렬 곱셈은 일반 수끼리 곱하는 것과 달리 AB ≠ BA 이다.

예를 들어서 A는 2 by 3 행렬이고 B는 3 by 4 행렬이라고 가정해보면 A의 열 수와 B의 행 수가 맞아 떨어지기 때문에 A 곱하기 B를 계산할 수 있다. 

반대로 B 곱하기 A를 하면 B의 열 수와 A의 행 수가 맞지 않기 때문에 이렇게 곱할 수 없게 된다. 

요소별 곱하기(Element-wise Multiplication)

행렬 덧셈 연산과 거의 똑같은 성질을 갖는 연산이다. 

numpy로 요소별 곱하기 하기

import numpy as np

A = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])

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

A * B

#출력값
arrray([0, 2, 6]
       [8, 0, 6]
       [7, 16, 0])

 


전치 행렬

행렬의 열과 행을 바꾼 것을 행렬의 '전치 행렬'이라고 한다. 
A의 전치, 즉 A의 transpose라는 의미에서 A 위에 작은 T를 써서 표기한다. 
행렬과 행렬을 곱할 때, 왼쪽 행렬의 열 수랑 오른쪽 행렬을 행 수가 맞아 떨어져야 한다. 이때, 기존 행렬에서 모양이 맞지 않을 경우 전치 행렬을 사용하여 맞출 수 있다. 

# 전치행렬 만들기
A_transpose = np.transpose(A)
A_transpose = A.T

단위 행렬( identity matrix)

단위 행렬은 'Identity'를 줄인 'I'라는 문자로 항상 표현한다. 아래의 3 by 3 단위 행렬을 보면 알 수 있듯이 단위 행렬은 항상 정사각형의 모양이므로 4 x 4 단위 행렬, 5 x 5 단위 행렬, 6 x 6 단위 행렬... 이런 식으로 사용할 수 있다.

 

단위 행렬의 목적은 수학 계산할 때 어떤 수든 간에 1을 곱하면, 그냥 그 수가 그대로 나오는 것 처럼 선형대수학에서는 단위 행렬이 그 역할을 한다. 아래의 행렬을 보면 기존의 A랑 그냥 완전히 동일하게 나오는데, A * I를 하니까 그대로 A가 나오게 되는 것이다. 

I = np.identity(3)
# 출력값
array([[[1., 0., 0.],
	[0., 1., 0.],
    [0., 0., 1.]])

역행렬(inverse matrix)

예를 들어 10이라는 수가 있으면, 여기에 1/10을 곱해야 1이 나오고 5라는 수가 있으면 1/5을 곱해야 1이 나온다. 이런 식으로 곱했을 때 1이 나오도록 하는 수를 "역수"라고 한다.

비슷한 개념으로, 선형대수학에는 역행렬이 이 역할을 한다. 즉, A에 곱했을 때 단위 행렬 I가 나오도록 하는 행렬을 역행렬이라고 한다. 

# A의 역행렬 구하기
np.linalg.pinv(A) # numpy의 linearalgebra모듈의 pinv함수를 사용

# pinv 함수는 역행렬이 없는 경우, 역행렬과 가장 비슷한 효과를 낼 수 있는 행렬을 만들어줌

# 역행렬 검증
A @ A_inverse
# 출력값 -> 단위행렬이 되면 됨

 

 

예제

import numpy as np

A = np.array([
    [1, -1, 2],
    [3, 2, 2]
])

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

C = np.array([
    [2, -1],
    [-3, 3]
])

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

# 행렬 연산을 result 변수에 저장하세요
result = B.T @ (2*A.T) @ (3*np.linalg.pinv(C)+D.T)

result

 

⭐️ 선형대수학이 머신러닝에 필요한 이유?