수학

프로그래머스 인공지능 데브코스 3기 3주차 Day1

east.__.light 2021. 12. 21. 00:18

이것은 선형대수학 및 그 정의에 사용되는 기본 요소에 관한 것입니다. 또한 Python/Numpy의 중요한 기능을 소개합니다. 예를 통해 벡터 및 행렬을 만드고 사용하는 방법을 설명합니다.

 

기본 요소인 Scalar, Vector, Matrix, Tensor에 대해서 알아봅시다.


그림 1. 스칼라, 벡터, 행렬, 텐서

 

스칼라는 하나의 숫자를 의미합니다.

그림 2. 벡터

벡터는 숫자(스칼라)의 배열입니다.

그림 3. 행렬

행렬은 2차원의 배열입니다.

 

텐서는 2차원 이상의 배열입니다.

 

 

기호 표현은 Deep Learning Book에서 채택한대로 사용하겠습니다.

  • 스칼라는 소문자의 이탈릭체를 사용합니다. (예시: n)
  • 벡터는 소문자의 강조 이탈릭체를 사용합니다. (예시: x)
  • 행렬은 대문자의 강조 이탈릭체를 사용합니다. (예시: X)

 

예제 1. 벡터 표현

np.array를 사용합니다.

import numpy as np # 이 방식의 import를 주로 사용합니다.
x = np.array([1, 2, 3, 4])
x # notebook 기반의 즉시 호출을 사용합니다.
array([1, 2, 3, 4])

 


예제 2-1. 3x2 행렬 만들기

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

 

 

 


배열의 shape(즉, 배열의 dimensions를 뜻함)은 각 차원(dimension)의 값의 수를 알려줍니다. 

예를 들어, 2차원 행렬인 경우 행 수와 열 수를 제공합니다. 
위에서 만든 배열은 Numpy의 array() fuction을 통해서 만들어졌기 때문에 shape에 접근 가능합니다.


예제 2-2-1. 2차원 행렬 확인

shape attribute를 사용하여, A의 행과 열이 각각, 3과 2임을 알 수 있습다.

A.shape
(3,2)  # 3x2 행렬

 

예제 2-2-2. 1차원 행렬 확인

1차원 배열인 벡터는 다음과 같은 shape을 반환합니다.

x.shape
# 예상대로, 배열 x는 하나의 dimension을 갖습니다.
# 따라서 그 숫자는 배열의 길이에 해당합니다.
(4, )

 

예제 3. 벡터의 길이

벡터는 len 기본 함수를 통해서도 길이를 확인할 수 있습니다.

len(x)
4

 

전치행렬(Transpose)

 

그림 4. 전치행렬(Transpose)

위첨자 T를 사용하여 전치행렬은 위와 같이 표기합니다.

그림 5. 행렬 A
그림 6. A의 전치행렬
그림 8. m x n 행렬

m x n 의 shape을 가지는 행렬 A는 n x m의 shape을 가지는 행렬로 됩니다.

그림 9. Vector transpostiion

transposition을 통해서 행 벡터를 열벡터로 변환할 수 있습니다.

그림 10. Square matrix transposition

행과 열의 수가 같은 행렬의 경우에 위와 같습니다.

만약 행과 열의 수가 같지 않더라도 그 개념은 같습니다.

 

기존 행렬 A에 대해 전치행렬 다음을 만족합니다.

 

 

그림 11. 행렬 A에 대한 전치행렬


 

예제 4. 전치행렬 만들기

 

A = np.array([1,2], [3,4], [5,6]) # 3x2 matrix
A
A_t = A.T # can traspose easily by using attribute T
A_t
# A
array([[1, 2],
       [3, 4],
       [5, 6]])
# A_t       
array([[1, 3, 5],
       [2, 4, 6]])

 

print(A.shape)
print(A_t.shape)
(3, 2)
(2, 3)

 

기본 행렬 연산(덧셈)

그림 12. 행렬의 덧셈

동일한 shape의 행렬끼리는 기본적인 연산(+, -, x, %)가 가능합니다.

그림 13. 행렬의 뎃셈 공식


예제 5. 행렬 덧셈

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

# Add matrices A and B
C = A + B
C
# 행렬 A
array([[1, 2],
       [3, 4],
       [5, 6]])
# 행렬 B
array([[2, 5],
       [7, 4],
       [4, 3]])

# 행렬 C
array([[ 3,  7],
       [10,  8],
       [ 9,  9]])

 

예제 6. 행렬에 스칼라 더하기

그림 14. 스칼라 덧셈

 

행렬과 스칼라의 덧셈은, 모든 원소에 스칼라를 더하는 것과 같습니다

 

 

# Exemple: Add 4 to the matrix A
D = A+4
D
array([[ 5,  6],
       [ 7,  8],
       [ 9, 10]])

브로드캐스팅(Broadcasting)

Numpy는 다른 shape의 배열들 간 연산을 처리 할 수 있습니다. 더 작은 shape의 배열은 더 큰 것의 shape과 일치하도록 확장됩니다. 이브로드캐스팅 작업은 numpy의 벡터관련 연산들과 마찬가지로 C언어에 의해서 처리되기 때문에 빠르게 처리된다.

 

사실, 예제 6에서 브로드캐스팅을 사용했습니다. 스칼라는 다음과 같은 모양의 배열로 변환되었습니다. 

그림 15. 확장 전 행렬 B
그림 16. 확장 후 행렬 B

3 x 2 에다가 3 x 1을 더하는 과정에서 작은 shape을 가지는 3 x 1의 1이 큰 shape을 가지는 3 x 2의 2만큼 확장이 된다.


예제 7. Numpy에서 다른 크기의 행렬 간의 덧셈

A = np.array([[1, 2], [3, 4], [5, 6]]) # 3x2
B = np.array([[2], [4], [6]]) # 3x1
print(A)
print(B)

# Broadcasting
C=A+B
C
# A
array([[1, 2],
       [3, 4],
       [5, 6]])
       
# B
array([[2],
       [4],
       [6]])
       
# C = A + B
array([[ 3,  4],
       [ 7,  8],
       [11, 12]])

 

 

 

 

 

github, "스칼라, 벡터, 행렬, 텐서", https://art28.github.io/blog/linear-algebra-1, (2021, 12, 20)

 

 

'수학' 카테고리의 다른 글

프로그래머스 인공지능 데브코스 3기 3주차 Day2  (0) 2021.12.21