2. 해외선물/2-2. 해외선물 알고리즘 연구

(해외선물 자동매매 알고리즘) (1) 역전파(backpropagation) 구현을 위한 numpy 이해하기

봄이오네 2024. 2. 7. 08:01
반응형

 

목 차
1. 들어가며
2. 코드설명

   1) y_train = (x_train[:, 0])을 출력

   2) y_train = (x_train[:, 1])을 출력

   3) y_train = (x_train[:, 0] != x_train[:, 1]) 의미

   4) astype(int)

3. 마치며

 

1. 들어가며

딥러닝을 위한 역전파(backpropagation) 코드 이해를 위해서는 numpy에 대한 이해가 필요하다. 하아~~ 깊은 한숨이 나오는건, 필자는 그동안 평균을 구하는 numpy.mean()이나 표준편차를 구하는 numpy.std() 2개에 익숙해져서, numpy 배열이 나오니 상당히 헤매게 된다. ㅠㅠ
 
이 글에서는 역전파 구현 전 이해해야할 numpy의 개념 중 배열에 대해 익숙해질 필요가 있다.
 


2. 코드설명

아래의 코드는 배열함수 형태의 numpy 라이브러리이다.

import numpy as np

x_train = np.random.randint(0, 2, (5, 2))

print(x_train)
print(type(x_train))

# (결과값)
# [[0 0]
#  [0 1]
#  [0 0]
#  [0 0]
#  [1 1]]
# <class 'numpy.ndarray'>

y_train = (x_train[:, 0] != x_train[:, 1]).astype(int)

print(y_train)
print(type(y_train))

# (결과값)
# [0 1 0 0 0]
# <class 'numpy.ndarray'>

 
 
x_train = np.random.randint(0,2, (52))는 0이상 2미만의 숫자(즉, 0,1) 중 5개를 출력하되, 2쌍씩 출력하라.
np.random.randint는 어느 정도 이해할 수 있을것 같다.
 
문제는 y_train이다. ㅠㅠ
y_train = (x_train[:, 0] != x_train[:, 1]).astype(int)를 분석해보자. 상당히 어렵구나...
 
 

1) y_train = (x_train[:, 0])을 출력해보자.

print(x_print)를 실행하면 [[0 0] [0 0] [1 1] [0 1] [0 1]]의 5개가 랜덤으로 출력된다.
print(y_train)을 실행하면, 랜덤으로 출력된 x_train의 첫번째 값으로 [0  0  1  0  0]이 출력된다.
 
y_train[:, 0]을 분석해보자. x_train의 모든(:) 요소에 대해, 첫번째(0) 요소를 추출하라는 뜻이다.
 

 

2) y_train = (x_train[:, 1])을 출력해보자.

y_train[:1]은 x_train의 모든(:) 요소에 대해, 두번째(1) 요소(0,0,0,1,1)를 추출하라는 뜻이다.

import numpy as np

x_train = np.random.randint(0, 2, (5, 2))
print(x_train)

# (결과값)
# [[0 0]
#  [0 0]
#  [1 0]
#  [1 1]
#  [0 1]]

# y_train = (x_train[:, 0] != x_train[:, 1]).astype(int)

y_train = (x_train[:, 1])

print(y_train)

# (결과값)
# [0 0 0 1 1]

 

3) y_train = (x_train[:, 0] != x_train[:, 1])

y_train = (x_train[:, 0] != x_train[:, 1]) 코드를 천천히 분석해보자. 어렵다. ㅠ

  • x_train[:, 0] : x_train 변수 내 모든 요소 중 첫번째 항목을 추출하라
  • x_train[:, 1] : x_train 변수 내 모든 요소 중 두번째 항목을 추출하라

즉, y_train = (x_train[:, 0] != x_train[:, 1])는 "첫번째 항목 != 두번째 항목"이 다른 경우를 말하는 것이다.
 

import numpy as np

x_train = np.random.randint(0, 2, (5, 2))
print(x_train)

# (결과값)
# [[1 1]
#  [1 0]
#  [0 0]
#  [0 0]
#  [1 0]]

y_train = (x_train[:, 0] != x_train[:, 1]) # .astype(int)

print(y_train)

# (결과값)
# [False  True False False  True]

 
y_train = (x_train[:, 0] != x_train[:, 1])을 출력해보자. 15줄에서 결과값이 [False True False False True]로 출력되는 것을 확인할 수 있다.

  • x_train[:, 0] 출력값은 [1 1 0 0 1]이고 (7줄~11줄의 첫번째 항목)
  • x_train[:, 1] 출력값은 [1 0 0 0 1]이이다. (7줄~11줄의 두번째 항목)

같지 않은 경우(!=)를 말한다. 즉, 각각의 요소가 같지않은 경우 True, 같은 경우 False가 출력된다.

첫번째 항목의 첫번째 요소(1)과 두번째 항목의 첫번째 요소(1)은 같으므로 False가 출력된다. 두번째 경우를 확인하자. 첫번째 항목의 두번째 요소(1)과 두번째 항목의 두번째 요소(0)이 다르므로 True가 출력된다. 마지막으로 세번째 경우를 확인하자. 첫번째 항목의 세번째 요소(0)와 두번째 항목의 세번째 요소(0)은 같으므로 False가 출력된다.
 

4) astype(int)

astype 모듈은 데이터 프레임(df)이나 시리즈의 자료형을 변환하는 함수이다. 여기서는 정수형(int)으로 변환한다.

import numpy as np

x_train = np.random.randint(0, 2, (5, 2))
print(x_train)

# (결과값)
# [[1 0]
#  [0 0]
#  [0 0]
#  [0 1]
#  [1 0]]

y_train = (x_train[:, 0] != x_train[:, 1]) # .astype(int)
print(y_train)

# (결과값)
# [ True False False  True  True]

y_train = (x_train[:, 0] != x_train[:, 1]).astype(int)
print(y_train)

# (결과값)
# [1 0 0 1 1]

 
14줄의 결과(17줄) 및 20줄의 결과(23줄)을 각각 확인하자.

  • 14줄의 결과(17줄) : [True False False True True]
  • 20줄의 결과(23줄) : [1       0        0        1      1     ]

14줄의 결과를 19줄에서 astype(int)를 붙여 정수화(int)한 것을 확인할 수 있다.
 


3. 마치며

이번기회를 통해 numpy 라이브러리의 활용에 대한 이해할 수 있었다. numpy를 통한 배열은 그 개념이 낯설어서인지 생각보다 내용이 어려웠다. 그래도 한줄의 코드를 쪼개서 이해를 하니 머리 속에서 조금은 감을 잡을 수 있었다.
 
이번글에서는 numpy를 통한 정수화에 대해 알아보았다. 다음글에서는 역전파(backpropagation)에 관해 알아보자.
 
 

반응형