본문 바로가기

카테고리 없음

파이썬 - step() 함수 구현

나름 열심히 풀어서 올려봅니다.

 

 

문제 PLT12-0005

 

다음 그림과 같이 -10과 10 사이에서 활성화 함수(Step함수) 를 만들어보자.

 

import numpy as np

import matplotlib.pyplot as plt

relu = lambda x: np.maximum(0, np.asarray(1%(x+1), dtype=int))

x = np.linspace(-10.0, 10.0, 100)

y = relu(x)

plt.plot(x, y)

plt.grid()

plt.show()

 

 

 

relu = lambda x: np.maximum(0, (1%x))

nparray일때 조건문을 쓰지 못해서 

np.maximum을 사용해서 0과 각 요소들을 비교해 음수 부분을 해결했고

처음에는 양수 부분은 1%x를 사용해 

x가 1보다 큰 경우 무조건 1이 나오도록 나머지 연산자를 사용했습니다. 

그러나 0<x<1인 경우 

1 % (0.2) 가 0.1999999996과 같은 결과값이 나와 

아래와 같은 결과를 얻게 되었습니다. 

 

 

 

 

원하지 않은 결과값들을 본 결과, 모두 1이하의 요소들이기에 전부 Integer로 바꾸자라는 생각을 했습니다. 

np.asarray라는 nparray의 각 요소를 integer로 바꿔주는 np.asarray 함수를 사용했습니다. 

relu = lambda x: np.maximum(0, np.asarray(1%(x), dtype=int))

그 결과는 아래와 같습니다. 

 

 

 

모두 내림을 하였기에 

1보다 작은 수들은 다 0으로 만들어졌습니다. 

따라서 x축으로 -1만큼 대칭이동하면 결과가 만들어지게 됩니다. 

relu = lambda x: np.maximum(0, np.asarray(1%(x+1), dtype=int))



************

 

지금 보니 나머지 기호를 사용하는 것보다 np.minmum함수를 사용하는 것이 간편해 보여 수정했습니다. 

 

import numpy as np

 

import matplotlib.pyplot as plt

 

 

 

relu = lambda x: np.maximum(0, np.asarray(np.minimum(1, x+1), dtype=int))

 

 

 

x = np.linspace(-10.0, 10.0, 100)

 

y = relu(x)

 

 

 

plt.plot(x, y)

 

 

 

plt.grid()

 

plt.show()

 

 

 

***

 

처음에는 시그모이드 함수에  가우스 기호를 붙이고 +1 을 하면 될 것이라고 생각했는데, 

 

아쉽게도 numpy에는 가우스 기호를 제공하는 모듈이 없었습니다.

 

 

***

 

numpy 모듈에는 조건문을 쓸 수 없지만 

 

비슷하게 np.where라는 함수를 사용할 수 있습니다.

 

 

 

import numpy as np

 

import matplotlib.pyplot as plt

 

step = lambda x: np.where(x >= 0, 1, 0)

 

x = np.linspace(-10.0, 10.0, 100)

 

y = step(x)

 

plt.plot(x, y)

 

plt.grid()

 

plt.show()

 

 

 

생각보다 너무 쉽게 풀리는 문제였지만 열심히 풀었기에 한 번 올려봅니다...