벡터화

suhan cho·2022년 5월 18일
0

백터화

코딩에서 for loop을 제거하는 방법

로지스틱 회귀 함수 z=wX + b에서, non-vectorized했을 경우

vertorization vs non-vectorization

import numpy as np
import time

a = np.random.rand(1000000)
b = np.random.rand(1000000)

#vectorization
tic = time.time()
c = np.dot(a,b)
toc = time.time()
print(c)
print("vectorized " + str(1000*(toc-tic))+"ms")

# non-vectorization
c = 0
tic = time.time()
for i in range(1000000):
    c += a[i] * b[i]
toc = time.time()

print('-'*10)
print(c)
print("For loop: " +str(1000*(toc-tic))+"ms")

for loop구문지양

for loop없이 처리가능 한지 확인하기

  • u = Av에 대해 계산하게 되면
    non-vectorized: for-loop 2번사용
    vectorized: np.dot()

로지스틱 회귀 도함수

  • 로지스틱 회귀에서 도함수를 구하는 공식
  • 이를 파이썬의 내장함수(np.zeros)를 활용해서 기존의 2개의 for-loop를 1개로 줄일수 있다

벡터화

  • 벡터화는 행렬을 세로 벡터로 바꾸는 선형변환이다.
  • mxn 행렬 A의 선형화는 vec(A)로 표기하며, 행렬A의 열을 다음 열 위에 쌓아가며 얻을 수 있다.
  • 이러한 벡터화 장점은 for-loop등의 방법을 통해 동일한 결과를 내는 알고리즘을 파이썬에 내장된 함수를 통해 빠르고, 가벼운 효율적인 알고리즘을 구성할 수 있다.

  • 변수 x1,x2,...,xn에 대한 각각의 예측값(a)에 대해서 개별적으로 for-loop를 사용하지 않고, [1 x m]차원으로 1줄로 행렬을 정리할 수 있다

벡터화 경사하강법

브로드케스팅

파이썬 Numpy 라이브러리의 브로드캐스팅은 특정 조건을 만족하면 모양이 다른 배열끼리의 연산도 가능하게 해 주며, 모양이 부족한 부분은 확장하여 연산을 수행할 수 있도록 하는 것을 의미

  • 확장 또는 전파한다는 의미로 브로드캐스팅을 설명하는 가장 간단한 예시는 배열과 스칼라를 계산하는 것

조건

  • 차원의 크기가 1일 떄 가능
    • 두 배열 간의 연산에서 최소한 하나의 배열의 차원이 1이라면(0번 축이든 1번 축이든 1행이든 1열이든) 가능하다
  • 차원의 짝이 맞을 때 가능
    • 차원에 대해 축의 길이가 동일하면 브로드캐스팅이 가능하다

Numpy vector Tips

  • 1차원 array를 만들게 되면, array를 전치(transpose) 해도 동일한 값을 가지게 된다
  • 벡터 간의 계산에 있어서 계산 실수, 오류가 발생
  • 이를 방지하기 위해 1차원 array대신 1차원 벡터를 만드는게 오류를 줄이는데 도움된다.

출처: https://hyunhp.tistory.com/269?category=1000586

profile
안녕하세요

0개의 댓글