본문 바로가기
머신러닝/Numpy

[Numpy] #12 np.dot(), np.matmul() / Dot Product, 내적, 벡터와 매트릭스 연산 기본문법 공부하기 12

by doyou1 2021. 10. 12.
반응형

오늘은 딥러닝에 더 가까워질수있는 내용에 대해 공부해보겠다.

 

기본적으로 미니프로젝트에서 간단하게 공부했던 내적연산과 활성화 함수의 구현과정에 대해 알아보도록 하겠다.

 

 

1. np.dot(), Dot Product

Dot Product에 대해선 아래의 미니프로젝트에서 공부해봤다.

https://doyou-study.tistory.com/49?category=963391 

 

[미니프로젝트] 코사인 유사도를 통한 색추출 및 분석/ Cosine Similarity, Color Extraction / Dot Product, Vect

우리가 이번 포스팅을 통해 이끌어내고 싶은 결과물이다. 왼쪽에서부터 "원본사진", "rgd(255,0,0)=Red", "rgd(0,255,0)=Green", "rgd(0,0,255)=Blue"와 닮은 색상 추출 - 포스팅의 목적 : 이미지에서 특정 rgb의..

doyou-study.tistory.com

내용을 살펴보면,

Dot Product는 "내적", "스칼라곱", "점곰" 등으로 불린다. 중요한 점은 벡터끼리의 연산을 통해 "하나의 스칼라값"을 결과로 얻는다.

 

- 수식

$$ a \cdot b = \sum_{i=1}^n a_i b_i = a_1 b_1 + a_2 b_2 +  \ldots + a_n b_n$$

 

- 실제 연산

$$ a \cdot b = a^T b $$

두 행렬 중 하나를 Transpose한 후

$$\begin{pmatrix}1&2&3\end{pmatrix}\begin{pmatrix}4\\5\\6\\\end{pmatrix} = \begin{pmatrix}1\cdot4 + 2\cdot5 + 3\cdot6\end{pmatrix} = 32(하나의\ Scalar\ Value)$$

 

- 코드 구현

import numpy as np

N = 5
a = np.arange(1, N+1)
b = np.arange(1, N+1)[::-1]

print(a)    # [1 2 3 4 5]
print(b)    # [5 4 3 2 1]

print(a.dot(b)) # 35
print(np.dot(a, b)) # 35

# 실제 연산 과정
dot = 0
for idx in range(N):
    oper = a[idx] * b[idx]
    print(f"{a[idx]} * {b[idx]} = {oper}")
    dot += oper
# 1 * 5 = 5
# 2 * 4 = 8
# 3 * 3 = 9
# 4 * 2 = 8
# 5 * 1 = 5

print(dot)  # 35

위의 수식과 같은 연산은 np.dot()을 이용할 수 있다.

 

Dot Product 연산을 수행하기도 하지만, ndarray.dot()의 경우에는 방정식 연산을 간단히 표현할 수도 있다.

import numpy as np

# y = ax + b
N = 5
x = np.arange(1, N+1)
a = 2
b = 3

y = np.dot(a, x) + b
y_ = x.dot(a) + b
y__ = a*x + b
print(y)    # [ 5  7  9 11 13]
print(y_)   # [ 5  7  9 11 13]
print(y__)  # [ 5  7  9 11 13]

# y = ax^2 + bx + c
N = 5
x = np.arange(1, N+1)
a = 2
b = 3
c = 5

y = np.dot(a, x**2) + np.dot(b, x) + c
y_ = (x**2).dot(a) + x.dot(b) + c
y__ = a*(x**2) + (b*x) + c

print(y)    # [10 19 32 49 70]
print(y_)   # [10 19 32 49 70]
print(y__)  # [10 19 32 49 70]

뭐 가시성이 좋지않다고 보일수도 있는데,

np.dot(), ndarray,dot()과 연산되는 변수가 상수임을 확인하면, 아! 방정식 연산이구나하고 바로 이해할 수 있지않을까? 받아들이는 거에 다르겠으나, 요런식으로도 사용될 수 있다는 점이 중요하겠다.

 

2. np.matmul()

np.matmul()은 매트릭스, 행렬 곱을 수행하는 메소드이다.

 

행렵 곱(Matrix multiplication)은 위키피디아에 잘 설명돼있다.

 

https://en.wikipedia.org/wiki/Matrix_multiplication

 

Matrix multiplication - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Mathematical operation in linear algebra For matrix multiplication, the number of columns in the first matrix must be equal to the number of rows in the second matrix. The result matri

en.wikipedia.org

내 공부를 위해서 살짝 연산과정을 살펴보자면

 

행렬곱 연산과정

행렬곱은 위의 그림과 같이 연산이 진행된다.

연산 과정을 밟아나가다 보면 어떤 식으로 연산이 되고, 왜 행렬 C의 shape이 나오는지 이해할 수 있지만,

 

쉽게 우리가 그동안 배웠던 개념들을 이용해 설명해보자면,

행렬 A와 B의 행렬곱은

A의 을 기준으로 쪼갠 "벡터"

B의 을 기준으로 쪼갠 "벡터"

끼리의 Dot Product의 결과로 갖는다.

 

그때,

행렬 A의 shape : (m, n) * A는 "열"을 기준으로 

행렬 B의 shape : (n, p) * B는 "행"을 기준으로

했으므로

 

A의 "열"이 사라져 (m, + B의 "행"이 사라져 ,p)

A와 B의 행렬곱의 결과인,

행렬 C의 shape: (m ,p)이 된다.

 

요정도로 이해하면 좋겠다.

 

관련 코드를 구현해보자

import numpy as np

m = 3
n = 2
p = 4

a = np.arange(m*n).reshape((m,n))
b = np.arange(n*p).reshape((n,p))

print(a)
# [[0 1]
#  [2 3]
#  [4 5]]
print(b)
# [[0 1 2 3]
#  [4 5 6 7]]
matmul = np.matmul(a, b)
print(matmul)
# [[ 4  5  6  7]
#  [12 17 22 27]
#  [20 29 38 47]]

print(a @ b)
# [[ 4  5  6  7]
#  [12 17 22 27]
#  [20 29 38 47]]

코드의 연산과정을 그려보았다.

행렬곱 연산과정

위 그림과 같이 연산이 된다는 것을 이해하자

np.matmul(a, b)a @ b으로도 간략화될 수 있다는 것도 기억하자

반응형

댓글